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
@@ -7,43 +7,26 @@ namespace binary_sensor {
7
7
 
8
8
  static const char *const TAG = "binary_sensor";
9
9
 
10
- void BinarySensor::add_on_state_callback(std::function<void(bool)> &&callback) {
11
- this->state_callback_.add(std::move(callback));
12
- }
13
-
14
- void BinarySensor::publish_state(bool state) {
15
- if (!this->publish_dedup_.next(state))
16
- return;
10
+ void BinarySensor::publish_state(bool new_state) {
17
11
  if (this->filter_list_ == nullptr) {
18
- this->send_state_internal(state, false);
12
+ this->send_state_internal(new_state);
19
13
  } else {
20
- this->filter_list_->input(state, false);
14
+ this->filter_list_->input(new_state);
21
15
  }
22
16
  }
23
- void BinarySensor::publish_initial_state(bool state) {
24
- if (!this->publish_dedup_.next(state))
25
- return;
26
- if (this->filter_list_ == nullptr) {
27
- this->send_state_internal(state, true);
28
- } else {
29
- this->filter_list_->input(state, true);
30
- }
17
+ void BinarySensor::publish_initial_state(bool new_state) {
18
+ this->invalidate_state();
19
+ this->publish_state(new_state);
31
20
  }
32
- void BinarySensor::send_state_internal(bool state, bool is_initial) {
33
- if (is_initial) {
34
- ESP_LOGD(TAG, "'%s': Sending initial state %s", this->get_name().c_str(), ONOFF(state));
35
- } else {
36
- ESP_LOGD(TAG, "'%s': Sending state %s", this->get_name().c_str(), ONOFF(state));
37
- }
38
- this->has_state_ = true;
39
- this->state = state;
40
- if (!is_initial || this->publish_initial_state_) {
41
- this->state_callback_.call(state);
21
+ void BinarySensor::send_state_internal(bool new_state) {
22
+ // copy the new state to the visible property for backwards compatibility, before any callbacks
23
+ this->state = new_state;
24
+ // Note that set_state_ de-dups and will only trigger callbacks if the state has actually changed
25
+ if (this->set_state_(new_state)) {
26
+ ESP_LOGD(TAG, "'%s': New state is %s", this->get_name().c_str(), ONOFF(new_state));
42
27
  }
43
28
  }
44
29
 
45
- BinarySensor::BinarySensor() : state(false) {}
46
-
47
30
  void BinarySensor::add_filter(Filter *filter) {
48
31
  filter->parent_ = this;
49
32
  if (this->filter_list_ == nullptr) {
@@ -60,7 +43,6 @@ void BinarySensor::add_filters(const std::vector<Filter *> &filters) {
60
43
  this->add_filter(filter);
61
44
  }
62
45
  }
63
- bool BinarySensor::has_state() const { return this->has_state_; }
64
46
  bool BinarySensor::is_status_binary_sensor() const { return false; }
65
47
 
66
48
  } // namespace binary_sensor
@@ -1,6 +1,5 @@
1
1
  #pragma once
2
2
 
3
- #include "esphome/core/component.h"
4
3
  #include "esphome/core/entity_base.h"
5
4
  #include "esphome/core/helpers.h"
6
5
  #include "esphome/components/binary_sensor/filter.h"
@@ -34,52 +33,39 @@ namespace binary_sensor {
34
33
  * The sub classes should notify the front-end of new states via the publish_state() method which
35
34
  * handles inverted inputs for you.
36
35
  */
37
- class BinarySensor : public EntityBase, public EntityBase_DeviceClass {
36
+ class BinarySensor : public StatefulEntityBase<bool>, public EntityBase_DeviceClass {
38
37
  public:
39
- explicit BinarySensor();
40
-
41
- /** Add a callback to be notified of state changes.
42
- *
43
- * @param callback The void(bool) callback.
44
- */
45
- void add_on_state_callback(std::function<void(bool)> &&callback);
38
+ explicit BinarySensor(){};
46
39
 
47
40
  /** Publish a new state to the front-end.
48
41
  *
49
- * @param state The new state.
42
+ * @param new_state The new state.
50
43
  */
51
- void publish_state(bool state);
44
+ void publish_state(bool new_state);
52
45
 
53
46
  /** Publish the initial state, this will not make the callback manager send callbacks
54
47
  * and is meant only for the initial state on boot.
55
48
  *
56
- * @param state The new state.
49
+ * @param new_state The new state.
57
50
  */
58
- void publish_initial_state(bool state);
59
-
60
- /// The current reported state of the binary sensor.
61
- bool state{false};
51
+ void publish_initial_state(bool new_state);
62
52
 
63
53
  void add_filter(Filter *filter);
64
54
  void add_filters(const std::vector<Filter *> &filters);
65
55
 
66
- void set_publish_initial_state(bool publish_initial_state) { this->publish_initial_state_ = publish_initial_state; }
67
-
68
56
  // ========== INTERNAL METHODS ==========
69
57
  // (In most use cases you won't need these)
70
- void send_state_internal(bool state, bool is_initial);
58
+ void send_state_internal(bool new_state);
71
59
 
72
60
  /// Return whether this binary sensor has outputted a state.
73
- virtual bool has_state() const;
74
-
75
61
  virtual bool is_status_binary_sensor() const;
76
62
 
63
+ // For backward compatibility, provide an accessible property
64
+
65
+ bool state{};
66
+
77
67
  protected:
78
- CallbackManager<void(bool)> state_callback_{};
79
68
  Filter *filter_list_{nullptr};
80
- bool has_state_{false};
81
- bool publish_initial_state_{false};
82
- Deduplicator<bool> publish_dedup_;
83
69
  };
84
70
 
85
71
  class BinarySensorInitiallyOff : public BinarySensor {
@@ -9,37 +9,42 @@ namespace binary_sensor {
9
9
 
10
10
  static const char *const TAG = "sensor.filter";
11
11
 
12
- void Filter::output(bool value, bool is_initial) {
13
- if (!this->dedup_.next(value))
14
- return;
15
-
12
+ void Filter::output(bool value) {
16
13
  if (this->next_ == nullptr) {
17
- this->parent_->send_state_internal(value, is_initial);
14
+ this->parent_->send_state_internal(value);
18
15
  } else {
19
- this->next_->input(value, is_initial);
16
+ this->next_->input(value);
20
17
  }
21
18
  }
22
- void Filter::input(bool value, bool is_initial) {
23
- auto b = this->new_value(value, is_initial);
19
+ void Filter::input(bool value) {
20
+ if (!this->dedup_.next(value))
21
+ return;
22
+ auto b = this->new_value(value);
24
23
  if (b.has_value()) {
25
- this->output(*b, is_initial);
24
+ this->output(*b);
26
25
  }
27
26
  }
28
27
 
29
- optional<bool> DelayedOnOffFilter::new_value(bool value, bool is_initial) {
28
+ void TimeoutFilter::input(bool value) {
29
+ this->set_timeout("timeout", this->timeout_delay_.value(), [this]() { this->parent_->invalidate_state(); });
30
+ // we do not de-dup here otherwise changes from invalid to valid state will not be output
31
+ this->output(value);
32
+ }
33
+
34
+ optional<bool> DelayedOnOffFilter::new_value(bool value) {
30
35
  if (value) {
31
- this->set_timeout("ON_OFF", this->on_delay_.value(), [this, is_initial]() { this->output(true, is_initial); });
36
+ this->set_timeout("ON_OFF", this->on_delay_.value(), [this]() { this->output(true); });
32
37
  } else {
33
- this->set_timeout("ON_OFF", this->off_delay_.value(), [this, is_initial]() { this->output(false, is_initial); });
38
+ this->set_timeout("ON_OFF", this->off_delay_.value(), [this]() { this->output(false); });
34
39
  }
35
40
  return {};
36
41
  }
37
42
 
38
43
  float DelayedOnOffFilter::get_setup_priority() const { return setup_priority::HARDWARE; }
39
44
 
40
- optional<bool> DelayedOnFilter::new_value(bool value, bool is_initial) {
45
+ optional<bool> DelayedOnFilter::new_value(bool value) {
41
46
  if (value) {
42
- this->set_timeout("ON", this->delay_.value(), [this, is_initial]() { this->output(true, is_initial); });
47
+ this->set_timeout("ON", this->delay_.value(), [this]() { this->output(true); });
43
48
  return {};
44
49
  } else {
45
50
  this->cancel_timeout("ON");
@@ -49,9 +54,9 @@ optional<bool> DelayedOnFilter::new_value(bool value, bool is_initial) {
49
54
 
50
55
  float DelayedOnFilter::get_setup_priority() const { return setup_priority::HARDWARE; }
51
56
 
52
- optional<bool> DelayedOffFilter::new_value(bool value, bool is_initial) {
57
+ optional<bool> DelayedOffFilter::new_value(bool value) {
53
58
  if (!value) {
54
- this->set_timeout("OFF", this->delay_.value(), [this, is_initial]() { this->output(false, is_initial); });
59
+ this->set_timeout("OFF", this->delay_.value(), [this]() { this->output(false); });
55
60
  return {};
56
61
  } else {
57
62
  this->cancel_timeout("OFF");
@@ -61,11 +66,11 @@ optional<bool> DelayedOffFilter::new_value(bool value, bool is_initial) {
61
66
 
62
67
  float DelayedOffFilter::get_setup_priority() const { return setup_priority::HARDWARE; }
63
68
 
64
- optional<bool> InvertFilter::new_value(bool value, bool is_initial) { return !value; }
69
+ optional<bool> InvertFilter::new_value(bool value) { return !value; }
65
70
 
66
71
  AutorepeatFilter::AutorepeatFilter(std::vector<AutorepeatFilterTiming> timings) : timings_(std::move(timings)) {}
67
72
 
68
- optional<bool> AutorepeatFilter::new_value(bool value, bool is_initial) {
73
+ optional<bool> AutorepeatFilter::new_value(bool value) {
69
74
  if (value) {
70
75
  // Ignore if already running
71
76
  if (this->active_timing_ != 0)
@@ -101,7 +106,7 @@ void AutorepeatFilter::next_timing_() {
101
106
 
102
107
  void AutorepeatFilter::next_value_(bool val) {
103
108
  const AutorepeatFilterTiming &timing = this->timings_[this->active_timing_ - 2];
104
- this->output(val, false); // This is at least the second one so not initial
109
+ this->output(val); // This is at least the second one so not initial
105
110
  this->set_timeout("ON_OFF", val ? timing.time_on : timing.time_off, [this, val]() { this->next_value_(!val); });
106
111
  }
107
112
 
@@ -109,18 +114,18 @@ float AutorepeatFilter::get_setup_priority() const { return setup_priority::HARD
109
114
 
110
115
  LambdaFilter::LambdaFilter(std::function<optional<bool>(bool)> f) : f_(std::move(f)) {}
111
116
 
112
- optional<bool> LambdaFilter::new_value(bool value, bool is_initial) { return this->f_(value); }
117
+ optional<bool> LambdaFilter::new_value(bool value) { return this->f_(value); }
113
118
 
114
- optional<bool> SettleFilter::new_value(bool value, bool is_initial) {
119
+ optional<bool> SettleFilter::new_value(bool value) {
115
120
  if (!this->steady_) {
116
- this->set_timeout("SETTLE", this->delay_.value(), [this, value, is_initial]() {
121
+ this->set_timeout("SETTLE", this->delay_.value(), [this, value]() {
117
122
  this->steady_ = true;
118
- this->output(value, is_initial);
123
+ this->output(value);
119
124
  });
120
125
  return {};
121
126
  } else {
122
127
  this->steady_ = false;
123
- this->output(value, is_initial);
128
+ this->output(value);
124
129
  this->set_timeout("SETTLE", this->delay_.value(), [this]() { this->steady_ = true; });
125
130
  return value;
126
131
  }
@@ -14,11 +14,11 @@ class BinarySensor;
14
14
 
15
15
  class Filter {
16
16
  public:
17
- virtual optional<bool> new_value(bool value, bool is_initial) = 0;
17
+ virtual optional<bool> new_value(bool value) = 0;
18
18
 
19
- void input(bool value, bool is_initial);
19
+ virtual void input(bool value);
20
20
 
21
- void output(bool value, bool is_initial);
21
+ void output(bool value);
22
22
 
23
23
  protected:
24
24
  friend BinarySensor;
@@ -28,9 +28,19 @@ class Filter {
28
28
  Deduplicator<bool> dedup_;
29
29
  };
30
30
 
31
+ class TimeoutFilter : public Filter, public Component {
32
+ public:
33
+ optional<bool> new_value(bool value) override { return value; }
34
+ void input(bool value) override;
35
+ template<typename T> void set_timeout_value(T timeout) { this->timeout_delay_ = timeout; }
36
+
37
+ protected:
38
+ TemplatableValue<uint32_t> timeout_delay_{};
39
+ };
40
+
31
41
  class DelayedOnOffFilter : public Filter, public Component {
32
42
  public:
33
- optional<bool> new_value(bool value, bool is_initial) override;
43
+ optional<bool> new_value(bool value) override;
34
44
 
35
45
  float get_setup_priority() const override;
36
46
 
@@ -44,7 +54,7 @@ class DelayedOnOffFilter : public Filter, public Component {
44
54
 
45
55
  class DelayedOnFilter : public Filter, public Component {
46
56
  public:
47
- optional<bool> new_value(bool value, bool is_initial) override;
57
+ optional<bool> new_value(bool value) override;
48
58
 
49
59
  float get_setup_priority() const override;
50
60
 
@@ -56,7 +66,7 @@ class DelayedOnFilter : public Filter, public Component {
56
66
 
57
67
  class DelayedOffFilter : public Filter, public Component {
58
68
  public:
59
- optional<bool> new_value(bool value, bool is_initial) override;
69
+ optional<bool> new_value(bool value) override;
60
70
 
61
71
  float get_setup_priority() const override;
62
72
 
@@ -68,7 +78,7 @@ class DelayedOffFilter : public Filter, public Component {
68
78
 
69
79
  class InvertFilter : public Filter {
70
80
  public:
71
- optional<bool> new_value(bool value, bool is_initial) override;
81
+ optional<bool> new_value(bool value) override;
72
82
  };
73
83
 
74
84
  struct AutorepeatFilterTiming {
@@ -86,7 +96,7 @@ class AutorepeatFilter : public Filter, public Component {
86
96
  public:
87
97
  explicit AutorepeatFilter(std::vector<AutorepeatFilterTiming> timings);
88
98
 
89
- optional<bool> new_value(bool value, bool is_initial) override;
99
+ optional<bool> new_value(bool value) override;
90
100
 
91
101
  float get_setup_priority() const override;
92
102
 
@@ -102,7 +112,7 @@ class LambdaFilter : public Filter {
102
112
  public:
103
113
  explicit LambdaFilter(std::function<optional<bool>(bool)> f);
104
114
 
105
- optional<bool> new_value(bool value, bool is_initial) override;
115
+ optional<bool> new_value(bool value) override;
106
116
 
107
117
  protected:
108
118
  std::function<optional<bool>(bool)> f_;
@@ -110,7 +120,7 @@ class LambdaFilter : public Filter {
110
120
 
111
121
  class SettleFilter : public Filter, public Component {
112
122
  public:
113
- optional<bool> new_value(bool value, bool is_initial) override;
123
+ optional<bool> new_value(bool value) override;
114
124
 
115
125
  float get_setup_priority() const override;
116
126
 
@@ -16,7 +16,6 @@ class BLEBinaryOutput : public output::BinaryOutput, public BLEClientNode, publi
16
16
  public:
17
17
  void dump_config() override;
18
18
  void loop() override {}
19
- float get_setup_priority() const override { return setup_priority::DATA; }
20
19
  void set_service_uuid16(uint16_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint16(uuid); }
21
20
  void set_service_uuid32(uint32_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint32(uuid); }
22
21
  void set_service_uuid128(uint8_t *uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_raw(uuid); }
@@ -11,7 +11,11 @@ namespace ble_client {
11
11
 
12
12
  static const char *const TAG = "ble_rssi_sensor";
13
13
 
14
- void BLEClientRSSISensor::loop() {}
14
+ void BLEClientRSSISensor::loop() {
15
+ // Parent BLEClientNode has a loop() method, but this component uses
16
+ // polling via update() and BLE GAP callbacks so loop isn't needed
17
+ this->disable_loop();
18
+ }
15
19
 
16
20
  void BLEClientRSSISensor::dump_config() {
17
21
  LOG_SENSOR("", "BLE Client RSSI Sensor", this);
@@ -18,7 +18,6 @@ class BLEClientRSSISensor : public sensor::Sensor, public PollingComponent, publ
18
18
  void loop() override;
19
19
  void update() override;
20
20
  void dump_config() override;
21
- float get_setup_priority() const override { return setup_priority::DATA; }
22
21
 
23
22
  void gap_event_handler(esp_gap_ble_cb_event_t event, esp_ble_gap_cb_param_t *param) override;
24
23
 
@@ -11,7 +11,11 @@ namespace ble_client {
11
11
 
12
12
  static const char *const TAG = "ble_sensor";
13
13
 
14
- void BLESensor::loop() {}
14
+ void BLESensor::loop() {
15
+ // Parent BLEClientNode has a loop() method, but this component uses
16
+ // polling via update() and BLE callbacks so loop isn't needed
17
+ this->disable_loop();
18
+ }
15
19
 
16
20
  void BLESensor::dump_config() {
17
21
  LOG_SENSOR("", "BLE Sensor", this);
@@ -24,7 +24,6 @@ class BLESensor : public sensor::Sensor, public PollingComponent, public BLEClie
24
24
  void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
25
25
  esp_ble_gattc_cb_param_t *param) override;
26
26
  void dump_config() override;
27
- float get_setup_priority() const override { return setup_priority::DATA; }
28
27
  void set_service_uuid16(uint16_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint16(uuid); }
29
28
  void set_service_uuid32(uint32_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint32(uuid); }
30
29
  void set_service_uuid128(uint8_t *uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_raw(uuid); }
@@ -19,7 +19,6 @@ class BLEClientSwitch : public switch_::Switch, public Component, public BLEClie
19
19
  void loop() override {}
20
20
  void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
21
21
  esp_ble_gattc_cb_param_t *param) override;
22
- float get_setup_priority() const override { return setup_priority::DATA; }
23
22
 
24
23
  protected:
25
24
  void write_state(bool state) override;
@@ -14,7 +14,11 @@ static const char *const TAG = "ble_text_sensor";
14
14
 
15
15
  static const std::string EMPTY = "";
16
16
 
17
- void BLETextSensor::loop() {}
17
+ void BLETextSensor::loop() {
18
+ // Parent BLEClientNode has a loop() method, but this component uses
19
+ // polling via update() and BLE callbacks so loop isn't needed
20
+ this->disable_loop();
21
+ }
18
22
 
19
23
  void BLETextSensor::dump_config() {
20
24
  LOG_TEXT_SENSOR("", "BLE Text Sensor", this);
@@ -20,7 +20,6 @@ class BLETextSensor : public text_sensor::TextSensor, public PollingComponent, p
20
20
  void gattc_event_handler(esp_gattc_cb_event_t event, esp_gatt_if_t gattc_if,
21
21
  esp_ble_gattc_cb_param_t *param) override;
22
22
  void dump_config() override;
23
- float get_setup_priority() const override { return setup_priority::DATA; }
24
23
  void set_service_uuid16(uint16_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint16(uuid); }
25
24
  void set_service_uuid32(uint32_t uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_uint32(uuid); }
26
25
  void set_service_uuid128(uint8_t *uuid) { this->service_uuid_ = espbt::ESPBTUUID::from_raw(uuid); }
@@ -105,7 +105,6 @@ class BLEPresenceDevice : public binary_sensor::BinarySensorInitiallyOff,
105
105
  this->set_found_(false);
106
106
  }
107
107
  void dump_config() override;
108
- float get_setup_priority() const override { return setup_priority::DATA; }
109
108
 
110
109
  protected:
111
110
  void set_found_(bool state) {
@@ -99,7 +99,6 @@ class BLERSSISensor : public sensor::Sensor, public esp32_ble_tracker::ESPBTDevi
99
99
  return false;
100
100
  }
101
101
  void dump_config() override;
102
- float get_setup_priority() const override { return setup_priority::DATA; }
103
102
 
104
103
  protected:
105
104
  enum MatchType { MATCH_BY_MAC_ADDRESS, MATCH_BY_IRK, MATCH_BY_SERVICE_UUID, MATCH_BY_IBEACON_UUID };
@@ -29,7 +29,6 @@ class BLEScanner : public text_sensor::TextSensor, public esp32_ble_tracker::ESP
29
29
  return true;
30
30
  }
31
31
  void dump_config() override;
32
- float get_setup_priority() const override { return setup_priority::DATA; }
33
32
  };
34
33
 
35
34
  } // namespace ble_scanner
@@ -26,10 +26,17 @@ class BluetoothConnection : public esp32_ble_client::BLEClientBase {
26
26
 
27
27
  protected:
28
28
  friend class BluetoothProxy;
29
- bool seen_mtu_or_services_{false};
30
29
 
31
- int16_t send_service_{-2};
30
+ // Memory optimized layout for 32-bit systems
31
+ // Group 1: Pointers (4 bytes each, naturally aligned)
32
32
  BluetoothProxy *proxy_;
33
+
34
+ // Group 2: 2-byte types
35
+ int16_t send_service_{-2}; // Needs to handle negative values and service count
36
+
37
+ // Group 3: 1-byte types
38
+ bool seen_mtu_or_services_{false};
39
+ // 1 byte used, 1 byte padding
33
40
  };
34
41
 
35
42
  } // namespace bluetooth_proxy
@@ -52,11 +52,21 @@ bool BluetoothProxy::parse_device(const esp32_ble_tracker::ESPBTDevice &device)
52
52
  return true;
53
53
  }
54
54
 
55
- static constexpr size_t FLUSH_BATCH_SIZE = 8;
56
- static std::vector<api::BluetoothLERawAdvertisement> &get_batch_buffer() {
57
- static std::vector<api::BluetoothLERawAdvertisement> batch_buffer;
58
- return batch_buffer;
59
- }
55
+ // Batch size for BLE advertisements to maximize WiFi efficiency
56
+ // Each advertisement is up to 80 bytes when packaged (including protocol overhead)
57
+ // Most advertisements are 20-30 bytes, allowing even more to fit per packet
58
+ // 16 advertisements × 80 bytes (worst case) = 1280 bytes out of ~1320 bytes usable payload
59
+ // This achieves ~97% WiFi MTU utilization while staying under the limit
60
+ static constexpr size_t FLUSH_BATCH_SIZE = 16;
61
+
62
+ namespace {
63
+ // Batch buffer in anonymous namespace to avoid guard variable (saves 8 bytes)
64
+ // This is initialized at program startup before any threads
65
+ // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
66
+ std::vector<api::BluetoothLERawAdvertisement> batch_buffer;
67
+ } // namespace
68
+
69
+ static std::vector<api::BluetoothLERawAdvertisement> &get_batch_buffer() { return batch_buffer; }
60
70
 
61
71
  bool BluetoothProxy::parse_devices(const esp32_ble::BLEScanResult *scan_results, size_t count) {
62
72
  if (!api::global_api_server->is_connected() || this->api_connection_ == nullptr || !this->raw_advertisements_)
@@ -170,7 +180,7 @@ int BluetoothProxy::get_bluetooth_connections_free() {
170
180
  void BluetoothProxy::loop() {
171
181
  if (!api::global_api_server->is_connected() || this->api_connection_ == nullptr) {
172
182
  for (auto *connection : this->connections_) {
173
- if (connection->get_address() != 0) {
183
+ if (connection->get_address() != 0 && !connection->disconnect_pending()) {
174
184
  connection->disconnect();
175
185
  }
176
186
  }
@@ -134,11 +134,17 @@ class BluetoothProxy : public esp32_ble_tracker::ESPBTDeviceListener, public Com
134
134
 
135
135
  BluetoothConnection *get_connection_(uint64_t address, bool reserve);
136
136
 
137
- bool active_;
137
+ // Memory optimized layout for 32-bit systems
138
+ // Group 1: Pointers (4 bytes each, naturally aligned)
139
+ api::APIConnection *api_connection_{nullptr};
138
140
 
141
+ // Group 2: Container types (typically 12 bytes on 32-bit)
139
142
  std::vector<BluetoothConnection *> connections_{};
140
- api::APIConnection *api_connection_{nullptr};
143
+
144
+ // Group 3: 1-byte types grouped together
145
+ bool active_;
141
146
  bool raw_advertisements_{false};
147
+ // 2 bytes used, 2 bytes padding
142
148
  };
143
149
 
144
150
  extern BluetoothProxy *global_bluetooth_proxy; // NOLINT(cppcoreguidelines-avoid-non-const-global-variables)
@@ -12,8 +12,8 @@ from esphome.const import (
12
12
  CONF_OVERSAMPLING,
13
13
  CONF_PRESSURE,
14
14
  CONF_TEMPERATURE,
15
- DEVICE_CLASS_HUMIDITY,
16
15
  DEVICE_CLASS_ATMOSPHERIC_PRESSURE,
16
+ DEVICE_CLASS_HUMIDITY,
17
17
  DEVICE_CLASS_TEMPERATURE,
18
18
  ICON_GAS_CYLINDER,
19
19
  STATE_CLASS_MEASUREMENT,
@@ -61,8 +61,6 @@ enum IIRFilter {
61
61
 
62
62
  class BMP581Component : public PollingComponent, public i2c::I2CDevice {
63
63
  public:
64
- float get_setup_priority() const override { return setup_priority::DATA; }
65
-
66
64
  void dump_config() override;
67
65
 
68
66
  void setup() override;
@@ -18,8 +18,8 @@ from esphome.const import (
18
18
  DEVICE_CLASS_UPDATE,
19
19
  )
20
20
  from esphome.core import CORE, coroutine_with_priority
21
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
21
22
  from esphome.cpp_generator import MockObjClass
22
- from esphome.cpp_helpers import setup_entity
23
23
 
24
24
  CODEOWNERS = ["@esphome/core"]
25
25
  IS_PLATFORM_COMPONENT = True
@@ -61,6 +61,9 @@ _BUTTON_SCHEMA = (
61
61
  )
62
62
 
63
63
 
64
+ _BUTTON_SCHEMA.add_extra(entity_duplicate_validator("button"))
65
+
66
+
64
67
  def button_schema(
65
68
  class_: MockObjClass,
66
69
  *,
@@ -87,7 +90,7 @@ BUTTON_SCHEMA.add_extra(cv.deprecated_schema_constant("button"))
87
90
 
88
91
 
89
92
  async def setup_button_core_(var, config):
90
- await setup_entity(var, config)
93
+ await setup_entity(var, config, "button")
91
94
 
92
95
  for conf in config.get(CONF_ON_PRESS, []):
93
96
  trigger = cg.new_Pvariable(conf[CONF_TRIGGER_ID], var)
@@ -0,0 +1 @@
1
+ CODEOWNERS = ["@DT-art1", "@bdraco"]
@@ -0,0 +1,22 @@
1
+ #include "camera.h"
2
+
3
+ namespace esphome {
4
+ namespace camera {
5
+
6
+ // NOLINTNEXTLINE(cppcoreguidelines-avoid-non-const-global-variables)
7
+ Camera *Camera::global_camera = nullptr;
8
+
9
+ Camera::Camera() {
10
+ if (global_camera != nullptr) {
11
+ this->status_set_error("Multiple cameras are configured, but only one is supported.");
12
+ this->mark_failed();
13
+ return;
14
+ }
15
+
16
+ global_camera = this;
17
+ }
18
+
19
+ Camera *Camera::instance() { return global_camera; }
20
+
21
+ } // namespace camera
22
+ } // namespace esphome