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
@@ -1,12 +1,12 @@
1
1
  #pragma once
2
2
 
3
- #include <iomanip>
4
- #include <map>
5
3
  #include "esphome/components/uart/uart.h"
6
4
  #include "esphome/core/component.h"
7
5
  #include "esphome/core/defines.h"
8
6
  #include "esphome/core/helpers.h"
9
7
  #include "esphome/core/preferences.h"
8
+ #include <limits>
9
+ #include <cmath>
10
10
  #ifdef USE_SENSOR
11
11
  #include "esphome/components/sensor/sensor.h"
12
12
  #endif
@@ -38,10 +38,18 @@ namespace ld2450 {
38
38
 
39
39
  // Constants
40
40
  static const uint8_t DEFAULT_PRESENCE_TIMEOUT = 5; // Timeout to reset presense status 5 sec.
41
- static const uint8_t MAX_LINE_LENGTH = 60; // Max characters for serial buffer
41
+ static const uint8_t MAX_LINE_LENGTH = 41; // Max characters for serial buffer
42
42
  static const uint8_t MAX_TARGETS = 3; // Max 3 Targets in LD2450
43
43
  static const uint8_t MAX_ZONES = 3; // Max 3 Zones in LD2450
44
44
 
45
+ enum Direction : uint8_t {
46
+ DIRECTION_APPROACHING = 0,
47
+ DIRECTION_MOVING_AWAY = 1,
48
+ DIRECTION_STATIONARY = 2,
49
+ DIRECTION_NA = 3,
50
+ DIRECTION_UNDEFINED = 4,
51
+ };
52
+
45
53
  // Target coordinate struct
46
54
  struct Target {
47
55
  int16_t x;
@@ -66,63 +74,23 @@ struct ZoneOfNumbers {
66
74
  };
67
75
  #endif
68
76
 
69
- enum BaudRateStructure : uint8_t {
70
- BAUD_RATE_9600 = 1,
71
- BAUD_RATE_19200 = 2,
72
- BAUD_RATE_38400 = 3,
73
- BAUD_RATE_57600 = 4,
74
- BAUD_RATE_115200 = 5,
75
- BAUD_RATE_230400 = 6,
76
- BAUD_RATE_256000 = 7,
77
- BAUD_RATE_460800 = 8
78
- };
79
-
80
- // Convert baud rate enum to int
81
- static const std::map<std::string, uint8_t> BAUD_RATE_ENUM_TO_INT{
82
- {"9600", BAUD_RATE_9600}, {"19200", BAUD_RATE_19200}, {"38400", BAUD_RATE_38400},
83
- {"57600", BAUD_RATE_57600}, {"115200", BAUD_RATE_115200}, {"230400", BAUD_RATE_230400},
84
- {"256000", BAUD_RATE_256000}, {"460800", BAUD_RATE_460800}};
85
-
86
- // Zone type struct
87
- enum ZoneTypeStructure : uint8_t { ZONE_DISABLED = 0, ZONE_DETECTION = 1, ZONE_FILTER = 2 };
88
-
89
- // Convert zone type int to enum
90
- static const std::map<ZoneTypeStructure, std::string> ZONE_TYPE_INT_TO_ENUM{
91
- {ZONE_DISABLED, "Disabled"}, {ZONE_DETECTION, "Detection"}, {ZONE_FILTER, "Filter"}};
92
-
93
- // Convert zone type enum to int
94
- static const std::map<std::string, uint8_t> ZONE_TYPE_ENUM_TO_INT{
95
- {"Disabled", ZONE_DISABLED}, {"Detection", ZONE_DETECTION}, {"Filter", ZONE_FILTER}};
96
-
97
- // LD2450 serial command header & footer
98
- static const uint8_t CMD_FRAME_HEADER[4] = {0xFD, 0xFC, 0xFB, 0xFA};
99
- static const uint8_t CMD_FRAME_END[4] = {0x04, 0x03, 0x02, 0x01};
100
-
101
- enum PeriodicDataStructure : uint8_t {
102
- TARGET_X = 4,
103
- TARGET_Y = 6,
104
- TARGET_SPEED = 8,
105
- TARGET_RESOLUTION = 10,
106
- };
107
-
108
- enum PeriodicDataValue : uint8_t { HEAD = 0xAA, END = 0x55, CHECK = 0x00 };
109
-
110
- enum AckDataStructure : uint8_t { COMMAND = 6, COMMAND_STATUS = 7 };
111
-
112
77
  class LD2450Component : public Component, public uart::UARTDevice {
113
- #ifdef USE_SENSOR
114
- SUB_SENSOR(target_count)
115
- SUB_SENSOR(still_target_count)
116
- SUB_SENSOR(moving_target_count)
117
- #endif
118
78
  #ifdef USE_BINARY_SENSOR
119
- SUB_BINARY_SENSOR(target)
120
79
  SUB_BINARY_SENSOR(moving_target)
121
80
  SUB_BINARY_SENSOR(still_target)
81
+ SUB_BINARY_SENSOR(target)
82
+ #endif
83
+ #ifdef USE_SENSOR
84
+ SUB_SENSOR(moving_target_count)
85
+ SUB_SENSOR(still_target_count)
86
+ SUB_SENSOR(target_count)
122
87
  #endif
123
88
  #ifdef USE_TEXT_SENSOR
124
- SUB_TEXT_SENSOR(version)
125
89
  SUB_TEXT_SENSOR(mac)
90
+ SUB_TEXT_SENSOR(version)
91
+ #endif
92
+ #ifdef USE_NUMBER
93
+ SUB_NUMBER(presence_timeout)
126
94
  #endif
127
95
  #ifdef USE_SELECT
128
96
  SUB_SELECT(baud_rate)
@@ -133,20 +101,16 @@ class LD2450Component : public Component, public uart::UARTDevice {
133
101
  SUB_SWITCH(multi_target)
134
102
  #endif
135
103
  #ifdef USE_BUTTON
136
- SUB_BUTTON(reset)
104
+ SUB_BUTTON(factory_reset)
137
105
  SUB_BUTTON(restart)
138
106
  #endif
139
- #ifdef USE_NUMBER
140
- SUB_NUMBER(presence_timeout)
141
- #endif
142
107
 
143
108
  public:
144
- LD2450Component();
145
109
  void setup() override;
146
110
  void dump_config() override;
147
111
  void loop() override;
148
112
  void set_presence_timeout();
149
- void set_throttle(uint16_t value) { this->throttle_ = value; };
113
+ void set_throttle(uint16_t value) { this->throttle_ = value; }
150
114
  void read_all_info();
151
115
  void query_zone_info();
152
116
  void restart_and_read_all_info();
@@ -182,10 +146,10 @@ class LD2450Component : public Component, public uart::UARTDevice {
182
146
  protected:
183
147
  void send_command_(uint8_t command_str, const uint8_t *command_value, uint8_t command_value_len);
184
148
  void set_config_mode_(bool enable);
185
- void handle_periodic_data_(uint8_t *buffer, uint8_t len);
186
- bool handle_ack_data_(uint8_t *buffer, uint8_t len);
187
- void process_zone_(uint8_t *buffer);
188
- void readline_(int readch, uint8_t *buffer, uint8_t len);
149
+ void handle_periodic_data_();
150
+ bool handle_ack_data_();
151
+ void process_zone_();
152
+ void readline_(int readch);
189
153
  void get_version_();
190
154
  void get_mac_();
191
155
  void query_target_tracking_mode_();
@@ -197,19 +161,46 @@ class LD2450Component : public Component, public uart::UARTDevice {
197
161
  bool get_timeout_status_(uint32_t check_millis);
198
162
  uint8_t count_targets_in_zone_(const Zone &zone, bool is_moving);
199
163
 
200
- Target target_info_[MAX_TARGETS];
201
- Zone zone_config_[MAX_ZONES];
202
- uint8_t buffer_pos_ = 0; // where to resume processing/populating buffer
203
- uint8_t buffer_data_[MAX_LINE_LENGTH];
204
164
  uint32_t last_periodic_millis_ = 0;
205
165
  uint32_t presence_millis_ = 0;
206
166
  uint32_t still_presence_millis_ = 0;
207
167
  uint32_t moving_presence_millis_ = 0;
208
168
  uint16_t throttle_ = 0;
209
169
  uint16_t timeout_ = 5;
170
+ uint8_t buffer_data_[MAX_LINE_LENGTH];
171
+ uint8_t mac_address_[6] = {0, 0, 0, 0, 0, 0};
172
+ uint8_t version_[6] = {0, 0, 0, 0, 0, 0};
173
+ uint8_t buffer_pos_ = 0; // where to resume processing/populating buffer
210
174
  uint8_t zone_type_ = 0;
211
- std::string version_{};
212
- std::string mac_{};
175
+ bool bluetooth_on_{false};
176
+ Target target_info_[MAX_TARGETS];
177
+ Zone zone_config_[MAX_ZONES];
178
+
179
+ // Change detection - cache previous values to avoid redundant publishes
180
+ // All values are initialized to sentinel values that are outside the valid sensor ranges
181
+ // to ensure the first real measurement is always published
182
+ struct CachedTargetData {
183
+ int16_t x = std::numeric_limits<int16_t>::min(); // -32768, outside range of -4860 to 4860
184
+ int16_t y = std::numeric_limits<int16_t>::min(); // -32768, outside range of 0 to 7560
185
+ int16_t speed = std::numeric_limits<int16_t>::min(); // -32768, outside practical sensor range
186
+ uint16_t resolution = std::numeric_limits<uint16_t>::max(); // 65535, unlikely resolution value
187
+ uint16_t distance = std::numeric_limits<uint16_t>::max(); // 65535, outside range of 0 to ~8990
188
+ Direction direction = DIRECTION_UNDEFINED; // Undefined, will differ from any real direction
189
+ float angle = NAN; // NAN, safe sentinel for floats
190
+ } cached_target_data_[MAX_TARGETS];
191
+
192
+ struct CachedZoneData {
193
+ uint8_t still_count = std::numeric_limits<uint8_t>::max(); // 255, unlikely zone count
194
+ uint8_t moving_count = std::numeric_limits<uint8_t>::max(); // 255, unlikely zone count
195
+ uint8_t total_count = std::numeric_limits<uint8_t>::max(); // 255, unlikely zone count
196
+ } cached_zone_data_[MAX_ZONES];
197
+
198
+ struct CachedGlobalData {
199
+ uint8_t target_count = std::numeric_limits<uint8_t>::max(); // 255, max 3 targets possible
200
+ uint8_t still_count = std::numeric_limits<uint8_t>::max(); // 255, max 3 targets possible
201
+ uint8_t moving_count = std::numeric_limits<uint8_t>::max(); // 255, max 3 targets possible
202
+ } cached_global_data_;
203
+
213
204
  #ifdef USE_NUMBER
214
205
  ESPPreferenceObject pref_; // only used when numbers are in use
215
206
  ZoneOfNumbers zone_numbers_[MAX_ZONES];
@@ -2,6 +2,7 @@ import esphome.codegen as cg
2
2
  from esphome.components import switch
3
3
  import esphome.config_validation as cv
4
4
  from esphome.const import (
5
+ CONF_BLUETOOTH,
5
6
  DEVICE_CLASS_SWITCH,
6
7
  ENTITY_CATEGORY_CONFIG,
7
8
  ICON_BLUETOOTH,
@@ -13,7 +14,6 @@ from .. import CONF_LD2450_ID, LD2450Component, ld2450_ns
13
14
  BluetoothSwitch = ld2450_ns.class_("BluetoothSwitch", switch.Switch)
14
15
  MultiTargetSwitch = ld2450_ns.class_("MultiTargetSwitch", switch.Switch)
15
16
 
16
- CONF_BLUETOOTH = "bluetooth"
17
17
  CONF_MULTI_TARGET = "multi_target"
18
18
 
19
19
  CONFIG_SCHEMA = {
@@ -3,28 +3,16 @@
3
3
 
4
4
  #ifdef USE_ESP32
5
5
 
6
- #ifdef USE_ARDUINO
7
- #include <esp32-hal-ledc.h>
8
- #endif
9
6
  #include <driver/ledc.h>
10
-
11
7
  #include <cinttypes>
12
8
 
13
9
  #define CLOCK_FREQUENCY 80e6f
14
10
 
15
- #ifdef USE_ARDUINO
16
- #ifdef SOC_LEDC_SUPPORT_XTAL_CLOCK
17
- #undef CLOCK_FREQUENCY
18
- // starting with ESP32 Arduino 2.0.2, the 40MHz crystal is used as clock by default if supported
19
- #define CLOCK_FREQUENCY 40e6f
20
- #endif
21
- #else
22
11
  #ifdef SOC_LEDC_SUPPORT_APB_CLOCK
23
12
  #define DEFAULT_CLK LEDC_USE_APB_CLK
24
13
  #else
25
14
  #define DEFAULT_CLK LEDC_AUTO_CLK
26
15
  #endif
27
- #endif
28
16
 
29
17
  static const uint8_t SETUP_ATTEMPT_COUNT_MAX = 5;
30
18
 
@@ -34,7 +22,6 @@ namespace ledc {
34
22
  static const char *const TAG = "ledc.output";
35
23
 
36
24
  static const int MAX_RES_BITS = LEDC_TIMER_BIT_MAX - 1;
37
- #ifdef USE_ESP_IDF
38
25
  #if SOC_LEDC_SUPPORT_HS_MODE
39
26
  // Only ESP32 has LEDC_HIGH_SPEED_MODE
40
27
  inline ledc_mode_t get_speed_mode(uint8_t channel) { return channel < 8 ? LEDC_HIGH_SPEED_MODE : LEDC_LOW_SPEED_MODE; }
@@ -44,7 +31,6 @@ inline ledc_mode_t get_speed_mode(uint8_t channel) { return channel < 8 ? LEDC_H
44
31
  // https://docs.espressif.com/projects/esp-idf/en/latest/esp32c3/api-reference/peripherals/ledc.html#functionality-overview
45
32
  inline ledc_mode_t get_speed_mode(uint8_t) { return LEDC_LOW_SPEED_MODE; }
46
33
  #endif
47
- #endif
48
34
 
49
35
  float ledc_max_frequency_for_bit_depth(uint8_t bit_depth) {
50
36
  return static_cast<float>(CLOCK_FREQUENCY) / static_cast<float>(1 << bit_depth);
@@ -68,7 +54,6 @@ optional<uint8_t> ledc_bit_depth_for_frequency(float frequency) {
68
54
  return {};
69
55
  }
70
56
 
71
- #ifdef USE_ESP_IDF
72
57
  esp_err_t configure_timer_frequency(ledc_mode_t speed_mode, ledc_timer_t timer_num, ledc_channel_t chan_num,
73
58
  uint8_t channel, uint8_t &bit_depth, float frequency) {
74
59
  bit_depth = *ledc_bit_depth_for_frequency(frequency);
@@ -98,13 +83,10 @@ esp_err_t configure_timer_frequency(ledc_mode_t speed_mode, ledc_timer_t timer_n
98
83
 
99
84
  return init_result;
100
85
  }
101
- #endif
102
86
 
103
- #ifdef USE_ESP_IDF
104
87
  constexpr int ledc_angle_to_htop(float angle, uint8_t bit_depth) {
105
88
  return static_cast<int>(angle * ((1U << bit_depth) - 1) / 360.0f);
106
89
  }
107
- #endif // USE_ESP_IDF
108
90
 
109
91
  void LEDCOutput::write_state(float state) {
110
92
  if (!this->initialized_) {
@@ -120,10 +102,6 @@ void LEDCOutput::write_state(float state) {
120
102
  const float duty_rounded = roundf(state * max_duty);
121
103
  auto duty = static_cast<uint32_t>(duty_rounded);
122
104
  ESP_LOGV(TAG, "Setting duty: %" PRIu32 " on channel %u", duty, this->channel_);
123
- #ifdef USE_ARDUINO
124
- ledcWrite(this->channel_, duty);
125
- #endif
126
- #ifdef USE_ESP_IDF
127
105
  auto speed_mode = get_speed_mode(this->channel_);
128
106
  auto chan_num = static_cast<ledc_channel_t>(this->channel_ % 8);
129
107
  int hpoint = ledc_angle_to_htop(this->phase_angle_, this->bit_depth_);
@@ -135,18 +113,10 @@ void LEDCOutput::write_state(float state) {
135
113
  ledc_set_duty_with_hpoint(speed_mode, chan_num, duty, hpoint);
136
114
  ledc_update_duty(speed_mode, chan_num);
137
115
  }
138
- #endif
139
116
  }
140
117
 
141
118
  void LEDCOutput::setup() {
142
119
  ESP_LOGCONFIG(TAG, "Running setup");
143
- #ifdef USE_ARDUINO
144
- this->update_frequency(this->frequency_);
145
- this->turn_off();
146
- // Attach pin after setting default value
147
- ledcAttachPin(this->pin_->get_pin(), this->channel_);
148
- #endif
149
- #ifdef USE_ESP_IDF
150
120
  auto speed_mode = get_speed_mode(this->channel_);
151
121
  auto timer_num = static_cast<ledc_timer_t>((this->channel_ % 8) / 2);
152
122
  auto chan_num = static_cast<ledc_channel_t>(this->channel_ % 8);
@@ -175,7 +145,6 @@ void LEDCOutput::setup() {
175
145
  ledc_channel_config(&chan_conf);
176
146
  this->initialized_ = true;
177
147
  this->status_clear_error();
178
- #endif
179
148
  }
180
149
 
181
150
  void LEDCOutput::dump_config() {
@@ -208,38 +177,7 @@ void LEDCOutput::update_frequency(float frequency) {
208
177
  }
209
178
  this->bit_depth_ = bit_depth_opt.value_or(8);
210
179
  this->frequency_ = frequency;
211
- #ifdef USE_ARDUINO
212
- ESP_LOGV(TAG, "Using Arduino API - Trying to define channel, frequency and bit depth");
213
- u_int32_t configured_frequency = 0;
214
180
 
215
- // Configure LEDC channel, frequency and bit depth with fallback
216
- int attempt_count_max = SETUP_ATTEMPT_COUNT_MAX;
217
- while (attempt_count_max > 0 && configured_frequency == 0) {
218
- ESP_LOGV(TAG, "Initializing channel %u with frequency %.1f and bit depth of %u", this->channel_, this->frequency_,
219
- this->bit_depth_);
220
- configured_frequency = ledcSetup(this->channel_, frequency, this->bit_depth_);
221
- if (configured_frequency != 0) {
222
- this->initialized_ = true;
223
- this->status_clear_error();
224
- ESP_LOGV(TAG, "Configured frequency: %u with bit depth: %u", configured_frequency, this->bit_depth_);
225
- } else {
226
- ESP_LOGW(TAG, "Unable to initialize channel %u with frequency %.1f and bit depth of %u", this->channel_,
227
- this->frequency_, this->bit_depth_);
228
- // try again with a lower bit depth
229
- this->bit_depth_--;
230
- }
231
- attempt_count_max--;
232
- }
233
-
234
- if (configured_frequency == 0) {
235
- ESP_LOGE(TAG, "Permanently failed to initialize channel %u with frequency %.1f and bit depth of %u", this->channel_,
236
- this->frequency_, this->bit_depth_);
237
- this->status_set_error();
238
- return;
239
- }
240
-
241
- #endif // USE_ARDUINO
242
- #ifdef USE_ESP_IDF
243
181
  if (!this->initialized_) {
244
182
  ESP_LOGW(TAG, "Not yet initialized");
245
183
  return;
@@ -259,7 +197,7 @@ void LEDCOutput::update_frequency(float frequency) {
259
197
  }
260
198
 
261
199
  this->status_clear_error();
262
- #endif
200
+
263
201
  // re-apply duty
264
202
  this->write_state(this->duty_);
265
203
  }
@@ -173,9 +173,9 @@ def _notify_old_style(config):
173
173
 
174
174
  # The dev and latest branches will be at *least* this version, which is what matters.
175
175
  ARDUINO_VERSIONS = {
176
- "dev": (cv.Version(1, 7, 0), "https://github.com/libretiny-eu/libretiny.git"),
177
- "latest": (cv.Version(1, 7, 0), "libretiny"),
178
- "recommended": (cv.Version(1, 7, 0), None),
176
+ "dev": (cv.Version(1, 9, 1), "https://github.com/libretiny-eu/libretiny.git"),
177
+ "latest": (cv.Version(1, 9, 1), "libretiny"),
178
+ "recommended": (cv.Version(1, 9, 1), None),
179
179
  }
180
180
 
181
181
 
@@ -264,9 +264,11 @@ async def component_to_code(config):
264
264
  # force using arduino framework
265
265
  cg.add_platformio_option("framework", "arduino")
266
266
  cg.add_build_flag("-DUSE_ARDUINO")
267
+ cg.set_cpp_standard("gnu++20")
267
268
 
268
269
  # disable library compatibility checks
269
270
  cg.add_platformio_option("lib_ldf_mode", "off")
271
+ cg.add_platformio_option("lib_compat_mode", "soft")
270
272
  # include <Arduino.h> in every file
271
273
  cg.add_platformio_option("build_src_flags", "-include Arduino.h")
272
274
  # dummy version code
@@ -50,6 +50,7 @@ KEY_FAMILY = "family"
50
50
 
51
51
  # COMPONENTS - auto-generated! Do not modify this block.
52
52
  COMPONENT_BK72XX = "bk72xx"
53
+ COMPONENT_LN882X = "ln882x"
53
54
  COMPONENT_RTL87XX = "rtl87xx"
54
55
  # COMPONENTS - end
55
56
 
@@ -58,6 +59,7 @@ FAMILY_BK7231N = "BK7231N"
58
59
  FAMILY_BK7231Q = "BK7231Q"
59
60
  FAMILY_BK7231T = "BK7231T"
60
61
  FAMILY_BK7251 = "BK7251"
62
+ FAMILY_LN882H = "LN882H"
61
63
  FAMILY_RTL8710B = "RTL8710B"
62
64
  FAMILY_RTL8720C = "RTL8720C"
63
65
  FAMILIES = [
@@ -65,6 +67,7 @@ FAMILIES = [
65
67
  FAMILY_BK7231Q,
66
68
  FAMILY_BK7231T,
67
69
  FAMILY_BK7251,
70
+ FAMILY_LN882H,
68
71
  FAMILY_RTL8710B,
69
72
  FAMILY_RTL8720C,
70
73
  ]
@@ -73,6 +76,7 @@ FAMILY_FRIENDLY = {
73
76
  FAMILY_BK7231Q: "BK7231Q",
74
77
  FAMILY_BK7231T: "BK7231T",
75
78
  FAMILY_BK7251: "BK7251",
79
+ FAMILY_LN882H: "LN882H",
76
80
  FAMILY_RTL8710B: "RTL8710B",
77
81
  FAMILY_RTL8720C: "RTL8720C",
78
82
  }
@@ -81,6 +85,7 @@ FAMILY_COMPONENT = {
81
85
  FAMILY_BK7231Q: COMPONENT_BK72XX,
82
86
  FAMILY_BK7231T: COMPONENT_BK72XX,
83
87
  FAMILY_BK7251: COMPONENT_BK72XX,
88
+ FAMILY_LN882H: COMPONENT_LN882X,
84
89
  FAMILY_RTL8710B: COMPONENT_RTL87XX,
85
90
  FAMILY_RTL8720C: COMPONENT_RTL87XX,
86
91
  }
@@ -94,6 +94,7 @@ PIN_SCHEMA_EXTRA = f"libretiny.BASE_PIN_SCHEMA.extend({VAR_PIN_SCHEMA})"
94
94
  COMPONENT_MAP = {
95
95
  "rtl87xx": "realtek-amb",
96
96
  "bk72xx": "beken-72xx",
97
+ "ln882x": "lightning-ln882x",
97
98
  }
98
99
 
99
100
 
@@ -0,0 +1,35 @@
1
+ #include "esphome/core/helpers.h"
2
+
3
+ #ifdef USE_LIBRETINY
4
+
5
+ #include "esphome/core/hal.h"
6
+
7
+ #include <WiFi.h> // for macAddress()
8
+
9
+ namespace esphome {
10
+
11
+ uint32_t random_uint32() { return rand(); }
12
+
13
+ bool random_bytes(uint8_t *data, size_t len) {
14
+ lt_rand_bytes(data, len);
15
+ return true;
16
+ }
17
+
18
+ Mutex::Mutex() { handle_ = xSemaphoreCreateMutex(); }
19
+ Mutex::~Mutex() {}
20
+ void Mutex::lock() { xSemaphoreTake(this->handle_, portMAX_DELAY); }
21
+ bool Mutex::try_lock() { return xSemaphoreTake(this->handle_, 0) == pdTRUE; }
22
+ void Mutex::unlock() { xSemaphoreGive(this->handle_); }
23
+
24
+ // only affects the executing core
25
+ // so should not be used as a mutex lock, only to get accurate timing
26
+ IRAM_ATTR InterruptLock::InterruptLock() { portDISABLE_INTERRUPTS(); }
27
+ IRAM_ATTR InterruptLock::~InterruptLock() { portENABLE_INTERRUPTS(); }
28
+
29
+ void get_mac_address_raw(uint8_t *mac) { // NOLINT(readability-non-const-parameter)
30
+ WiFi.macAddress(mac);
31
+ }
32
+
33
+ } // namespace esphome
34
+
35
+ #endif // USE_LIBRETINY
@@ -10,9 +10,11 @@ namespace libretiny {
10
10
  static const char *const TAG = "lt.component";
11
11
 
12
12
  void LTComponent::dump_config() {
13
- ESP_LOGCONFIG(TAG, "LibreTiny:");
14
- ESP_LOGCONFIG(TAG, " Version: %s", LT_BANNER_STR + 10);
15
- ESP_LOGCONFIG(TAG, " Loglevel: %u", LT_LOGLEVEL);
13
+ ESP_LOGCONFIG(TAG,
14
+ "LibreTiny:\n"
15
+ " Version: %s\n"
16
+ " Loglevel: %u",
17
+ LT_BANNER_STR + 10, LT_LOGLEVEL);
16
18
 
17
19
  #ifdef USE_TEXT_SENSOR
18
20
  if (this->version_ != nullptr) {
@@ -38,8 +38,8 @@ from esphome.const import (
38
38
  CONF_WHITE,
39
39
  )
40
40
  from esphome.core import CORE, coroutine_with_priority
41
+ from esphome.core.entity_helpers import entity_duplicate_validator, setup_entity
41
42
  from esphome.cpp_generator import MockObjClass
42
- from esphome.cpp_helpers import setup_entity
43
43
 
44
44
  from .automation import LIGHT_STATE_SCHEMA
45
45
  from .effects import (
@@ -110,6 +110,8 @@ LIGHT_SCHEMA = (
110
110
  )
111
111
  )
112
112
 
113
+ LIGHT_SCHEMA.add_extra(entity_duplicate_validator("light"))
114
+
113
115
  BINARY_LIGHT_SCHEMA = LIGHT_SCHEMA.extend(
114
116
  {
115
117
  cv.Optional(CONF_EFFECTS): validate_effects(BINARY_EFFECTS),
@@ -207,7 +209,7 @@ def validate_color_temperature_channels(value):
207
209
 
208
210
 
209
211
  async def setup_light_core_(light_var, output_var, config):
210
- await setup_entity(light_var, config)
212
+ await setup_entity(light_var, config, "light")
211
213
 
212
214
  cg.add(light_var.set_restore_mode(config[CONF_RESTORE_MODE]))
213
215
 
@@ -97,12 +97,12 @@ class AddressableLight : public LightOutput, public Component {
97
97
  }
98
98
  virtual ESPColorView get_view_internal(int32_t index) const = 0;
99
99
 
100
- bool effect_active_{false};
101
100
  ESPColorCorrection correction_{};
101
+ LightState *state_parent_{nullptr};
102
102
  #ifdef USE_POWER_SUPPLY
103
103
  power_supply::PowerSupplyRequester power_;
104
104
  #endif
105
- LightState *state_parent_{nullptr};
105
+ bool effect_active_{false};
106
106
  };
107
107
 
108
108
  class AddressableLightTransformer : public LightTransitionTransformer {
@@ -114,9 +114,9 @@ class AddressableLightTransformer : public LightTransitionTransformer {
114
114
 
115
115
  protected:
116
116
  AddressableLight &light_;
117
- Color target_color_{};
118
117
  float last_transition_progress_{0.0f};
119
118
  float accumulated_alpha_{0.0f};
119
+ Color target_color_{};
120
120
  };
121
121
 
122
122
  } // namespace light