esphome 2025.6.3__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 (599) 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 +8 -2
  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.h +1 -0
  185. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  186. esphome/components/http_request/update/http_request_update.cpp +28 -9
  187. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  188. esphome/components/hydreon_rgxx/sensor.py +1 -1
  189. esphome/components/i2c/__init__.py +23 -11
  190. esphome/components/i2c/i2c_bus.h +8 -1
  191. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  192. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  193. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  194. esphome/components/i2c_device/i2c_device.h +0 -1
  195. esphome/components/i2s_audio/__init__.py +2 -10
  196. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  197. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  198. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  199. esphome/components/iaqcore/iaqcore.h +0 -2
  200. esphome/components/image/__init__.py +123 -24
  201. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  202. esphome/components/ina219/ina219.cpp +7 -0
  203. esphome/components/ina219/ina219.h +1 -0
  204. esphome/components/ina260/ina260.h +0 -2
  205. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  206. esphome/components/inkplate6/display.py +15 -0
  207. esphome/components/inkplate6/inkplate.cpp +2 -2
  208. esphome/components/integration/integration_sensor.h +0 -1
  209. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  210. esphome/components/internal_temperature/sensor.py +0 -26
  211. esphome/components/interval/interval.h +0 -2
  212. esphome/components/ld2410/button/__init__.py +3 -3
  213. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  214. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  215. esphome/components/ld2410/ld2410.cpp +430 -261
  216. esphome/components/ld2410/ld2410.h +44 -146
  217. esphome/components/ld2410/number/__init__.py +2 -2
  218. esphome/components/ld2410/sensor.py +1 -1
  219. esphome/components/ld2410/switch/__init__.py +1 -1
  220. esphome/components/ld2420/ld2420.cpp +196 -100
  221. esphome/components/ld2420/ld2420.h +46 -118
  222. esphome/components/ld2420/number/__init__.py +2 -2
  223. esphome/components/ld2420/sensor/__init__.py +6 -2
  224. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  225. esphome/components/ld2450/button/__init__.py +3 -3
  226. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  227. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  228. esphome/components/ld2450/ld2450.cpp +384 -232
  229. esphome/components/ld2450/ld2450.h +60 -69
  230. esphome/components/ld2450/switch/__init__.py +1 -1
  231. esphome/components/ledc/ledc_output.cpp +1 -63
  232. esphome/components/libretiny/__init__.py +4 -3
  233. esphome/components/libretiny/const.py +5 -0
  234. esphome/components/libretiny/generate_components.py +1 -0
  235. esphome/components/libretiny/helpers.cpp +35 -0
  236. esphome/components/libretiny/lt_component.cpp +5 -3
  237. esphome/components/light/__init__.py +4 -2
  238. esphome/components/light/addressable_light.h +3 -3
  239. esphome/components/light/light_call.cpp +180 -243
  240. esphome/components/light/light_call.h +72 -20
  241. esphome/components/light/light_color_values.h +14 -14
  242. esphome/components/light/light_state.h +15 -13
  243. esphome/components/light/transformers.h +2 -2
  244. esphome/components/ln882x/__init__.py +52 -0
  245. esphome/components/ln882x/boards.py +285 -0
  246. esphome/components/lock/__init__.py +5 -2
  247. esphome/components/logger/__init__.py +40 -3
  248. esphome/components/logger/logger.cpp +47 -12
  249. esphome/components/logger/logger.h +80 -49
  250. esphome/components/logger/logger_esp32.cpp +3 -3
  251. esphome/components/lps22/__init__.py +0 -0
  252. esphome/components/lps22/lps22.cpp +75 -0
  253. esphome/components/lps22/lps22.h +27 -0
  254. esphome/components/lps22/sensor.py +58 -0
  255. esphome/components/ltr390/ltr390.h +0 -1
  256. esphome/components/ltr501/ltr501.h +0 -1
  257. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  258. esphome/components/lvgl/__init__.py +1 -1
  259. esphome/components/lvgl/schemas.py +66 -6
  260. esphome/components/lvgl/styles.py +24 -16
  261. esphome/components/lvgl/widgets/__init__.py +12 -2
  262. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  263. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  264. esphome/components/max9611/max9611.h +0 -1
  265. esphome/components/mcp23016/__init__.py +1 -1
  266. esphome/components/mcp23xxx_base/__init__.py +1 -1
  267. esphome/components/mcp4461/__init__.py +1 -1
  268. esphome/components/mcp4461/output/__init__.py +3 -2
  269. esphome/components/mcp9600/mcp9600.h +0 -2
  270. esphome/components/md5/md5.cpp +3 -3
  271. esphome/components/md5/md5.h +1 -6
  272. esphome/components/mdns/__init__.py +22 -11
  273. esphome/components/media_player/__init__.py +4 -3
  274. esphome/components/micro_wake_word/__init__.py +1 -5
  275. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  276. esphome/components/microphone/microphone.cpp +7 -9
  277. esphome/components/microphone/microphone.h +0 -2
  278. esphome/components/mipi_spi/display.py +1 -0
  279. esphome/components/mmc5603/mmc5603.cpp +1 -1
  280. esphome/components/modbus/modbus.cpp +33 -15
  281. esphome/components/modbus/modbus.h +9 -0
  282. esphome/components/modbus_controller/__init__.py +42 -10
  283. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  284. esphome/components/modbus_controller/modbus_controller.h +61 -7
  285. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  286. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  287. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  288. esphome/components/mqtt/__init__.py +16 -0
  289. esphome/components/mqtt/mqtt_backend.h +2 -1
  290. esphome/components/mqtt/mqtt_backend_esp32.cpp +126 -45
  291. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  292. esphome/components/mqtt/mqtt_client.cpp +15 -9
  293. esphome/components/mqtt/mqtt_client.h +8 -3
  294. esphome/components/ms8607/ms8607.h +0 -1
  295. esphome/components/neopixelbus/light.py +4 -1
  296. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  297. esphome/components/network/__init__.py +4 -1
  298. esphome/components/network/ip_address.h +1 -0
  299. esphome/components/nextion/__init__.py +16 -0
  300. esphome/components/nextion/base_component.py +1 -0
  301. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  302. esphome/components/nextion/display.py +14 -4
  303. esphome/components/nextion/nextion.cpp +166 -101
  304. esphome/components/nextion/nextion.h +84 -53
  305. esphome/components/nextion/nextion_commands.cpp +11 -10
  306. esphome/components/nextion/nextion_component.cpp +28 -28
  307. esphome/components/nextion/nextion_component.h +53 -18
  308. esphome/components/nextion/nextion_component_base.h +3 -0
  309. esphome/components/nextion/nextion_upload.cpp +36 -0
  310. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  311. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  312. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  313. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  314. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  315. esphome/components/nfc/nfc.cpp +3 -22
  316. esphome/components/nfc/nfc.h +3 -3
  317. esphome/components/number/__init__.py +5 -2
  318. esphome/components/online_image/__init__.py +5 -0
  319. esphome/components/online_image/online_image.cpp +6 -2
  320. esphome/components/online_image/online_image.h +4 -1
  321. esphome/components/opentherm/opentherm.cpp +7 -12
  322. esphome/components/openthread/__init__.py +47 -40
  323. esphome/components/openthread/const.py +1 -0
  324. esphome/components/openthread/openthread_esp.cpp +27 -5
  325. esphome/components/opt3001/__init__.py +0 -0
  326. esphome/components/opt3001/opt3001.cpp +122 -0
  327. esphome/components/opt3001/opt3001.h +27 -0
  328. esphome/components/opt3001/sensor.py +35 -0
  329. esphome/components/ota/__init__.py +17 -0
  330. esphome/components/ota/ota_backend.h +27 -1
  331. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  332. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  333. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  334. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  336. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  338. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  339. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  340. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  341. esphome/components/packages/__init__.py +5 -2
  342. esphome/components/packet_transport/binary_sensor.py +61 -4
  343. esphome/components/packet_transport/packet_transport.cpp +31 -1
  344. esphome/components/packet_transport/packet_transport.h +11 -5
  345. esphome/components/pcf8574/__init__.py +1 -1
  346. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  347. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  348. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  349. esphome/components/pmsa003i/pmsa003i.h +0 -1
  350. esphome/components/pmsx003/pmsx003.h +0 -1
  351. esphome/components/pn7150/pn7150.cpp +7 -7
  352. esphome/components/pn7150/pn7150.h +0 -1
  353. esphome/components/pn7160/pn7160.cpp +7 -7
  354. esphome/components/pn7160/pn7160.h +0 -1
  355. esphome/components/preferences/syncer.h +2 -0
  356. esphome/components/prometheus/prometheus_handler.h +1 -1
  357. esphome/components/psram/psram.cpp +0 -20
  358. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  359. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  360. esphome/components/pulse_width/pulse_width.h +0 -1
  361. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  362. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  363. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  364. esphome/components/qr_code/__init__.py +13 -10
  365. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  366. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  367. esphome/components/rc522/rc522.h +0 -1
  368. esphome/components/rdm6300/rdm6300.h +0 -2
  369. esphome/components/remote_base/__init__.py +7 -5
  370. esphome/components/remote_base/remote_base.cpp +24 -21
  371. esphome/components/remote_base/remote_base.h +3 -26
  372. esphome/components/remote_receiver/__init__.py +40 -46
  373. esphome/components/remote_receiver/remote_receiver.h +4 -18
  374. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  375. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  376. esphome/components/remote_transmitter/__init__.py +42 -43
  377. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  378. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  379. esphome/components/resistance/resistance_sensor.h +0 -1
  380. esphome/components/rp2040/__init__.py +1 -0
  381. esphome/components/rp2040/helpers.cpp +55 -0
  382. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  383. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  384. esphome/components/rtttl/__init__.py +4 -4
  385. esphome/components/rtttl/rtttl.cpp +10 -1
  386. esphome/components/ruuvitag/ruuvitag.h +0 -1
  387. esphome/components/safe_mode/safe_mode.cpp +2 -0
  388. esphome/components/safe_mode/safe_mode.h +4 -1
  389. esphome/components/scd30/scd30.h +0 -1
  390. esphome/components/scd30/sensor.py +2 -2
  391. esphome/components/scd4x/scd4x.cpp +61 -54
  392. esphome/components/scd4x/scd4x.h +17 -15
  393. esphome/components/scd4x/sensor.py +4 -4
  394. esphome/components/script/script.h +0 -2
  395. esphome/components/sdp3x/sensor.py +1 -1
  396. esphome/components/select/__init__.py +5 -2
  397. esphome/components/sen5x/sen5x.h +0 -1
  398. esphome/components/senseair/senseair.h +0 -1
  399. esphome/components/sensor/__init__.py +4 -2
  400. esphome/components/sensor/filter.cpp +1 -1
  401. esphome/components/sensor/sensor.cpp +12 -6
  402. esphome/components/sensor/sensor.h +13 -5
  403. esphome/components/servo/servo.h +0 -1
  404. esphome/components/sfa30/sfa30.h +0 -1
  405. esphome/components/sgp30/sgp30.h +0 -1
  406. esphome/components/sgp4x/sgp4x.h +0 -1
  407. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  408. esphome/components/sht4x/sht4x.h +0 -1
  409. esphome/components/sm300d2/sm300d2.h +0 -2
  410. esphome/components/smt100/sensor.py +8 -4
  411. esphome/components/smt100/smt100.cpp +5 -5
  412. esphome/components/smt100/smt100.h +3 -3
  413. esphome/components/sn74hc595/__init__.py +1 -1
  414. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  415. esphome/components/sntp/sntp_component.cpp +9 -3
  416. esphome/components/sntp/time.py +2 -0
  417. esphome/components/socket/__init__.py +17 -0
  418. esphome/components/spi/__init__.py +27 -6
  419. esphome/components/spi/spi.cpp +3 -2
  420. esphome/components/spi/spi.h +9 -3
  421. esphome/components/spi/spi_arduino.cpp +3 -5
  422. esphome/components/spi/spi_esp_idf.cpp +40 -21
  423. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  424. esphome/components/sps30/sps30.h +0 -1
  425. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  426. esphome/components/st7701s/st7701s.cpp +0 -4
  427. esphome/components/status/status_binary_sensor.h +0 -2
  428. esphome/components/substitutions/__init__.py +76 -19
  429. esphome/components/substitutions/jinja.py +99 -0
  430. esphome/components/sun/sun.cpp +3 -4
  431. esphome/components/switch/__init__.py +5 -2
  432. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  433. esphome/components/sx126x/__init__.py +317 -0
  434. esphome/components/sx126x/automation.h +62 -0
  435. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  436. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  437. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  438. esphome/components/sx126x/sx126x.cpp +523 -0
  439. esphome/components/sx126x/sx126x.h +140 -0
  440. esphome/components/sx126x/sx126x_reg.h +163 -0
  441. esphome/components/sx127x/__init__.py +325 -0
  442. esphome/components/sx127x/automation.h +62 -0
  443. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  444. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  445. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  446. esphome/components/sx127x/sx127x.cpp +498 -0
  447. esphome/components/sx127x/sx127x.h +128 -0
  448. esphome/components/sx127x/sx127x_reg.h +295 -0
  449. esphome/components/syslog/esphome_syslog.cpp +5 -3
  450. esphome/components/syslog/esphome_syslog.h +1 -1
  451. esphome/components/tca9555/__init__.py +1 -1
  452. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  453. esphome/components/text/__init__.py +5 -2
  454. esphome/components/text_sensor/__init__.py +5 -2
  455. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  456. esphome/components/thermostat/thermostat_climate.h +43 -39
  457. esphome/components/time/__init__.py +16 -2
  458. esphome/components/time/real_time_clock.cpp +4 -0
  459. esphome/components/time/real_time_clock.h +5 -1
  460. esphome/components/tlc5971/tlc5971.cpp +4 -1
  461. esphome/components/tmp1075/tmp1075.h +0 -2
  462. esphome/components/tof10120/tof10120_sensor.h +0 -1
  463. esphome/components/tormatic/tormatic_cover.h +0 -1
  464. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  465. esphome/components/tsl2591/tsl2591.cpp +1 -1
  466. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  467. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  468. esphome/components/tx20/tx20.cpp +2 -2
  469. esphome/components/uart/__init__.py +18 -0
  470. esphome/components/uart/uart_component_esp_idf.cpp +0 -4
  471. esphome/components/update/__init__.py +5 -2
  472. esphome/components/update/update_entity.h +8 -0
  473. esphome/components/usb_host/__init__.py +5 -2
  474. esphome/components/valve/__init__.py +5 -2
  475. esphome/components/vbus/vbus.h +0 -1
  476. esphome/components/veml3235/veml3235.h +0 -1
  477. esphome/components/veml7700/veml7700.h +0 -1
  478. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  479. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  480. esphome/components/watchdog/watchdog.cpp +0 -4
  481. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  482. esphome/components/web_server/__init__.py +34 -19
  483. esphome/components/web_server/ota/__init__.py +32 -0
  484. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  485. esphome/components/web_server/ota/ota_web_server.h +26 -0
  486. esphome/components/web_server/web_server.cpp +305 -427
  487. esphome/components/web_server/web_server.h +33 -23
  488. esphome/components/web_server/web_server_v1.cpp +4 -5
  489. esphome/components/web_server_base/__init__.py +5 -2
  490. esphome/components/web_server_base/web_server_base.cpp +2 -94
  491. esphome/components/web_server_base/web_server_base.h +5 -25
  492. esphome/components/web_server_idf/multipart.cpp +254 -0
  493. esphome/components/web_server_idf/multipart.h +86 -0
  494. esphome/components/web_server_idf/utils.cpp +32 -0
  495. esphome/components/web_server_idf/utils.h +10 -0
  496. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  497. esphome/components/web_server_idf/web_server_idf.h +11 -10
  498. esphome/components/wiegand/wiegand.cpp +2 -2
  499. esphome/components/wifi/__init__.py +18 -0
  500. esphome/components/wifi/wifi_component.cpp +17 -22
  501. esphome/components/wifi/wifi_component.h +27 -23
  502. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  503. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  504. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  505. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  506. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  507. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  508. esphome/components/wireguard/__init__.py +2 -11
  509. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  510. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  511. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  512. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  513. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  514. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  515. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  516. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  517. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  518. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  519. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  520. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  521. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  522. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  523. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  524. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  525. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  526. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  527. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  528. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  529. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  530. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  531. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  532. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  533. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  534. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  535. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  536. esphome/components/zyaura/zyaura.h +0 -1
  537. esphome/config.py +88 -22
  538. esphome/config_helpers.py +74 -1
  539. esphome/config_validation.py +12 -1
  540. esphome/const.py +65 -10
  541. esphome/core/__init__.py +18 -2
  542. esphome/core/application.cpp +163 -10
  543. esphome/core/application.h +145 -165
  544. esphome/core/area.h +19 -0
  545. esphome/core/automation.h +58 -9
  546. esphome/core/color.cpp +3 -5
  547. esphome/core/color.h +16 -16
  548. esphome/core/component.cpp +151 -18
  549. esphome/core/component.h +98 -4
  550. esphome/core/component_iterator.cpp +7 -7
  551. esphome/core/component_iterator.h +9 -7
  552. esphome/core/config.py +155 -6
  553. esphome/core/controller.cpp +4 -2
  554. esphome/core/controller.h +1 -1
  555. esphome/core/datatypes.h +2 -2
  556. esphome/core/defines.h +17 -2
  557. esphome/core/device.h +20 -0
  558. esphome/core/entity_base.cpp +20 -15
  559. esphome/core/entity_base.h +76 -0
  560. esphome/core/entity_helpers.py +162 -1
  561. esphome/core/event_pool.h +81 -0
  562. esphome/core/helpers.cpp +75 -230
  563. esphome/core/helpers.h +164 -104
  564. esphome/core/lock_free_queue.h +151 -0
  565. esphome/core/log.cpp +2 -2
  566. esphome/core/log.h +2 -0
  567. esphome/core/optional.h +5 -0
  568. esphome/core/ring_buffer.cpp +2 -2
  569. esphome/core/scheduler.cpp +278 -103
  570. esphome/core/scheduler.h +157 -17
  571. esphome/core/time.cpp +5 -5
  572. esphome/core/time.h +5 -5
  573. esphome/cpp_generator.py +17 -0
  574. esphome/cpp_helpers.py +0 -22
  575. esphome/cpp_types.py +3 -1
  576. esphome/dashboard/entries.py +1 -1
  577. esphome/dashboard/util/text.py +5 -21
  578. esphome/dashboard/web_server.py +9 -1
  579. esphome/helpers.py +47 -0
  580. esphome/loader.py +15 -1
  581. esphome/pins.py +14 -8
  582. esphome/wizard.py +16 -3
  583. esphome/writer.py +21 -3
  584. esphome/yaml_util.py +0 -2
  585. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
  586. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +591 -531
  587. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  588. esphome/components/esp32_ble/queue.h +0 -85
  589. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  590. esphome/components/esp32_hall/esp32_hall.h +0 -23
  591. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  592. esphome/components/ld2410/button/reset_button.cpp +0 -9
  593. esphome/components/ld2450/button/reset_button.cpp +0 -9
  594. esphome/components/openthread/tlv.py +0 -65
  595. /esphome/{dashboard/enum.py → enum.py} +0 -0
  596. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/WHEEL +0 -0
  597. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  598. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
  599. {esphome-2025.6.3.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
@@ -65,6 +65,7 @@ enum Protocol {
65
65
  PROTOCOL_AIRWAY,
66
66
  PROTOCOL_BGH_AUD,
67
67
  PROTOCOL_PANASONIC_ALTDKE,
68
+ PROTOCOL_PHILCO_PHS32,
68
69
  PROTOCOL_VAILLANTVAI8,
69
70
  PROTOCOL_R51M,
70
71
  };
@@ -18,7 +18,6 @@ class HONEYWELLABP2Sensor : public PollingComponent, public i2c::I2CDevice {
18
18
  void set_temperature_sensor(sensor::Sensor *temperature_sensor) { this->temperature_sensor_ = temperature_sensor; };
19
19
  void loop() override;
20
20
  void update() override;
21
- float get_setup_priority() const override { return setup_priority::DATA; };
22
21
  void dump_config() override;
23
22
 
24
23
  void read_sensor_data();
@@ -41,6 +41,7 @@ CONFIG_SCHEMA = cv.All(
41
41
  async def to_code(config):
42
42
  cg.add_build_flag("-DUSE_HOST")
43
43
  cg.add_define("USE_ESPHOME_HOST_MAC_ADDRESS", config[CONF_MAC_ADDRESS].parts)
44
- cg.add_build_flag("-std=c++17")
44
+ cg.add_build_flag("-std=gnu++20")
45
45
  cg.add_define("ESPHOME_BOARD", "host")
46
46
  cg.add_platformio_option("platform", "platformio/native")
47
+ cg.add_platformio_option("lib_ldf_mode", "off")
@@ -0,0 +1,57 @@
1
+ #include "esphome/core/helpers.h"
2
+
3
+ #ifdef USE_HOST
4
+
5
+ #ifndef _WIN32
6
+ #include <net/if.h>
7
+ #include <netinet/in.h>
8
+ #include <sys/ioctl.h>
9
+ #endif
10
+ #include <unistd.h>
11
+ #include <limits>
12
+ #include <random>
13
+
14
+ #include "esphome/core/defines.h"
15
+ #include "esphome/core/log.h"
16
+
17
+ namespace esphome {
18
+
19
+ static const char *const TAG = "helpers.host";
20
+
21
+ uint32_t random_uint32() {
22
+ std::random_device dev;
23
+ std::mt19937 rng(dev());
24
+ std::uniform_int_distribution<uint32_t> dist(0, std::numeric_limits<uint32_t>::max());
25
+ return dist(rng);
26
+ }
27
+
28
+ bool random_bytes(uint8_t *data, size_t len) {
29
+ FILE *fp = fopen("/dev/urandom", "r");
30
+ if (fp == nullptr) {
31
+ ESP_LOGW(TAG, "Could not open /dev/urandom, errno=%d", errno);
32
+ exit(1);
33
+ }
34
+ size_t read = fread(data, 1, len, fp);
35
+ if (read != len) {
36
+ ESP_LOGW(TAG, "Not enough data from /dev/urandom");
37
+ exit(1);
38
+ }
39
+ fclose(fp);
40
+ return true;
41
+ }
42
+
43
+ // Host platform uses std::mutex for proper thread synchronization
44
+ Mutex::Mutex() { handle_ = new std::mutex(); }
45
+ Mutex::~Mutex() { delete static_cast<std::mutex *>(handle_); }
46
+ void Mutex::lock() { static_cast<std::mutex *>(handle_)->lock(); }
47
+ bool Mutex::try_lock() { return static_cast<std::mutex *>(handle_)->try_lock(); }
48
+ void Mutex::unlock() { static_cast<std::mutex *>(handle_)->unlock(); }
49
+
50
+ void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
51
+ static const uint8_t esphome_host_mac_address[6] = USE_ESPHOME_HOST_MAC_ADDRESS;
52
+ memcpy(mac, esphome_host_mac_address, sizeof(esphome_host_mac_address));
53
+ }
54
+
55
+ } // namespace esphome
56
+
57
+ #endif // USE_HOST
@@ -2,6 +2,7 @@ from esphome import automation
2
2
  import esphome.codegen as cg
3
3
  from esphome.components import esp32
4
4
  from esphome.components.const import CONF_REQUEST_HEADERS
5
+ from esphome.config_helpers import filter_source_files_from_platform
5
6
  import esphome.config_validation as cv
6
7
  from esphome.const import (
7
8
  CONF_ESP8266_DISABLE_SSL_SUPPORT,
@@ -13,6 +14,7 @@ from esphome.const import (
13
14
  CONF_URL,
14
15
  CONF_WATCHDOG_TIMEOUT,
15
16
  PLATFORM_HOST,
17
+ PlatformFramework,
16
18
  __version__,
17
19
  )
18
20
  from esphome.core import CORE, Lambda
@@ -175,7 +177,7 @@ async def to_code(config):
175
177
  not config.get(CONF_VERIFY_SSL),
176
178
  )
177
179
  else:
178
- cg.add_library("WiFiClientSecure", None)
180
+ cg.add_library("NetworkClientSecure", None)
179
181
  cg.add_library("HTTPClient", None)
180
182
  if CORE.is_esp8266:
181
183
  cg.add_library("ESP8266HTTPClient", None)
@@ -319,3 +321,19 @@ async def http_request_action_to_code(config, action_id, template_arg, args):
319
321
  await automation.build_automation(trigger, [], conf)
320
322
 
321
323
  return var
324
+
325
+
326
+ FILTER_SOURCE_FILES = filter_source_files_from_platform(
327
+ {
328
+ "http_request_host.cpp": {PlatformFramework.HOST_NATIVE},
329
+ "http_request_arduino.cpp": {
330
+ PlatformFramework.ESP32_ARDUINO,
331
+ PlatformFramework.ESP8266_ARDUINO,
332
+ PlatformFramework.RP2040_ARDUINO,
333
+ PlatformFramework.BK72XX_ARDUINO,
334
+ PlatformFramework.RTL87XX_ARDUINO,
335
+ PlatformFramework.LN882X_ARDUINO,
336
+ },
337
+ "http_request_idf.cpp": {PlatformFramework.ESP32_IDF},
338
+ }
339
+ )
@@ -239,7 +239,7 @@ template<typename... Ts> class HttpRequestSendAction : public Action<Ts...> {
239
239
 
240
240
  std::string response_body;
241
241
  if (this->capture_response_.value(x...)) {
242
- ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
242
+ RAMAllocator<uint8_t> allocator;
243
243
  uint8_t *buf = allocator.allocate(max_length);
244
244
  if (buf != nullptr) {
245
245
  size_t read_index = 0;
@@ -6,6 +6,7 @@
6
6
 
7
7
  #if defined(USE_ESP32) || defined(USE_RP2040)
8
8
  #include <HTTPClient.h>
9
+ #include <WiFiClient.h>
9
10
  #endif
10
11
  #ifdef USE_ESP8266
11
12
  #include <ESP8266HTTPClient.h>
@@ -258,7 +258,7 @@ bool OtaHttpRequestComponent::http_get_md5_() {
258
258
  }
259
259
 
260
260
  bool OtaHttpRequestComponent::validate_url_(const std::string &url) {
261
- if ((url.length() < 8) || (url.find("http") != 0) || (url.find("://") == std::string::npos)) {
261
+ if ((url.length() < 8) || !url.starts_with("http") || (url.find("://") == std::string::npos)) {
262
262
  ESP_LOGE(TAG, "URL is invalid and/or must be prefixed with 'http://' or 'https://'");
263
263
  return false;
264
264
  }
@@ -50,15 +50,17 @@ void HttpRequestUpdate::update_task(void *params) {
50
50
 
51
51
  if (container == nullptr || container->status_code != HTTP_STATUS_OK) {
52
52
  std::string msg = str_sprintf("Failed to fetch manifest from %s", this_update->source_url_.c_str());
53
- this_update->status_set_error(msg.c_str());
53
+ // Defer to main loop to avoid race condition on component_state_ read-modify-write
54
+ this_update->defer([this_update, msg]() { this_update->status_set_error(msg.c_str()); });
54
55
  UPDATE_RETURN;
55
56
  }
56
57
 
57
- ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
58
+ RAMAllocator<uint8_t> allocator;
58
59
  uint8_t *data = allocator.allocate(container->content_length);
59
60
  if (data == nullptr) {
60
- std::string msg = str_sprintf("Failed to allocate %d bytes for manifest", container->content_length);
61
- this_update->status_set_error(msg.c_str());
61
+ std::string msg = str_sprintf("Failed to allocate %zu bytes for manifest", container->content_length);
62
+ // Defer to main loop to avoid race condition on component_state_ read-modify-write
63
+ this_update->defer([this_update, msg]() { this_update->status_set_error(msg.c_str()); });
62
64
  container->end();
63
65
  UPDATE_RETURN;
64
66
  }
@@ -120,7 +122,8 @@ void HttpRequestUpdate::update_task(void *params) {
120
122
 
121
123
  if (!valid) {
122
124
  std::string msg = str_sprintf("Failed to parse JSON from %s", this_update->source_url_.c_str());
123
- this_update->status_set_error(msg.c_str());
125
+ // Defer to main loop to avoid race condition on component_state_ read-modify-write
126
+ this_update->defer([this_update, msg]() { this_update->status_set_error(msg.c_str()); });
124
127
  UPDATE_RETURN;
125
128
  }
126
129
 
@@ -147,18 +150,34 @@ void HttpRequestUpdate::update_task(void *params) {
147
150
  this_update->update_info_.current_version = current_version;
148
151
  }
149
152
 
153
+ bool trigger_update_available = false;
154
+
150
155
  if (this_update->update_info_.latest_version.empty() ||
151
156
  this_update->update_info_.latest_version == this_update->update_info_.current_version) {
152
157
  this_update->state_ = update::UPDATE_STATE_NO_UPDATE;
153
158
  } else {
159
+ if (this_update->state_ != update::UPDATE_STATE_AVAILABLE) {
160
+ trigger_update_available = true;
161
+ }
154
162
  this_update->state_ = update::UPDATE_STATE_AVAILABLE;
155
163
  }
156
164
 
157
- this_update->update_info_.has_progress = false;
158
- this_update->update_info_.progress = 0.0f;
165
+ // Defer to main loop to ensure thread-safe execution of:
166
+ // - status_clear_error() performs non-atomic read-modify-write on component_state_
167
+ // - publish_state() triggers API callbacks that write to the shared protobuf buffer
168
+ // which can be corrupted if accessed concurrently from task and main loop threads
169
+ // - update_available trigger to ensure consistent state when the trigger fires
170
+ this_update->defer([this_update, trigger_update_available]() {
171
+ this_update->update_info_.has_progress = false;
172
+ this_update->update_info_.progress = 0.0f;
173
+
174
+ this_update->status_clear_error();
175
+ this_update->publish_state();
159
176
 
160
- this_update->status_clear_error();
161
- this_update->publish_state();
177
+ if (trigger_update_available) {
178
+ this_update->get_update_available_trigger()->trigger(this_update->update_info_);
179
+ }
180
+ });
162
181
 
163
182
  UPDATE_RETURN;
164
183
  }
@@ -159,12 +159,6 @@ void HydreonRGxxComponent::schedule_reboot_() {
159
159
  });
160
160
  }
161
161
 
162
- bool HydreonRGxxComponent::buffer_starts_with_(const std::string &prefix) {
163
- return this->buffer_starts_with_(prefix.c_str());
164
- }
165
-
166
- bool HydreonRGxxComponent::buffer_starts_with_(const char *prefix) { return buffer_.rfind(prefix, 0) == 0; }
167
-
168
162
  void HydreonRGxxComponent::process_line_() {
169
163
  ESP_LOGV(TAG, "Read from serial: %s", this->buffer_.substr(0, this->buffer_.size() - 2).c_str());
170
164
 
@@ -191,7 +185,7 @@ void HydreonRGxxComponent::process_line_() {
191
185
  ESP_LOGW(TAG, "Received EmSat!");
192
186
  this->em_sat_ = true;
193
187
  }
194
- if (this->buffer_starts_with_("PwrDays")) {
188
+ if (buffer_.starts_with("PwrDays")) {
195
189
  if (this->boot_count_ <= 0) {
196
190
  this->boot_count_ = 1;
197
191
  } else {
@@ -220,7 +214,7 @@ void HydreonRGxxComponent::process_line_() {
220
214
  }
221
215
  return;
222
216
  }
223
- if (this->buffer_starts_with_("SW")) {
217
+ if (buffer_.starts_with("SW")) {
224
218
  std::string::size_type majend = this->buffer_.find('.');
225
219
  std::string::size_type endversion = this->buffer_.find(' ', 3);
226
220
  if (majend == std::string::npos || endversion == std::string::npos || majend > endversion) {
@@ -282,7 +276,7 @@ void HydreonRGxxComponent::process_line_() {
282
276
  }
283
277
  } else {
284
278
  for (const auto *ignore : IGNORE_STRINGS) {
285
- if (this->buffer_starts_with_(ignore)) {
279
+ if (buffer_.starts_with(ignore)) {
286
280
  ESP_LOGI(TAG, "Ignoring %s", this->buffer_.substr(0, this->buffer_.size() - 2).c_str());
287
281
  return;
288
282
  }
@@ -111,8 +111,8 @@ CONFIG_SCHEMA = cv.All(
111
111
  cv.Optional(CONF_MOISTURE): sensor.sensor_schema(
112
112
  unit_of_measurement=UNIT_INTENSITY,
113
113
  accuracy_decimals=0,
114
- device_class=DEVICE_CLASS_PRECIPITATION_INTENSITY,
115
114
  state_class=STATE_CLASS_MEASUREMENT,
115
+ icon="mdi:weather-rainy",
116
116
  ),
117
117
  cv.Optional(CONF_TEMPERATURE): sensor.sensor_schema(
118
118
  unit_of_measurement=UNIT_CELSIUS,
@@ -3,14 +3,13 @@ import logging
3
3
  from esphome import pins
4
4
  import esphome.codegen as cg
5
5
  from esphome.components import esp32
6
+ from esphome.config_helpers import filter_source_files_from_platform
6
7
  import esphome.config_validation as cv
7
8
  from esphome.const import (
8
9
  CONF_ADDRESS,
9
10
  CONF_FREQUENCY,
10
11
  CONF_I2C_ID,
11
12
  CONF_ID,
12
- CONF_INPUT,
13
- CONF_OUTPUT,
14
13
  CONF_SCAN,
15
14
  CONF_SCL,
16
15
  CONF_SDA,
@@ -20,6 +19,7 @@ from esphome.const import (
20
19
  PLATFORM_ESP32,
21
20
  PLATFORM_ESP8266,
22
21
  PLATFORM_RP2040,
22
+ PlatformFramework,
23
23
  )
24
24
  from esphome.core import CORE, coroutine_with_priority
25
25
  import esphome.final_validate as fv
@@ -28,8 +28,9 @@ LOGGER = logging.getLogger(__name__)
28
28
  CODEOWNERS = ["@esphome/core"]
29
29
  i2c_ns = cg.esphome_ns.namespace("i2c")
30
30
  I2CBus = i2c_ns.class_("I2CBus")
31
- ArduinoI2CBus = i2c_ns.class_("ArduinoI2CBus", I2CBus, cg.Component)
32
- IDFI2CBus = i2c_ns.class_("IDFI2CBus", I2CBus, cg.Component)
31
+ InternalI2CBus = i2c_ns.class_("InternalI2CBus", I2CBus)
32
+ ArduinoI2CBus = i2c_ns.class_("ArduinoI2CBus", InternalI2CBus, cg.Component)
33
+ IDFI2CBus = i2c_ns.class_("IDFI2CBus", InternalI2CBus, cg.Component)
33
34
  I2CDevice = i2c_ns.class_("I2CDevice")
34
35
 
35
36
 
@@ -72,20 +73,15 @@ def validate_config(config):
72
73
  return config
73
74
 
74
75
 
75
- pin_with_input_and_output_support = pins.internal_gpio_pin_number(
76
- {CONF_OUTPUT: True, CONF_INPUT: True}
77
- )
78
-
79
-
80
76
  CONFIG_SCHEMA = cv.All(
81
77
  cv.Schema(
82
78
  {
83
79
  cv.GenerateID(): _bus_declare_type,
84
- cv.Optional(CONF_SDA, default="SDA"): pin_with_input_and_output_support,
80
+ cv.Optional(CONF_SDA, default="SDA"): pins.internal_gpio_pin_number,
85
81
  cv.SplitDefault(CONF_SDA_PULLUP_ENABLED, esp32_idf=True): cv.All(
86
82
  cv.only_with_esp_idf, cv.boolean
87
83
  ),
88
- cv.Optional(CONF_SCL, default="SCL"): pin_with_input_and_output_support,
84
+ cv.Optional(CONF_SCL, default="SCL"): pins.internal_gpio_pin_number,
89
85
  cv.SplitDefault(CONF_SCL_PULLUP_ENABLED, esp32_idf=True): cv.All(
90
86
  cv.only_with_esp_idf, cv.boolean
91
87
  ),
@@ -104,6 +100,7 @@ CONFIG_SCHEMA = cv.All(
104
100
  @coroutine_with_priority(1.0)
105
101
  async def to_code(config):
106
102
  cg.add_global(i2c_ns.using)
103
+ cg.add_define("USE_I2C")
107
104
  var = cg.new_Pvariable(config[CONF_ID])
108
105
  await cg.register_component(var, config)
109
106
 
@@ -210,3 +207,18 @@ def final_validate_device_schema(
210
207
  {cv.Required(CONF_I2C_ID): fv.id_declaration_match_schema(hub_schema)},
211
208
  extra=cv.ALLOW_EXTRA,
212
209
  )
210
+
211
+
212
+ FILTER_SOURCE_FILES = filter_source_files_from_platform(
213
+ {
214
+ "i2c_bus_arduino.cpp": {
215
+ PlatformFramework.ESP32_ARDUINO,
216
+ PlatformFramework.ESP8266_ARDUINO,
217
+ PlatformFramework.RP2040_ARDUINO,
218
+ PlatformFramework.BK72XX_ARDUINO,
219
+ PlatformFramework.RTL87XX_ARDUINO,
220
+ PlatformFramework.LN882X_ARDUINO,
221
+ },
222
+ "i2c_bus_esp_idf.cpp": {PlatformFramework.ESP32_IDF},
223
+ }
224
+ )
@@ -1,6 +1,6 @@
1
1
  #pragma once
2
- #include <cstdint>
3
2
  #include <cstddef>
3
+ #include <cstdint>
4
4
  #include <utility>
5
5
  #include <vector>
6
6
 
@@ -108,5 +108,12 @@ class I2CBus {
108
108
  bool scan_{false}; ///< Should we scan ? Can be set in the yaml
109
109
  };
110
110
 
111
+ class InternalI2CBus : public I2CBus {
112
+ public:
113
+ /// @brief Returns the I2C port number.
114
+ /// @return the port number of the internal I2C bus
115
+ virtual int get_port() const = 0;
116
+ };
117
+
111
118
  } // namespace i2c
112
119
  } // namespace esphome
@@ -1,11 +1,11 @@
1
1
  #ifdef USE_ARDUINO
2
2
 
3
3
  #include "i2c_bus_arduino.h"
4
+ #include <Arduino.h>
5
+ #include <cstring>
4
6
  #include "esphome/core/application.h"
5
7
  #include "esphome/core/helpers.h"
6
8
  #include "esphome/core/log.h"
7
- #include <Arduino.h>
8
- #include <cstring>
9
9
 
10
10
  namespace esphome {
11
11
  namespace i2c {
@@ -23,6 +23,7 @@ void ArduinoI2CBus::setup() {
23
23
  } else {
24
24
  wire_ = new TwoWire(next_bus_num); // NOLINT(cppcoreguidelines-owning-memory)
25
25
  }
26
+ this->port_ = next_bus_num;
26
27
  next_bus_num++;
27
28
  #elif defined(USE_ESP8266)
28
29
  wire_ = new TwoWire(); // NOLINT(cppcoreguidelines-owning-memory)
@@ -125,7 +126,7 @@ ErrorCode ArduinoI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt)
125
126
  size_t to_request = 0;
126
127
  for (size_t i = 0; i < cnt; i++)
127
128
  to_request += buffers[i].len;
128
- size_t ret = wire_->requestFrom((int) address, (int) to_request, 1);
129
+ size_t ret = wire_->requestFrom(address, to_request, true);
129
130
  if (ret != to_request) {
130
131
  ESP_LOGVV(TAG, "RX %u from %02X failed with error %u", to_request, address, ret);
131
132
  return ERROR_TIMEOUT;
@@ -2,9 +2,9 @@
2
2
 
3
3
  #ifdef USE_ARDUINO
4
4
 
5
- #include "i2c_bus.h"
6
- #include "esphome/core/component.h"
7
5
  #include <Wire.h>
6
+ #include "esphome/core/component.h"
7
+ #include "i2c_bus.h"
8
8
 
9
9
  namespace esphome {
10
10
  namespace i2c {
@@ -15,7 +15,7 @@ enum RecoveryCode {
15
15
  RECOVERY_COMPLETED,
16
16
  };
17
17
 
18
- class ArduinoI2CBus : public I2CBus, public Component {
18
+ class ArduinoI2CBus : public InternalI2CBus, public Component {
19
19
  public:
20
20
  void setup() override;
21
21
  void dump_config() override;
@@ -29,12 +29,15 @@ class ArduinoI2CBus : public I2CBus, public Component {
29
29
  void set_frequency(uint32_t frequency) { frequency_ = frequency; }
30
30
  void set_timeout(uint32_t timeout) { timeout_ = timeout; }
31
31
 
32
+ int get_port() const override { return this->port_; }
33
+
32
34
  private:
33
35
  void recover_();
34
36
  void set_pins_and_clock_();
35
37
  RecoveryCode recovery_result_;
36
38
 
37
39
  protected:
40
+ int8_t port_{-1};
38
41
  TwoWire *wire_;
39
42
  uint8_t sda_pin_;
40
43
  uint8_t scl_pin_;
@@ -2,9 +2,9 @@
2
2
 
3
3
  #ifdef USE_ESP_IDF
4
4
 
5
- #include "i2c_bus.h"
6
- #include "esphome/core/component.h"
7
5
  #include <driver/i2c.h>
6
+ #include "esphome/core/component.h"
7
+ #include "i2c_bus.h"
8
8
 
9
9
  namespace esphome {
10
10
  namespace i2c {
@@ -15,7 +15,7 @@ enum RecoveryCode {
15
15
  RECOVERY_COMPLETED,
16
16
  };
17
17
 
18
- class IDFI2CBus : public I2CBus, public Component {
18
+ class IDFI2CBus : public InternalI2CBus, public Component {
19
19
  public:
20
20
  void setup() override;
21
21
  void dump_config() override;
@@ -31,6 +31,8 @@ class IDFI2CBus : public I2CBus, public Component {
31
31
  void set_frequency(uint32_t frequency) { frequency_ = frequency; }
32
32
  void set_timeout(uint32_t timeout) { timeout_ = timeout; }
33
33
 
34
+ int get_port() const override { return static_cast<int>(this->port_); }
35
+
34
36
  private:
35
37
  void recover_();
36
38
  RecoveryCode recovery_result_;
@@ -9,7 +9,6 @@ namespace i2c_device {
9
9
  class I2CDeviceComponent : public Component, public i2c::I2CDevice {
10
10
  public:
11
11
  void dump_config() override;
12
- float get_setup_priority() const override { return setup_priority::DATA; }
13
12
 
14
13
  protected:
15
14
  };
@@ -9,14 +9,7 @@ from esphome.components.esp32.const import (
9
9
  VARIANT_ESP32S3,
10
10
  )
11
11
  import esphome.config_validation as cv
12
- from esphome.const import (
13
- CONF_BITS_PER_SAMPLE,
14
- CONF_CHANNEL,
15
- CONF_ID,
16
- CONF_SAMPLE_RATE,
17
- KEY_CORE,
18
- KEY_FRAMEWORK_VERSION,
19
- )
12
+ from esphome.const import CONF_BITS_PER_SAMPLE, CONF_CHANNEL, CONF_ID, CONF_SAMPLE_RATE
20
13
  from esphome.core import CORE
21
14
  from esphome.cpp_generator import MockObjClass
22
15
  import esphome.final_validate as fv
@@ -250,8 +243,7 @@ def _final_validate(_):
250
243
 
251
244
 
252
245
  def use_legacy():
253
- framework_version = CORE.data[KEY_CORE][KEY_FRAMEWORK_VERSION]
254
- if CORE.using_esp_idf and framework_version >= cv.Version(5, 0, 0):
246
+ if CORE.using_esp_idf:
255
247
  if not _use_legacy_driver:
256
248
  return False
257
249
  return True
@@ -9,15 +9,11 @@ namespace i2s_audio {
9
9
 
10
10
  static const char *const TAG = "i2s_audio";
11
11
 
12
- #if defined(USE_ESP_IDF) && (ESP_IDF_VERSION_MAJOR >= 5)
13
- static const uint8_t I2S_NUM_MAX = SOC_I2S_NUM; // because IDF 5+ took this away :(
14
- #endif
15
-
16
12
  void I2SAudioComponent::setup() {
17
13
  ESP_LOGCONFIG(TAG, "Running setup");
18
14
 
19
15
  static i2s_port_t next_port_num = I2S_NUM_0;
20
- if (next_port_num >= I2S_NUM_MAX) {
16
+ if (next_port_num >= SOC_I2S_NUM) {
21
17
  ESP_LOGE(TAG, "Too many components");
22
18
  this->mark_failed();
23
19
  return;
@@ -114,7 +114,7 @@ async def to_code(config):
114
114
  cg.add(var.set_external_dac_channels(2 if config[CONF_MODE] == "stereo" else 1))
115
115
  cg.add(var.set_i2s_comm_fmt_lsb(config[CONF_I2S_COMM_FMT] == "lsb"))
116
116
 
117
- cg.add_library("WiFiClientSecure", None)
117
+ cg.add_library("NetworkClientSecure", None)
118
118
  cg.add_library("HTTPClient", None)
119
- cg.add_library("esphome/ESP32-audioI2S", "2.2.0")
119
+ cg.add_library("esphome/ESP32-audioI2S", "2.3.0")
120
120
  cg.add_build_flag("-DAUDIO_NO_SD_FS")
@@ -484,7 +484,7 @@ bool I2SAudioSpeaker::send_esp_err_to_event_group_(esp_err_t err) {
484
484
  esp_err_t I2SAudioSpeaker::allocate_buffers_(size_t data_buffer_size, size_t ring_buffer_size) {
485
485
  if (this->data_buffer_ == nullptr) {
486
486
  // Allocate data buffer for temporarily storing audio from the ring buffer before writing to the I2S bus
487
- ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
487
+ RAMAllocator<uint8_t> allocator;
488
488
  this->data_buffer_ = allocator.allocate(data_buffer_size);
489
489
  }
490
490
 
@@ -698,7 +698,7 @@ void I2SAudioSpeaker::delete_task_(size_t buffer_size) {
698
698
  this->audio_ring_buffer_.reset(); // Releases ownership of the shared_ptr
699
699
 
700
700
  if (this->data_buffer_ != nullptr) {
701
- ExternalRAMAllocator<uint8_t> allocator(ExternalRAMAllocator<uint8_t>::ALLOW_FAILURE);
701
+ RAMAllocator<uint8_t> allocator;
702
702
  allocator.deallocate(this->data_buffer_, buffer_size);
703
703
  this->data_buffer_ = nullptr;
704
704
  }
@@ -16,8 +16,6 @@ class IAQCore : public PollingComponent, public i2c::I2CDevice {
16
16
  void update() override;
17
17
  void dump_config() override;
18
18
 
19
- float get_setup_priority() const override { return setup_priority::DATA; }
20
-
21
19
  protected:
22
20
  sensor::Sensor *co2_{nullptr};
23
21
  sensor::Sensor *tvoc_{nullptr};