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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (648) 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 +57 -21
  22. esphome/components/api/api_connection.cpp +344 -539
  23. esphome/components/api/api_connection.h +224 -141
  24. esphome/components/api/api_frame_helper.cpp +91 -127
  25. esphome/components/api/api_frame_helper.h +64 -54
  26. esphome/components/api/api_pb2.cpp +1837 -9044
  27. esphome/components/api/api_pb2.h +532 -685
  28. esphome/components/api/api_pb2_dump.cpp +4432 -0
  29. esphome/components/api/api_pb2_service.cpp +184 -425
  30. esphome/components/api/api_pb2_service.h +13 -6
  31. esphome/components/api/api_server.cpp +131 -167
  32. esphome/components/api/api_server.h +38 -10
  33. esphome/components/api/client.py +10 -4
  34. esphome/components/api/custom_api_device.h +8 -0
  35. esphome/components/api/list_entities.cpp +37 -104
  36. esphome/components/api/list_entities.h +33 -23
  37. esphome/components/api/proto.h +532 -26
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/api/user_services.h +2 -0
  41. esphome/components/as3935_spi/as3935_spi.h +0 -2
  42. esphome/components/as5600/as5600.h +0 -1
  43. esphome/components/async_tcp/__init__.py +14 -5
  44. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  45. esphome/components/atm90e32/atm90e32.cpp +2 -1
  46. esphome/components/audio/audio_decoder.cpp +1 -1
  47. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  48. esphome/components/b_parasite/b_parasite.h +0 -1
  49. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  50. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  51. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  52. esphome/components/bh1750/bh1750.cpp +5 -5
  53. esphome/components/binary_sensor/__init__.py +82 -5
  54. esphome/components/binary_sensor/automation.h +19 -1
  55. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  56. esphome/components/binary_sensor/binary_sensor.h +11 -25
  57. esphome/components/binary_sensor/filter.cpp +29 -24
  58. esphome/components/binary_sensor/filter.h +20 -10
  59. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  60. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  62. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  63. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  64. esphome/components/ble_client/switch/ble_switch.h +0 -1
  65. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  66. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  67. esphome/components/ble_presence/ble_presence_device.h +0 -1
  68. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  69. esphome/components/ble_scanner/ble_scanner.h +0 -1
  70. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  71. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  72. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  73. esphome/components/bme680/sensor.py +1 -1
  74. esphome/components/bmp581/bmp581.h +0 -2
  75. esphome/components/button/__init__.py +5 -2
  76. esphome/components/camera/__init__.py +1 -0
  77. esphome/components/camera/camera.cpp +22 -0
  78. esphome/components/camera/camera.h +80 -0
  79. esphome/components/canbus/__init__.py +1 -0
  80. esphome/components/cap1188/cap1188.h +0 -1
  81. esphome/components/captive_portal/__init__.py +12 -2
  82. esphome/components/captive_portal/captive_portal.cpp +12 -2
  83. esphome/components/captive_portal/captive_portal.h +5 -2
  84. esphome/components/ccs811/ccs811.h +0 -2
  85. esphome/components/climate/__init__.py +5 -2
  86. esphome/components/cm1106/sensor.py +2 -2
  87. esphome/components/const/__init__.py +2 -0
  88. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  89. esphome/components/copy/button/copy_button.h +0 -1
  90. esphome/components/copy/cover/copy_cover.h +0 -1
  91. esphome/components/copy/fan/copy_fan.h +0 -1
  92. esphome/components/copy/lock/copy_lock.h +0 -1
  93. esphome/components/copy/number/copy_number.h +0 -1
  94. esphome/components/copy/select/copy_select.h +0 -1
  95. esphome/components/copy/sensor/copy_sensor.h +0 -1
  96. esphome/components/copy/switch/copy_switch.h +0 -1
  97. esphome/components/copy/text/copy_text.h +0 -1
  98. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  99. esphome/components/cover/__init__.py +5 -2
  100. esphome/components/cs5460a/cs5460a.h +0 -1
  101. esphome/components/datetime/__init__.py +4 -2
  102. esphome/components/debug/__init__.py +20 -0
  103. esphome/components/debug/debug_esp32.cpp +2 -0
  104. esphome/components/deep_sleep/__init__.py +43 -9
  105. esphome/components/demo/__init__.py +2 -2
  106. esphome/components/display/display.cpp +4 -3
  107. esphome/components/display/display.h +0 -2
  108. esphome/components/display/display_buffer.cpp +1 -1
  109. esphome/components/ds2484/__init__.py +1 -0
  110. esphome/components/ds2484/ds2484.cpp +209 -0
  111. esphome/components/ds2484/ds2484.h +43 -0
  112. esphome/components/ds2484/one_wire.py +37 -0
  113. esphome/components/duty_time/duty_time_sensor.h +0 -1
  114. esphome/components/ens160_base/ens160_base.h +0 -1
  115. esphome/components/es7210/es7210.h +0 -1
  116. esphome/components/es7243e/es7243e.h +0 -1
  117. esphome/components/es8156/es8156.h +0 -1
  118. esphome/components/es8311/es8311.h +0 -1
  119. esphome/components/es8388/es8388.h +0 -1
  120. esphome/components/esp32/__init__.py +103 -135
  121. esphome/components/esp32/core.cpp +0 -4
  122. esphome/components/esp32/gpio.h +1 -1
  123. esphome/components/esp32/helpers.cpp +69 -0
  124. esphome/components/esp32_ble/ble.cpp +5 -6
  125. esphome/components/esp32_ble/ble.h +29 -14
  126. esphome/components/esp32_ble/ble_event.h +6 -6
  127. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  128. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  129. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  130. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  131. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  132. esphome/components/esp32_camera/__init__.py +112 -98
  133. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  134. esphome/components/esp32_camera/esp32_camera.h +35 -30
  135. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  136. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  137. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  138. esphome/components/esp32_hall/sensor.py +2 -21
  139. esphome/components/esp32_hosted/__init__.py +101 -0
  140. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  141. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  142. esphome/components/esp32_rmt/__init__.py +0 -58
  143. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  144. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  145. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  146. esphome/components/esp32_touch/esp32_touch.h +174 -28
  147. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  148. esphome/components/esp32_touch/esp32_touch_v1.cpp +240 -0
  149. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  150. esphome/components/esp8266/__init__.py +2 -0
  151. esphome/components/esp8266/gpio.cpp +10 -10
  152. esphome/components/esp8266/helpers.cpp +31 -0
  153. esphome/components/esp_ldo/__init__.py +10 -8
  154. esphome/components/esp_ldo/esp_ldo.h +3 -0
  155. esphome/components/esphome/ota/__init__.py +1 -0
  156. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  157. esphome/components/ethernet/__init__.py +42 -23
  158. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  159. esphome/components/ethernet/ethernet_component.cpp +69 -29
  160. esphome/components/ethernet/ethernet_component.h +18 -10
  161. esphome/components/event/__init__.py +5 -2
  162. esphome/components/ezo/ezo.h +0 -1
  163. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  164. esphome/components/fan/__init__.py +5 -2
  165. esphome/components/fan/fan.cpp +4 -0
  166. esphome/components/feedback/feedback_cover.h +0 -1
  167. esphome/components/font/__init__.py +92 -82
  168. esphome/components/font/font.cpp +9 -2
  169. esphome/components/font/font.h +20 -5
  170. esphome/components/fs3000/fs3000.h +0 -1
  171. esphome/components/gcja5/gcja5.h +0 -1
  172. esphome/components/gl_r01_i2c/__init__.py +0 -0
  173. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  174. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  175. esphome/components/gl_r01_i2c/sensor.py +36 -0
  176. esphome/components/gp8403/gp8403.h +0 -1
  177. esphome/components/gpio/binary_sensor/__init__.py +39 -1
  178. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  179. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  180. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  181. esphome/components/he60r/he60r.h +0 -1
  182. esphome/components/heatpumpir/climate.py +2 -1
  183. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  184. esphome/components/heatpumpir/heatpumpir.h +1 -0
  185. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  186. esphome/components/host/__init__.py +3 -1
  187. esphome/components/host/helpers.cpp +57 -0
  188. esphome/components/http_request/__init__.py +19 -1
  189. esphome/components/http_request/http_request.h +1 -1
  190. esphome/components/http_request/http_request_arduino.cpp +0 -1
  191. esphome/components/http_request/http_request_arduino.h +1 -0
  192. esphome/components/http_request/http_request_idf.cpp +0 -1
  193. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  194. esphome/components/http_request/update/http_request_update.cpp +35 -16
  195. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  196. esphome/components/hydreon_rgxx/sensor.py +1 -1
  197. esphome/components/i2c/__init__.py +23 -11
  198. esphome/components/i2c/i2c_bus.h +8 -1
  199. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  200. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  201. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  202. esphome/components/i2c_device/i2c_device.h +0 -1
  203. esphome/components/i2s_audio/__init__.py +2 -10
  204. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  205. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  206. esphome/components/i2s_audio/speaker/__init__.py +1 -1
  207. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  208. esphome/components/iaqcore/iaqcore.h +0 -2
  209. esphome/components/image/__init__.py +123 -24
  210. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  211. esphome/components/ina219/ina219.cpp +7 -0
  212. esphome/components/ina219/ina219.h +1 -0
  213. esphome/components/ina260/ina260.h +0 -2
  214. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  215. esphome/components/inkplate6/display.py +15 -0
  216. esphome/components/inkplate6/inkplate.cpp +2 -2
  217. esphome/components/integration/integration_sensor.h +0 -1
  218. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  219. esphome/components/internal_temperature/sensor.py +0 -26
  220. esphome/components/interval/interval.h +0 -2
  221. esphome/components/json/__init__.py +1 -1
  222. esphome/components/json/json_util.cpp +56 -63
  223. esphome/components/ld2410/button/__init__.py +3 -3
  224. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  225. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  226. esphome/components/ld2410/ld2410.cpp +421 -268
  227. esphome/components/ld2410/ld2410.h +44 -146
  228. esphome/components/ld2410/number/__init__.py +2 -2
  229. esphome/components/ld2410/sensor.py +1 -1
  230. esphome/components/ld2410/switch/__init__.py +1 -1
  231. esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp +2 -2
  232. esphome/components/ld2420/button/reconfig_buttons.cpp +1 -1
  233. esphome/components/ld2420/ld2420.cpp +252 -147
  234. esphome/components/ld2420/ld2420.h +52 -126
  235. esphome/components/ld2420/number/__init__.py +2 -2
  236. esphome/components/ld2420/number/gate_config_number.cpp +1 -1
  237. esphome/components/ld2420/select/operating_mode_select.cpp +1 -1
  238. esphome/components/ld2420/sensor/__init__.py +6 -2
  239. esphome/components/ld2420/sensor/ld2420_sensor.cpp +2 -2
  240. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  241. esphome/components/ld2420/text_sensor/text_sensor.cpp +2 -2
  242. esphome/components/ld2450/button/__init__.py +3 -3
  243. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  244. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  245. esphome/components/ld2450/ld2450.cpp +384 -232
  246. esphome/components/ld2450/ld2450.h +60 -69
  247. esphome/components/ld2450/switch/__init__.py +1 -1
  248. esphome/components/ledc/ledc_output.cpp +1 -63
  249. esphome/components/libretiny/__init__.py +5 -3
  250. esphome/components/libretiny/const.py +5 -0
  251. esphome/components/libretiny/generate_components.py +1 -0
  252. esphome/components/libretiny/helpers.cpp +35 -0
  253. esphome/components/libretiny/lt_component.cpp +5 -3
  254. esphome/components/light/__init__.py +4 -2
  255. esphome/components/light/addressable_light.h +3 -3
  256. esphome/components/light/light_call.cpp +180 -243
  257. esphome/components/light/light_call.h +72 -20
  258. esphome/components/light/light_color_values.h +14 -14
  259. esphome/components/light/light_json_schema.cpp +17 -16
  260. esphome/components/light/light_state.h +15 -13
  261. esphome/components/light/transformers.h +2 -2
  262. esphome/components/ln882x/__init__.py +52 -0
  263. esphome/components/ln882x/boards.py +285 -0
  264. esphome/components/lock/__init__.py +5 -2
  265. esphome/components/logger/__init__.py +40 -3
  266. esphome/components/logger/logger.cpp +47 -12
  267. esphome/components/logger/logger.h +80 -49
  268. esphome/components/logger/logger_esp32.cpp +3 -3
  269. esphome/components/lps22/__init__.py +0 -0
  270. esphome/components/lps22/lps22.cpp +75 -0
  271. esphome/components/lps22/lps22.h +27 -0
  272. esphome/components/lps22/sensor.py +58 -0
  273. esphome/components/ltr390/ltr390.h +0 -1
  274. esphome/components/ltr501/ltr501.h +0 -1
  275. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  276. esphome/components/lvgl/__init__.py +1 -1
  277. esphome/components/lvgl/schemas.py +66 -6
  278. esphome/components/lvgl/styles.py +24 -16
  279. esphome/components/lvgl/widgets/__init__.py +12 -2
  280. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  281. esphome/components/lvgl/widgets/meter.py +20 -13
  282. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  283. esphome/components/max9611/max9611.h +0 -1
  284. esphome/components/mcp23016/__init__.py +1 -1
  285. esphome/components/mcp23xxx_base/__init__.py +1 -1
  286. esphome/components/mcp4461/__init__.py +1 -1
  287. esphome/components/mcp4461/output/__init__.py +3 -2
  288. esphome/components/mcp9600/mcp9600.h +0 -2
  289. esphome/components/md5/md5.cpp +3 -3
  290. esphome/components/md5/md5.h +1 -6
  291. esphome/components/mdns/__init__.py +22 -11
  292. esphome/components/media_player/__init__.py +4 -3
  293. esphome/components/micro_wake_word/__init__.py +1 -5
  294. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  295. esphome/components/microphone/microphone.cpp +7 -9
  296. esphome/components/microphone/microphone.h +0 -2
  297. esphome/components/mipi_spi/display.py +1 -0
  298. esphome/components/mmc5603/mmc5603.cpp +1 -1
  299. esphome/components/modbus/modbus.cpp +33 -15
  300. esphome/components/modbus/modbus.h +9 -0
  301. esphome/components/modbus_controller/__init__.py +42 -10
  302. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  303. esphome/components/modbus_controller/modbus_controller.h +61 -7
  304. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  305. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  306. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  307. esphome/components/mqtt/__init__.py +16 -0
  308. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +2 -1
  309. esphome/components/mqtt/mqtt_backend.h +2 -1
  310. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  311. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  312. esphome/components/mqtt/mqtt_binary_sensor.cpp +1 -0
  313. esphome/components/mqtt/mqtt_button.cpp +4 -1
  314. esphome/components/mqtt/mqtt_client.cpp +17 -9
  315. esphome/components/mqtt/mqtt_client.h +8 -3
  316. esphome/components/mqtt/mqtt_climate.cpp +6 -4
  317. esphome/components/mqtt/mqtt_component.cpp +3 -1
  318. esphome/components/mqtt/mqtt_cover.cpp +1 -0
  319. esphome/components/mqtt/mqtt_date.cpp +4 -3
  320. esphome/components/mqtt/mqtt_datetime.cpp +7 -6
  321. esphome/components/mqtt/mqtt_event.cpp +6 -3
  322. esphome/components/mqtt/mqtt_fan.cpp +1 -0
  323. esphome/components/mqtt/mqtt_light.cpp +8 -4
  324. esphome/components/mqtt/mqtt_lock.cpp +3 -1
  325. esphome/components/mqtt/mqtt_number.cpp +1 -0
  326. esphome/components/mqtt/mqtt_select.cpp +2 -1
  327. esphome/components/mqtt/mqtt_sensor.cpp +3 -1
  328. esphome/components/mqtt/mqtt_switch.cpp +3 -1
  329. esphome/components/mqtt/mqtt_text.cpp +1 -0
  330. esphome/components/mqtt/mqtt_text_sensor.cpp +3 -1
  331. esphome/components/mqtt/mqtt_time.cpp +4 -3
  332. esphome/components/mqtt/mqtt_update.cpp +1 -0
  333. esphome/components/mqtt/mqtt_valve.cpp +3 -1
  334. esphome/components/ms8607/ms8607.cpp +1 -1
  335. esphome/components/ms8607/ms8607.h +0 -1
  336. esphome/components/neopixelbus/light.py +4 -1
  337. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  338. esphome/components/network/__init__.py +4 -1
  339. esphome/components/network/ip_address.h +1 -0
  340. esphome/components/nextion/__init__.py +16 -0
  341. esphome/components/nextion/base_component.py +1 -0
  342. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  343. esphome/components/nextion/display.py +14 -4
  344. esphome/components/nextion/nextion.cpp +166 -101
  345. esphome/components/nextion/nextion.h +84 -53
  346. esphome/components/nextion/nextion_commands.cpp +11 -10
  347. esphome/components/nextion/nextion_component.cpp +28 -28
  348. esphome/components/nextion/nextion_component.h +53 -18
  349. esphome/components/nextion/nextion_component_base.h +3 -0
  350. esphome/components/nextion/nextion_upload.cpp +36 -0
  351. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  352. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  353. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  354. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  355. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  356. esphome/components/nfc/nfc.cpp +3 -22
  357. esphome/components/nfc/nfc.h +3 -3
  358. esphome/components/number/__init__.py +5 -2
  359. esphome/components/online_image/__init__.py +9 -1
  360. esphome/components/online_image/online_image.cpp +17 -7
  361. esphome/components/online_image/online_image.h +10 -2
  362. esphome/components/opentherm/opentherm.cpp +7 -12
  363. esphome/components/opentherm/output/output.cpp +1 -1
  364. esphome/components/openthread/__init__.py +47 -40
  365. esphome/components/openthread/const.py +1 -0
  366. esphome/components/openthread/openthread_esp.cpp +27 -5
  367. esphome/components/opt3001/__init__.py +0 -0
  368. esphome/components/opt3001/opt3001.cpp +122 -0
  369. esphome/components/opt3001/opt3001.h +27 -0
  370. esphome/components/opt3001/sensor.py +35 -0
  371. esphome/components/ota/__init__.py +17 -0
  372. esphome/components/ota/ota_backend.h +27 -1
  373. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  374. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  375. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  376. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  377. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  378. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  379. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  380. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  381. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  382. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  383. esphome/components/packages/__init__.py +5 -2
  384. esphome/components/packet_transport/binary_sensor.py +61 -4
  385. esphome/components/packet_transport/packet_transport.cpp +34 -1
  386. esphome/components/packet_transport/packet_transport.h +11 -5
  387. esphome/components/pcf8574/__init__.py +1 -1
  388. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  389. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  390. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  391. esphome/components/pmsa003i/pmsa003i.h +0 -1
  392. esphome/components/pmsx003/pmsx003.h +0 -1
  393. esphome/components/pn7150/pn7150.cpp +7 -7
  394. esphome/components/pn7150/pn7150.h +0 -1
  395. esphome/components/pn7160/pn7160.cpp +7 -7
  396. esphome/components/pn7160/pn7160.h +0 -1
  397. esphome/components/preferences/syncer.h +2 -0
  398. esphome/components/prometheus/prometheus_handler.h +1 -1
  399. esphome/components/psram/psram.cpp +0 -20
  400. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  401. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  402. esphome/components/pulse_width/pulse_width.h +0 -1
  403. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  404. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  405. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  406. esphome/components/qr_code/__init__.py +13 -10
  407. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  408. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  409. esphome/components/rc522/rc522.h +0 -1
  410. esphome/components/rdm6300/rdm6300.h +0 -2
  411. esphome/components/remote_base/__init__.py +7 -5
  412. esphome/components/remote_base/remote_base.cpp +24 -21
  413. esphome/components/remote_base/remote_base.h +3 -26
  414. esphome/components/remote_receiver/__init__.py +40 -46
  415. esphome/components/remote_receiver/remote_receiver.h +4 -18
  416. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  417. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  418. esphome/components/remote_transmitter/__init__.py +42 -43
  419. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  420. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  421. esphome/components/resistance/resistance_sensor.h +0 -1
  422. esphome/components/rp2040/__init__.py +2 -0
  423. esphome/components/rp2040/helpers.cpp +55 -0
  424. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  425. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  426. esphome/components/rtttl/__init__.py +4 -4
  427. esphome/components/rtttl/rtttl.cpp +10 -1
  428. esphome/components/ruuvitag/ruuvitag.h +0 -1
  429. esphome/components/safe_mode/safe_mode.cpp +2 -0
  430. esphome/components/safe_mode/safe_mode.h +4 -1
  431. esphome/components/scd30/scd30.h +0 -1
  432. esphome/components/scd30/sensor.py +2 -2
  433. esphome/components/scd4x/scd4x.cpp +61 -54
  434. esphome/components/scd4x/scd4x.h +17 -15
  435. esphome/components/scd4x/sensor.py +4 -4
  436. esphome/components/script/script.h +0 -2
  437. esphome/components/sdp3x/sensor.py +1 -1
  438. esphome/components/select/__init__.py +5 -2
  439. esphome/components/sen5x/sen5x.h +0 -1
  440. esphome/components/senseair/senseair.h +0 -1
  441. esphome/components/sensor/__init__.py +4 -2
  442. esphome/components/sensor/filter.cpp +1 -1
  443. esphome/components/sensor/sensor.cpp +12 -6
  444. esphome/components/sensor/sensor.h +13 -5
  445. esphome/components/servo/servo.cpp +2 -2
  446. esphome/components/servo/servo.h +0 -1
  447. esphome/components/sfa30/sfa30.h +0 -1
  448. esphome/components/sgp30/sgp30.h +0 -1
  449. esphome/components/sgp4x/sgp4x.h +0 -1
  450. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  451. esphome/components/sht4x/sht4x.h +0 -1
  452. esphome/components/sm300d2/sm300d2.h +0 -2
  453. esphome/components/smt100/sensor.py +8 -4
  454. esphome/components/smt100/smt100.cpp +5 -5
  455. esphome/components/smt100/smt100.h +3 -3
  456. esphome/components/sn74hc595/__init__.py +1 -1
  457. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  458. esphome/components/sntp/sntp_component.cpp +9 -3
  459. esphome/components/sntp/time.py +2 -0
  460. esphome/components/socket/__init__.py +17 -0
  461. esphome/components/spi/__init__.py +27 -6
  462. esphome/components/spi/spi.cpp +3 -2
  463. esphome/components/spi/spi.h +9 -3
  464. esphome/components/spi/spi_arduino.cpp +3 -5
  465. esphome/components/spi/spi_esp_idf.cpp +40 -21
  466. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  467. esphome/components/sps30/sps30.h +0 -1
  468. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  469. esphome/components/st7701s/st7701s.cpp +0 -4
  470. esphome/components/status/status_binary_sensor.h +0 -2
  471. esphome/components/substitutions/__init__.py +81 -21
  472. esphome/components/substitutions/jinja.py +99 -0
  473. esphome/components/sun/sun.cpp +3 -4
  474. esphome/components/switch/__init__.py +5 -2
  475. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  476. esphome/components/sx126x/__init__.py +317 -0
  477. esphome/components/sx126x/automation.h +62 -0
  478. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  479. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  480. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  481. esphome/components/sx126x/sx126x.cpp +523 -0
  482. esphome/components/sx126x/sx126x.h +140 -0
  483. esphome/components/sx126x/sx126x_reg.h +163 -0
  484. esphome/components/sx127x/__init__.py +325 -0
  485. esphome/components/sx127x/automation.h +62 -0
  486. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  487. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  488. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  489. esphome/components/sx127x/sx127x.cpp +498 -0
  490. esphome/components/sx127x/sx127x.h +128 -0
  491. esphome/components/sx127x/sx127x_reg.h +295 -0
  492. esphome/components/syslog/esphome_syslog.cpp +5 -3
  493. esphome/components/syslog/esphome_syslog.h +1 -1
  494. esphome/components/tca9555/__init__.py +1 -1
  495. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  496. esphome/components/text/__init__.py +5 -2
  497. esphome/components/text_sensor/__init__.py +5 -2
  498. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  499. esphome/components/thermostat/thermostat_climate.h +43 -39
  500. esphome/components/time/__init__.py +16 -2
  501. esphome/components/time/real_time_clock.cpp +4 -0
  502. esphome/components/time/real_time_clock.h +5 -1
  503. esphome/components/tlc5971/tlc5971.cpp +4 -1
  504. esphome/components/tmp1075/tmp1075.h +0 -2
  505. esphome/components/tof10120/tof10120_sensor.h +0 -1
  506. esphome/components/tormatic/tormatic_cover.h +0 -1
  507. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  508. esphome/components/tsl2591/tsl2591.cpp +1 -1
  509. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  510. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  511. esphome/components/tx20/tx20.cpp +2 -2
  512. esphome/components/uart/__init__.py +18 -0
  513. esphome/components/uart/uart_component_esp_idf.cpp +1 -5
  514. esphome/components/update/__init__.py +5 -2
  515. esphome/components/update/update_entity.h +8 -0
  516. esphome/components/usb_host/__init__.py +5 -2
  517. esphome/components/usb_host/usb_host_client.cpp +10 -10
  518. esphome/components/usb_uart/cp210x.cpp +1 -1
  519. esphome/components/usb_uart/usb_uart.cpp +41 -44
  520. esphome/components/usb_uart/usb_uart.h +4 -3
  521. esphome/components/valve/__init__.py +5 -2
  522. esphome/components/vbus/vbus.h +0 -1
  523. esphome/components/veml3235/veml3235.h +0 -1
  524. esphome/components/veml7700/veml7700.h +0 -1
  525. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  526. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  527. esphome/components/watchdog/watchdog.cpp +0 -4
  528. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  529. esphome/components/web_server/__init__.py +34 -19
  530. esphome/components/web_server/ota/__init__.py +32 -0
  531. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  532. esphome/components/web_server/ota/ota_web_server.h +26 -0
  533. esphome/components/web_server/web_server.cpp +324 -439
  534. esphome/components/web_server/web_server.h +33 -23
  535. esphome/components/web_server/web_server_v1.cpp +4 -5
  536. esphome/components/web_server_base/__init__.py +5 -2
  537. esphome/components/web_server_base/web_server_base.cpp +2 -94
  538. esphome/components/web_server_base/web_server_base.h +5 -25
  539. esphome/components/web_server_idf/multipart.cpp +254 -0
  540. esphome/components/web_server_idf/multipart.h +86 -0
  541. esphome/components/web_server_idf/utils.cpp +32 -0
  542. esphome/components/web_server_idf/utils.h +10 -0
  543. esphome/components/web_server_idf/web_server_idf.cpp +164 -16
  544. esphome/components/web_server_idf/web_server_idf.h +11 -10
  545. esphome/components/wiegand/wiegand.cpp +2 -2
  546. esphome/components/wifi/__init__.py +18 -0
  547. esphome/components/wifi/wifi_component.cpp +17 -22
  548. esphome/components/wifi/wifi_component.h +27 -23
  549. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  550. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  551. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  552. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  553. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  554. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  555. esphome/components/wireguard/__init__.py +2 -11
  556. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  557. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  558. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  559. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  560. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  561. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  562. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  563. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  564. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  565. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  566. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  567. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  568. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  569. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  570. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  571. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  572. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  573. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  574. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  575. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  576. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  577. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  578. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  579. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  580. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  581. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  582. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  583. esphome/components/zyaura/zyaura.h +0 -1
  584. esphome/config.py +88 -22
  585. esphome/config_helpers.py +74 -1
  586. esphome/config_validation.py +12 -1
  587. esphome/const.py +65 -10
  588. esphome/core/__init__.py +18 -2
  589. esphome/core/application.cpp +169 -10
  590. esphome/core/application.h +145 -165
  591. esphome/core/area.h +19 -0
  592. esphome/core/automation.h +58 -9
  593. esphome/core/color.cpp +3 -5
  594. esphome/core/color.h +16 -16
  595. esphome/core/component.cpp +156 -22
  596. esphome/core/component.h +98 -4
  597. esphome/core/component_iterator.cpp +11 -9
  598. esphome/core/component_iterator.h +12 -10
  599. esphome/core/config.py +155 -6
  600. esphome/core/controller.cpp +4 -2
  601. esphome/core/controller.h +1 -1
  602. esphome/core/datatypes.h +2 -2
  603. esphome/core/defines.h +17 -2
  604. esphome/core/device.h +20 -0
  605. esphome/core/entity_base.cpp +20 -15
  606. esphome/core/entity_base.h +76 -0
  607. esphome/core/entity_helpers.py +168 -1
  608. esphome/core/event_pool.h +81 -0
  609. esphome/core/helpers.cpp +75 -230
  610. esphome/core/helpers.h +165 -105
  611. esphome/core/lock_free_queue.h +151 -0
  612. esphome/core/log.cpp +2 -2
  613. esphome/core/log.h +2 -0
  614. esphome/core/optional.h +5 -0
  615. esphome/core/ring_buffer.cpp +2 -2
  616. esphome/core/scheduler.cpp +275 -103
  617. esphome/core/scheduler.h +154 -17
  618. esphome/core/time.cpp +5 -5
  619. esphome/core/time.h +5 -5
  620. esphome/cpp_generator.py +17 -0
  621. esphome/cpp_helpers.py +0 -22
  622. esphome/cpp_types.py +3 -1
  623. esphome/dashboard/entries.py +1 -1
  624. esphome/dashboard/util/text.py +5 -21
  625. esphome/dashboard/web_server.py +9 -1
  626. esphome/helpers.py +47 -0
  627. esphome/loader.py +15 -1
  628. esphome/pins.py +14 -8
  629. esphome/platformio_api.py +2 -0
  630. esphome/wizard.py +17 -4
  631. esphome/writer.py +44 -3
  632. esphome/yaml_util.py +0 -2
  633. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
  634. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/RECORD +639 -580
  635. esphome/components/api/api_pb2_size.h +0 -361
  636. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  637. esphome/components/esp32_ble/queue.h +0 -85
  638. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  639. esphome/components/esp32_hall/esp32_hall.h +0 -23
  640. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  641. esphome/components/ld2410/button/reset_button.cpp +0 -9
  642. esphome/components/ld2450/button/reset_button.cpp +0 -9
  643. esphome/components/openthread/tlv.py +0 -65
  644. /esphome/{dashboard/enum.py → enum.py} +0 -0
  645. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/WHEEL +0 -0
  646. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
  647. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
  648. {esphome-2025.6.2.dist-info → esphome-2025.7.0.dist-info}/top_level.txt +0 -0
@@ -13,7 +13,7 @@
13
13
  namespace esphome {
14
14
  namespace thermostat {
15
15
 
16
- enum ThermostatClimateTimerIndex : size_t {
16
+ enum ThermostatClimateTimerIndex : uint8_t {
17
17
  TIMER_COOLING_MAX_RUN_TIME = 0,
18
18
  TIMER_COOLING_OFF = 1,
19
19
  TIMER_COOLING_ON = 2,
@@ -26,7 +26,11 @@ enum ThermostatClimateTimerIndex : size_t {
26
26
  TIMER_IDLE_ON = 9,
27
27
  };
28
28
 
29
- enum OnBootRestoreFrom : size_t { MEMORY = 0, DEFAULT_PRESET = 1 };
29
+ enum OnBootRestoreFrom : uint8_t {
30
+ MEMORY = 0,
31
+ DEFAULT_PRESET = 1,
32
+ };
33
+
30
34
  struct ThermostatClimateTimer {
31
35
  bool active;
32
36
  uint32_t time;
@@ -65,7 +69,7 @@ class ThermostatClimate : public climate::Climate, public Component {
65
69
 
66
70
  void set_default_preset(const std::string &custom_preset);
67
71
  void set_default_preset(climate::ClimatePreset preset);
68
- void set_on_boot_restore_from(thermostat::OnBootRestoreFrom on_boot_restore_from);
72
+ void set_on_boot_restore_from(OnBootRestoreFrom on_boot_restore_from);
69
73
  void set_set_point_minimum_differential(float differential);
70
74
  void set_cool_deadband(float deadband);
71
75
  void set_cool_overrun(float overrun);
@@ -240,10 +244,8 @@ class ThermostatClimate : public climate::Climate, public Component {
240
244
  void dump_preset_config_(const char *preset_name, const ThermostatClimateTargetTempConfig &config,
241
245
  bool is_default_preset);
242
246
 
243
- /// The sensor used for getting the current temperature
244
- sensor::Sensor *sensor_{nullptr};
245
- /// The sensor used for getting the current humidity
246
- sensor::Sensor *humidity_sensor_{nullptr};
247
+ /// Minimum allowable duration in seconds for action timers
248
+ const uint8_t min_timer_duration_{1};
247
249
 
248
250
  /// Whether the controller supports auto/cooling/drying/fanning/heating.
249
251
  ///
@@ -310,6 +312,31 @@ class ThermostatClimate : public climate::Climate, public Component {
310
312
  /// setup_complete_ blocks modifying/resetting the temps immediately after boot
311
313
  bool setup_complete_{false};
312
314
 
315
+ /// Store previously-known temperatures
316
+ ///
317
+ /// These are used to determine when the temperature change trigger/action needs to be called
318
+ float prev_target_temperature_{NAN};
319
+ float prev_target_temperature_low_{NAN};
320
+ float prev_target_temperature_high_{NAN};
321
+
322
+ /// Minimum differential required between set points
323
+ float set_point_minimum_differential_{0};
324
+
325
+ /// Hysteresis values used for computing climate actions
326
+ float cooling_deadband_{0};
327
+ float cooling_overrun_{0};
328
+ float heating_deadband_{0};
329
+ float heating_overrun_{0};
330
+
331
+ /// Maximum allowable temperature deltas before engaging supplemental cooling/heating actions
332
+ float supplemental_cool_delta_{0};
333
+ float supplemental_heat_delta_{0};
334
+
335
+ /// The sensor used for getting the current temperature
336
+ sensor::Sensor *sensor_{nullptr};
337
+ /// The sensor used for getting the current humidity
338
+ sensor::Sensor *humidity_sensor_{nullptr};
339
+
313
340
  /// The trigger to call when the controller should switch to cooling action/mode.
314
341
  ///
315
342
  /// A null value for this attribute means that the controller has no cooling action
@@ -399,7 +426,7 @@ class ThermostatClimate : public climate::Climate, public Component {
399
426
  /// The trigger to call when the target temperature(s) change(es).
400
427
  Trigger<> *temperature_change_trigger_{nullptr};
401
428
 
402
- /// The triggr to call when the preset mode changes
429
+ /// The trigger to call when the preset mode changes
403
430
  Trigger<> *preset_change_trigger_{nullptr};
404
431
 
405
432
  /// A reference to the trigger that was previously active.
@@ -411,6 +438,10 @@ class ThermostatClimate : public climate::Climate, public Component {
411
438
  Trigger<> *prev_mode_trigger_{nullptr};
412
439
  Trigger<> *prev_swing_mode_trigger_{nullptr};
413
440
 
441
+ /// If set to DEFAULT_PRESET then the default preset is always used. When MEMORY prior
442
+ /// state will attempt to be restored if possible
443
+ OnBootRestoreFrom on_boot_restore_from_{OnBootRestoreFrom::MEMORY};
444
+
414
445
  /// Store previously-known states
415
446
  ///
416
447
  /// These are used to determine when a trigger/action needs to be called
@@ -419,28 +450,10 @@ class ThermostatClimate : public climate::Climate, public Component {
419
450
  climate::ClimateMode prev_mode_{climate::CLIMATE_MODE_OFF};
420
451
  climate::ClimateSwingMode prev_swing_mode_{climate::CLIMATE_SWING_OFF};
421
452
 
422
- /// Store previously-known temperatures
423
- ///
424
- /// These are used to determine when the temperature change trigger/action needs to be called
425
- float prev_target_temperature_{NAN};
426
- float prev_target_temperature_low_{NAN};
427
- float prev_target_temperature_high_{NAN};
428
-
429
- /// Minimum differential required between set points
430
- float set_point_minimum_differential_{0};
431
-
432
- /// Hysteresis values used for computing climate actions
433
- float cooling_deadband_{0};
434
- float cooling_overrun_{0};
435
- float heating_deadband_{0};
436
- float heating_overrun_{0};
437
-
438
- /// Maximum allowable temperature deltas before engauging supplemental cooling/heating actions
439
- float supplemental_cool_delta_{0};
440
- float supplemental_heat_delta_{0};
441
-
442
- /// Minimum allowable duration in seconds for action timers
443
- const uint8_t min_timer_duration_{1};
453
+ /// Default standard preset to use on start up
454
+ climate::ClimatePreset default_preset_{};
455
+ /// Default custom preset to use on start up
456
+ std::string default_custom_preset_{};
444
457
 
445
458
  /// Climate action timers
446
459
  std::vector<ThermostatClimateTimer> timer_{
@@ -460,15 +473,6 @@ class ThermostatClimate : public climate::Climate, public Component {
460
473
  std::map<climate::ClimatePreset, ThermostatClimateTargetTempConfig> preset_config_{};
461
474
  /// The set of custom preset configurations this thermostat supports (eg. "My Custom Preset")
462
475
  std::map<std::string, ThermostatClimateTargetTempConfig> custom_preset_config_{};
463
-
464
- /// Default standard preset to use on start up
465
- climate::ClimatePreset default_preset_{};
466
- /// Default custom preset to use on start up
467
- std::string default_custom_preset_{};
468
-
469
- /// If set to DEFAULT_PRESET then the default preset is always used. When MEMORY prior
470
- /// state will attempt to be restored if possible
471
- thermostat::OnBootRestoreFrom on_boot_restore_from_{thermostat::OnBootRestoreFrom::MEMORY};
472
476
  };
473
477
 
474
478
  } // namespace thermostat
@@ -268,7 +268,19 @@ def validate_tz(value: str) -> str:
268
268
 
269
269
  TIME_SCHEMA = cv.Schema(
270
270
  {
271
- cv.Optional(CONF_TIMEZONE, default=detect_tz): validate_tz,
271
+ cv.SplitDefault(
272
+ CONF_TIMEZONE,
273
+ esp8266=detect_tz,
274
+ esp32=detect_tz,
275
+ rp2040=detect_tz,
276
+ bk72xx=detect_tz,
277
+ rtl87xx=detect_tz,
278
+ ln882x=detect_tz,
279
+ host=detect_tz,
280
+ ): cv.All(
281
+ cv.only_with_framework(["arduino", "esp-idf", "host"]),
282
+ validate_tz,
283
+ ),
272
284
  cv.Optional(CONF_ON_TIME): automation.validate_automation(
273
285
  {
274
286
  cv.GenerateID(CONF_TRIGGER_ID): cv.declare_id(CronTrigger),
@@ -293,7 +305,9 @@ TIME_SCHEMA = cv.Schema(
293
305
 
294
306
 
295
307
  async def setup_time_core_(time_var, config):
296
- cg.add(time_var.set_timezone(config[CONF_TIMEZONE]))
308
+ if timezone := config.get(CONF_TIMEZONE):
309
+ cg.add(time_var.set_timezone(timezone))
310
+ cg.add_define("USE_TIME_TIMEZONE")
297
311
 
298
312
  for conf in config.get(CONF_ON_TIME, []):
299
313
  trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], time_var)
@@ -35,8 +35,10 @@ void RealTimeClock::synchronize_epoch_(uint32_t epoch) {
35
35
  ret = settimeofday(&timev, nullptr);
36
36
  }
37
37
 
38
+ #ifdef USE_TIME_TIMEZONE
38
39
  // Move timezone back to local timezone.
39
40
  this->apply_timezone_();
41
+ #endif
40
42
 
41
43
  if (ret != 0) {
42
44
  ESP_LOGW(TAG, "setimeofday() failed with code %d", ret);
@@ -49,10 +51,12 @@ void RealTimeClock::synchronize_epoch_(uint32_t epoch) {
49
51
  this->time_sync_callback_.call();
50
52
  }
51
53
 
54
+ #ifdef USE_TIME_TIMEZONE
52
55
  void RealTimeClock::apply_timezone_() {
53
56
  setenv("TZ", this->timezone_.c_str(), 1);
54
57
  tzset();
55
58
  }
59
+ #endif
56
60
 
57
61
  } // namespace time
58
62
  } // namespace esphome
@@ -20,6 +20,7 @@ class RealTimeClock : public PollingComponent {
20
20
  public:
21
21
  explicit RealTimeClock();
22
22
 
23
+ #ifdef USE_TIME_TIMEZONE
23
24
  /// Set the time zone.
24
25
  void set_timezone(const std::string &tz) {
25
26
  this->timezone_ = tz;
@@ -28,6 +29,7 @@ class RealTimeClock : public PollingComponent {
28
29
 
29
30
  /// Get the time zone currently in use.
30
31
  std::string get_timezone() { return this->timezone_; }
32
+ #endif
31
33
 
32
34
  /// Get the time in the currently defined timezone.
33
35
  ESPTime now() { return ESPTime::from_epoch_local(this->timestamp_now()); }
@@ -38,7 +40,7 @@ class RealTimeClock : public PollingComponent {
38
40
  /// Get the current time as the UTC epoch since January 1st 1970.
39
41
  time_t timestamp_now() { return ::time(nullptr); }
40
42
 
41
- void add_on_time_sync_callback(std::function<void()> callback) {
43
+ void add_on_time_sync_callback(std::function<void()> &&callback) {
42
44
  this->time_sync_callback_.add(std::move(callback));
43
45
  };
44
46
 
@@ -46,8 +48,10 @@ class RealTimeClock : public PollingComponent {
46
48
  /// Report a unix epoch as current time.
47
49
  void synchronize_epoch_(uint32_t epoch);
48
50
 
51
+ #ifdef USE_TIME_TIMEZONE
49
52
  std::string timezone_{};
50
53
  void apply_timezone_();
54
+ #endif
51
55
 
52
56
  CallbackManager<void()> time_sync_callback_;
53
57
  };
@@ -24,8 +24,10 @@ void TLC5971::dump_config() {
24
24
  }
25
25
 
26
26
  void TLC5971::loop() {
27
- if (!this->update_)
27
+ if (!this->update_) {
28
+ this->disable_loop();
28
29
  return;
30
+ }
29
31
 
30
32
  uint32_t command;
31
33
 
@@ -93,6 +95,7 @@ void TLC5971::set_channel_value(uint16_t channel, uint16_t value) {
93
95
  return;
94
96
  if (this->pwm_amounts_[channel] != value) {
95
97
  this->update_ = true;
98
+ this->enable_loop();
96
99
  }
97
100
  this->pwm_amounts_[channel] = value;
98
101
  }
@@ -58,8 +58,6 @@ class TMP1075Sensor : public PollingComponent, public sensor::Sensor, public i2c
58
58
  void setup() override;
59
59
  void update() override;
60
60
 
61
- float get_setup_priority() const override { return setup_priority::DATA; }
62
-
63
61
  void dump_config() override;
64
62
 
65
63
  // Call write_config() after calling any of these to send the new config to
@@ -12,7 +12,6 @@ class TOF10120Sensor : public sensor::Sensor, public PollingComponent, public i2
12
12
  void setup() override;
13
13
 
14
14
  void dump_config() override;
15
- float get_setup_priority() const override { return setup_priority::DATA; }
16
15
  void update() override;
17
16
  };
18
17
  } // namespace tof10120
@@ -16,7 +16,6 @@ class Tormatic : public cover::Cover, public uart::UARTDevice, public PollingCom
16
16
  void loop() override;
17
17
  void update() override;
18
18
  void dump_config() override;
19
- float get_setup_priority() const override { return setup_priority::DATA; };
20
19
 
21
20
  void set_open_duration(uint32_t duration) { this->open_duration_ = duration; }
22
21
  void set_close_duration(uint32_t duration) { this->close_duration_ = duration; }
@@ -23,7 +23,6 @@ class TotalDailyEnergy : public sensor::Sensor, public Component {
23
23
  void set_method(TotalDailyEnergyMethod method) { method_ = method; }
24
24
  void setup() override;
25
25
  void dump_config() override;
26
- float get_setup_priority() const override { return setup_priority::DATA; }
27
26
  void loop() override;
28
27
 
29
28
  void publish_state_and_save(float state);
@@ -232,7 +232,7 @@ void TSL2591Component::set_integration_time_and_gain(TSL2591IntegrationTime inte
232
232
  this->integration_time_ = integration_time;
233
233
  this->gain_ = gain;
234
234
  if (!this->write_byte(TSL2591_COMMAND_BIT | TSL2591_REGISTER_CONTROL,
235
- this->integration_time_ | this->gain_)) { // NOLINT
235
+ static_cast<uint8_t>(this->integration_time_) | static_cast<uint8_t>(this->gain_))) {
236
236
  ESP_LOGE(TAG, "I2C write failed");
237
237
  }
238
238
  // The ADC values can be confused if gain or integration time are changed in the middle of a cycle.
@@ -25,7 +25,6 @@ class TTP229BSFComponent : public Component {
25
25
  void register_channel(TTP229BSFChannel *channel) { this->channels_.push_back(channel); }
26
26
  void setup() override;
27
27
  void dump_config() override;
28
- float get_setup_priority() const override { return setup_priority::DATA; }
29
28
  void loop() override {
30
29
  // check datavalid if sdo is high
31
30
  if (!this->sdo_pin_->digital_read()) {
@@ -23,7 +23,6 @@ class TTP229LSFComponent : public Component, public i2c::I2CDevice {
23
23
  void register_channel(TTP229Channel *channel) { this->channels_.push_back(channel); }
24
24
  void setup() override;
25
25
  void dump_config() override;
26
- float get_setup_priority() const override { return setup_priority::DATA; }
27
26
  void loop() override;
28
27
 
29
28
  protected:
@@ -152,7 +152,7 @@ void IRAM_ATTR Tx20ComponentStore::gpio_intr(Tx20ComponentStore *arg) {
152
152
  }
153
153
  arg->buffer[arg->buffer_index] = 1;
154
154
  arg->start_time = now;
155
- arg->buffer_index++;
155
+ arg->buffer_index++; // NOLINT(clang-diagnostic-deprecated-volatile)
156
156
  return;
157
157
  }
158
158
  const uint32_t delay = now - arg->start_time;
@@ -183,7 +183,7 @@ void IRAM_ATTR Tx20ComponentStore::gpio_intr(Tx20ComponentStore *arg) {
183
183
  }
184
184
  arg->spent_time += delay;
185
185
  arg->start_time = now;
186
- arg->buffer_index++;
186
+ arg->buffer_index++; // NOLINT(clang-diagnostic-deprecated-volatile)
187
187
  }
188
188
  void IRAM_ATTR Tx20ComponentStore::reset() {
189
189
  tx20_available = false;
@@ -2,6 +2,7 @@ import re
2
2
 
3
3
  from esphome import automation, pins
4
4
  import esphome.codegen as cg
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_AFTER,
@@ -27,6 +28,7 @@ from esphome.const import (
27
28
  CONF_TX_PIN,
28
29
  CONF_UART_ID,
29
30
  PLATFORM_HOST,
31
+ PlatformFramework,
30
32
  )
31
33
  from esphome.core import CORE
32
34
  import esphome.final_validate as fv
@@ -438,3 +440,19 @@ async def uart_write_to_code(config, action_id, template_arg, args):
438
440
  else:
439
441
  cg.add(var.set_data_static(data))
440
442
  return var
443
+
444
+
445
+ FILTER_SOURCE_FILES = filter_source_files_from_platform(
446
+ {
447
+ "uart_component_esp32_arduino.cpp": {PlatformFramework.ESP32_ARDUINO},
448
+ "uart_component_esp_idf.cpp": {PlatformFramework.ESP32_IDF},
449
+ "uart_component_esp8266.cpp": {PlatformFramework.ESP8266_ARDUINO},
450
+ "uart_component_host.cpp": {PlatformFramework.HOST_NATIVE},
451
+ "uart_component_rp2040.cpp": {PlatformFramework.RP2040_ARDUINO},
452
+ "uart_component_libretiny.cpp": {
453
+ PlatformFramework.BK72XX_ARDUINO,
454
+ PlatformFramework.RTL87XX_ARDUINO,
455
+ PlatformFramework.LN882X_ARDUINO,
456
+ },
457
+ }
458
+ )
@@ -42,17 +42,13 @@ uart_config_t IDFUARTComponent::get_config_() {
42
42
  break;
43
43
  }
44
44
 
45
- uart_config_t uart_config;
45
+ uart_config_t uart_config{};
46
46
  uart_config.baud_rate = this->baud_rate_;
47
47
  uart_config.data_bits = data_bits;
48
48
  uart_config.parity = parity;
49
49
  uart_config.stop_bits = this->stop_bits_ == 1 ? UART_STOP_BITS_1 : UART_STOP_BITS_2;
50
50
  uart_config.flow_ctrl = UART_HW_FLOWCTRL_DISABLE;
51
- #if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
52
51
  uart_config.source_clk = UART_SCLK_DEFAULT;
53
- #else
54
- uart_config.source_clk = UART_SCLK_APB;
55
- #endif
56
52
  uart_config.rx_flow_ctrl_thresh = 122;
57
53
 
58
54
  return uart_config;
@@ -15,8 +15,8 @@ from esphome.const import (
15
15
  ENTITY_CATEGORY_CONFIG,
16
16
  )
17
17
  from esphome.core import CORE, coroutine_with_priority
18
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
18
19
  from esphome.cpp_generator import MockObjClass
19
- from esphome.cpp_helpers import setup_entity
20
20
 
21
21
  CODEOWNERS = ["@jesserockz"]
22
22
  IS_PLATFORM_COMPONENT = True
@@ -58,6 +58,9 @@ _UPDATE_SCHEMA = (
58
58
  )
59
59
 
60
60
 
61
+ _UPDATE_SCHEMA.add_extra(entity_duplicate_validator("update"))
62
+
63
+
61
64
  def update_schema(
62
65
  class_: MockObjClass = cv.UNDEFINED,
63
66
  *,
@@ -87,7 +90,7 @@ UPDATE_SCHEMA.add_extra(cv.deprecated_schema_constant("update"))
87
90
 
88
91
 
89
92
  async def setup_update_core_(var, config):
90
- await setup_entity(var, config)
93
+ await setup_entity(var, config, "update")
91
94
 
92
95
  if device_class_config := config.get(CONF_DEVICE_CLASS):
93
96
  cg.add(var.set_device_class(device_class_config))
@@ -1,5 +1,6 @@
1
1
  #pragma once
2
2
 
3
+ #include <memory>
3
4
  #include "esphome/core/automation.h"
4
5
  #include "esphome/core/component.h"
5
6
  #include "esphome/core/entity_base.h"
@@ -38,12 +39,19 @@ class UpdateEntity : public EntityBase, public EntityBase_DeviceClass {
38
39
  const UpdateState &state = state_;
39
40
 
40
41
  void add_on_state_callback(std::function<void()> &&callback) { this->state_callback_.add(std::move(callback)); }
42
+ Trigger<const UpdateInfo &> *get_update_available_trigger() {
43
+ if (!update_available_trigger_) {
44
+ update_available_trigger_ = std::make_unique<Trigger<const UpdateInfo &>>();
45
+ }
46
+ return update_available_trigger_.get();
47
+ }
41
48
 
42
49
  protected:
43
50
  UpdateState state_{UPDATE_STATE_UNKNOWN};
44
51
  UpdateInfo update_info_;
45
52
 
46
53
  CallbackManager<void()> state_callback_{};
54
+ std::unique_ptr<Trigger<const UpdateInfo &>> update_available_trigger_{nullptr};
47
55
  };
48
56
 
49
57
  } // namespace update
@@ -6,7 +6,7 @@ from esphome.components.esp32 import (
6
6
  only_on_variant,
7
7
  )
8
8
  import esphome.config_validation as cv
9
- from esphome.const import CONF_ID
9
+ from esphome.const import CONF_DEVICES, CONF_ID
10
10
  from esphome.cpp_types import Component
11
11
 
12
12
  AUTO_LOAD = ["bytebuffer"]
@@ -16,9 +16,9 @@ usb_host_ns = cg.esphome_ns.namespace("usb_host")
16
16
  USBHost = usb_host_ns.class_("USBHost", Component)
17
17
  USBClient = usb_host_ns.class_("USBClient", Component)
18
18
 
19
- CONF_DEVICES = "devices"
20
19
  CONF_VID = "vid"
21
20
  CONF_PID = "pid"
21
+ CONF_ENABLE_HUBS = "enable_hubs"
22
22
 
23
23
 
24
24
  def usb_device_schema(cls=USBClient, vid: int = None, pid: [int] = None) -> cv.Schema:
@@ -42,6 +42,7 @@ CONFIG_SCHEMA = cv.All(
42
42
  cv.COMPONENT_SCHEMA.extend(
43
43
  {
44
44
  cv.GenerateID(): cv.declare_id(USBHost),
45
+ cv.Optional(CONF_ENABLE_HUBS, default=False): cv.boolean,
45
46
  cv.Optional(CONF_DEVICES): cv.ensure_list(usb_device_schema()),
46
47
  }
47
48
  ),
@@ -58,6 +59,8 @@ async def register_usb_client(config):
58
59
 
59
60
  async def to_code(config):
60
61
  add_idf_sdkconfig_option("CONFIG_USB_HOST_CONTROL_TRANSFER_MAX_SIZE", 1024)
62
+ if config.get(CONF_ENABLE_HUBS):
63
+ add_idf_sdkconfig_option("CONFIG_USB_HOST_HUBS_SUPPORTED", True)
61
64
  var = cg.new_Pvariable(config[CONF_ID])
62
65
  await cg.register_component(var, config)
63
66
  for device in config.get(CONF_DEVICES) or ():
@@ -70,7 +70,7 @@ static void usbh_print_cfg_desc(const usb_config_desc_t *cfg_desc) {
70
70
  ESP_LOGV(TAG, "bMaxPower %dmA", cfg_desc->bMaxPower * 2);
71
71
  }
72
72
 
73
- void usb_client_print_device_descriptor(const usb_device_desc_t *devc_desc) {
73
+ static void usb_client_print_device_descriptor(const usb_device_desc_t *devc_desc) {
74
74
  if (devc_desc == NULL) {
75
75
  return;
76
76
  }
@@ -92,8 +92,8 @@ void usb_client_print_device_descriptor(const usb_device_desc_t *devc_desc) {
92
92
  ESP_LOGV(TAG, "bNumConfigurations %d", devc_desc->bNumConfigurations);
93
93
  }
94
94
 
95
- void usb_client_print_config_descriptor(const usb_config_desc_t *cfg_desc,
96
- print_class_descriptor_cb class_specific_cb) {
95
+ static void usb_client_print_config_descriptor(const usb_config_desc_t *cfg_desc,
96
+ print_class_descriptor_cb class_specific_cb) {
97
97
  if (cfg_desc == nullptr) {
98
98
  return;
99
99
  }
@@ -128,9 +128,9 @@ void usb_client_print_config_descriptor(const usb_config_desc_t *cfg_desc,
128
128
  static std::string get_descriptor_string(const usb_str_desc_t *desc) {
129
129
  char buffer[256];
130
130
  if (desc == nullptr)
131
- return "(unknown)";
131
+ return "(unspecified)";
132
132
  char *p = buffer;
133
- for (size_t i = 0; i != desc->bLength / 2; i++) {
133
+ for (int i = 0; i != desc->bLength / 2; i++) {
134
134
  auto c = desc->wData[i];
135
135
  if (c < 0x100)
136
136
  *p++ = static_cast<char>(c);
@@ -169,7 +169,7 @@ void USBClient::setup() {
169
169
  this->mark_failed();
170
170
  return;
171
171
  }
172
- for (auto trq : this->trq_pool_) {
172
+ for (auto *trq : this->trq_pool_) {
173
173
  usb_host_transfer_alloc(64, 0, &trq->transfer);
174
174
  trq->client = this;
175
175
  }
@@ -197,7 +197,8 @@ void USBClient::loop() {
197
197
  ESP_LOGD(TAG, "Device descriptor: vid %X pid %X", desc->idVendor, desc->idProduct);
198
198
  if (desc->idVendor == this->vid_ && desc->idProduct == this->pid_ || this->vid_ == 0 && this->pid_ == 0) {
199
199
  usb_device_info_t dev_info;
200
- if ((err = usb_host_device_info(this->device_handle_, &dev_info)) != ESP_OK) {
200
+ err = usb_host_device_info(this->device_handle_, &dev_info);
201
+ if (err != ESP_OK) {
201
202
  ESP_LOGW(TAG, "Device info failed: %s", esp_err_to_name(err));
202
203
  this->disconnect();
203
204
  break;
@@ -336,7 +337,7 @@ static void transfer_callback(usb_transfer_t *xfer) {
336
337
  * @throws None.
337
338
  */
338
339
  void USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, uint16_t length) {
339
- auto trq = this->get_trq_();
340
+ auto *trq = this->get_trq_();
340
341
  if (trq == nullptr) {
341
342
  ESP_LOGE(TAG, "Too many requests queued");
342
343
  return;
@@ -349,7 +350,6 @@ void USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, u
349
350
  if (err != ESP_OK) {
350
351
  ESP_LOGE(TAG, "Failed to submit transfer, address=%x, length=%d, err=%x", ep_address, length, err);
351
352
  this->release_trq(trq);
352
- this->disconnect();
353
353
  }
354
354
  }
355
355
 
@@ -364,7 +364,7 @@ void USBClient::transfer_in(uint8_t ep_address, const transfer_cb_t &callback, u
364
364
  * @throws None.
365
365
  */
366
366
  void USBClient::transfer_out(uint8_t ep_address, const transfer_cb_t &callback, const uint8_t *data, uint16_t length) {
367
- auto trq = this->get_trq_();
367
+ auto *trq = this->get_trq_();
368
368
  if (trq == nullptr) {
369
369
  ESP_LOGE(TAG, "Too many requests queued");
370
370
  return;
@@ -43,7 +43,7 @@ static constexpr uint8_t SET_BAUDRATE = 0x1E; // Set the baud rate.
43
43
  static constexpr uint8_t SET_CHARS = 0x19; // Set special characters.
44
44
  static constexpr uint8_t VENDOR_SPECIFIC = 0xFF; // Vendor specific command.
45
45
 
46
- std::vector<CdcEps> USBUartTypeCP210X::parse_descriptors_(usb_device_handle_t dev_hdl) {
46
+ std::vector<CdcEps> USBUartTypeCP210X::parse_descriptors(usb_device_handle_t dev_hdl) {
47
47
  const usb_config_desc_t *config_desc;
48
48
  const usb_device_desc_t *device_desc;
49
49
  int conf_offset = 0, ep_offset;