esphome 2025.6.3__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 (646) 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 +8 -2
  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.h +1 -0
  191. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  192. esphome/components/http_request/update/http_request_update.cpp +35 -16
  193. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  194. esphome/components/hydreon_rgxx/sensor.py +1 -1
  195. esphome/components/i2c/__init__.py +23 -11
  196. esphome/components/i2c/i2c_bus.h +8 -1
  197. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  198. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  199. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  200. esphome/components/i2c_device/i2c_device.h +0 -1
  201. esphome/components/i2s_audio/__init__.py +2 -10
  202. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  203. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  204. esphome/components/i2s_audio/speaker/__init__.py +1 -1
  205. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  206. esphome/components/iaqcore/iaqcore.h +0 -2
  207. esphome/components/image/__init__.py +123 -24
  208. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  209. esphome/components/ina219/ina219.cpp +7 -0
  210. esphome/components/ina219/ina219.h +1 -0
  211. esphome/components/ina260/ina260.h +0 -2
  212. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  213. esphome/components/inkplate6/display.py +15 -0
  214. esphome/components/inkplate6/inkplate.cpp +2 -2
  215. esphome/components/integration/integration_sensor.h +0 -1
  216. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  217. esphome/components/internal_temperature/sensor.py +0 -26
  218. esphome/components/interval/interval.h +0 -2
  219. esphome/components/json/__init__.py +1 -1
  220. esphome/components/json/json_util.cpp +56 -63
  221. esphome/components/ld2410/button/__init__.py +3 -3
  222. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  223. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  224. esphome/components/ld2410/ld2410.cpp +421 -268
  225. esphome/components/ld2410/ld2410.h +44 -146
  226. esphome/components/ld2410/number/__init__.py +2 -2
  227. esphome/components/ld2410/sensor.py +1 -1
  228. esphome/components/ld2410/switch/__init__.py +1 -1
  229. esphome/components/ld2420/binary_sensor/ld2420_binary_sensor.cpp +2 -2
  230. esphome/components/ld2420/button/reconfig_buttons.cpp +1 -1
  231. esphome/components/ld2420/ld2420.cpp +252 -147
  232. esphome/components/ld2420/ld2420.h +52 -126
  233. esphome/components/ld2420/number/__init__.py +2 -2
  234. esphome/components/ld2420/number/gate_config_number.cpp +1 -1
  235. esphome/components/ld2420/select/operating_mode_select.cpp +1 -1
  236. esphome/components/ld2420/sensor/__init__.py +6 -2
  237. esphome/components/ld2420/sensor/ld2420_sensor.cpp +2 -2
  238. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  239. esphome/components/ld2420/text_sensor/text_sensor.cpp +2 -2
  240. esphome/components/ld2450/button/__init__.py +3 -3
  241. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  242. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  243. esphome/components/ld2450/ld2450.cpp +384 -232
  244. esphome/components/ld2450/ld2450.h +60 -69
  245. esphome/components/ld2450/switch/__init__.py +1 -1
  246. esphome/components/ledc/ledc_output.cpp +1 -63
  247. esphome/components/libretiny/__init__.py +5 -3
  248. esphome/components/libretiny/const.py +5 -0
  249. esphome/components/libretiny/generate_components.py +1 -0
  250. esphome/components/libretiny/helpers.cpp +35 -0
  251. esphome/components/libretiny/lt_component.cpp +5 -3
  252. esphome/components/light/__init__.py +4 -2
  253. esphome/components/light/addressable_light.h +3 -3
  254. esphome/components/light/light_call.cpp +180 -243
  255. esphome/components/light/light_call.h +72 -20
  256. esphome/components/light/light_color_values.h +14 -14
  257. esphome/components/light/light_json_schema.cpp +17 -16
  258. esphome/components/light/light_state.h +15 -13
  259. esphome/components/light/transformers.h +2 -2
  260. esphome/components/ln882x/__init__.py +52 -0
  261. esphome/components/ln882x/boards.py +285 -0
  262. esphome/components/lock/__init__.py +5 -2
  263. esphome/components/logger/__init__.py +40 -3
  264. esphome/components/logger/logger.cpp +47 -12
  265. esphome/components/logger/logger.h +80 -49
  266. esphome/components/logger/logger_esp32.cpp +3 -3
  267. esphome/components/lps22/__init__.py +0 -0
  268. esphome/components/lps22/lps22.cpp +75 -0
  269. esphome/components/lps22/lps22.h +27 -0
  270. esphome/components/lps22/sensor.py +58 -0
  271. esphome/components/ltr390/ltr390.h +0 -1
  272. esphome/components/ltr501/ltr501.h +0 -1
  273. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  274. esphome/components/lvgl/__init__.py +1 -1
  275. esphome/components/lvgl/schemas.py +66 -6
  276. esphome/components/lvgl/styles.py +24 -16
  277. esphome/components/lvgl/widgets/__init__.py +12 -2
  278. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  279. esphome/components/lvgl/widgets/meter.py +20 -13
  280. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  281. esphome/components/max9611/max9611.h +0 -1
  282. esphome/components/mcp23016/__init__.py +1 -1
  283. esphome/components/mcp23xxx_base/__init__.py +1 -1
  284. esphome/components/mcp4461/__init__.py +1 -1
  285. esphome/components/mcp4461/output/__init__.py +3 -2
  286. esphome/components/mcp9600/mcp9600.h +0 -2
  287. esphome/components/md5/md5.cpp +3 -3
  288. esphome/components/md5/md5.h +1 -6
  289. esphome/components/mdns/__init__.py +22 -11
  290. esphome/components/media_player/__init__.py +4 -3
  291. esphome/components/micro_wake_word/__init__.py +1 -5
  292. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  293. esphome/components/microphone/microphone.cpp +7 -9
  294. esphome/components/microphone/microphone.h +0 -2
  295. esphome/components/mipi_spi/display.py +1 -0
  296. esphome/components/mmc5603/mmc5603.cpp +1 -1
  297. esphome/components/modbus/modbus.cpp +33 -15
  298. esphome/components/modbus/modbus.h +9 -0
  299. esphome/components/modbus_controller/__init__.py +42 -10
  300. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  301. esphome/components/modbus_controller/modbus_controller.h +61 -7
  302. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  303. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  304. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  305. esphome/components/mqtt/__init__.py +16 -0
  306. esphome/components/mqtt/mqtt_alarm_control_panel.cpp +2 -1
  307. esphome/components/mqtt/mqtt_backend.h +2 -1
  308. esphome/components/mqtt/mqtt_backend_esp32.cpp +132 -47
  309. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  310. esphome/components/mqtt/mqtt_binary_sensor.cpp +1 -0
  311. esphome/components/mqtt/mqtt_button.cpp +4 -1
  312. esphome/components/mqtt/mqtt_client.cpp +17 -9
  313. esphome/components/mqtt/mqtt_client.h +8 -3
  314. esphome/components/mqtt/mqtt_climate.cpp +6 -4
  315. esphome/components/mqtt/mqtt_component.cpp +3 -1
  316. esphome/components/mqtt/mqtt_cover.cpp +1 -0
  317. esphome/components/mqtt/mqtt_date.cpp +4 -3
  318. esphome/components/mqtt/mqtt_datetime.cpp +7 -6
  319. esphome/components/mqtt/mqtt_event.cpp +6 -3
  320. esphome/components/mqtt/mqtt_fan.cpp +1 -0
  321. esphome/components/mqtt/mqtt_light.cpp +8 -4
  322. esphome/components/mqtt/mqtt_lock.cpp +3 -1
  323. esphome/components/mqtt/mqtt_number.cpp +1 -0
  324. esphome/components/mqtt/mqtt_select.cpp +2 -1
  325. esphome/components/mqtt/mqtt_sensor.cpp +3 -1
  326. esphome/components/mqtt/mqtt_switch.cpp +3 -1
  327. esphome/components/mqtt/mqtt_text.cpp +1 -0
  328. esphome/components/mqtt/mqtt_text_sensor.cpp +3 -1
  329. esphome/components/mqtt/mqtt_time.cpp +4 -3
  330. esphome/components/mqtt/mqtt_update.cpp +1 -0
  331. esphome/components/mqtt/mqtt_valve.cpp +3 -1
  332. esphome/components/ms8607/ms8607.cpp +1 -1
  333. esphome/components/ms8607/ms8607.h +0 -1
  334. esphome/components/neopixelbus/light.py +4 -1
  335. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  336. esphome/components/network/__init__.py +4 -1
  337. esphome/components/network/ip_address.h +1 -0
  338. esphome/components/nextion/__init__.py +16 -0
  339. esphome/components/nextion/base_component.py +1 -0
  340. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  341. esphome/components/nextion/display.py +14 -4
  342. esphome/components/nextion/nextion.cpp +166 -101
  343. esphome/components/nextion/nextion.h +84 -53
  344. esphome/components/nextion/nextion_commands.cpp +11 -10
  345. esphome/components/nextion/nextion_component.cpp +28 -28
  346. esphome/components/nextion/nextion_component.h +53 -18
  347. esphome/components/nextion/nextion_component_base.h +3 -0
  348. esphome/components/nextion/nextion_upload.cpp +36 -0
  349. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  350. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  351. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  352. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  353. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  354. esphome/components/nfc/nfc.cpp +3 -22
  355. esphome/components/nfc/nfc.h +3 -3
  356. esphome/components/number/__init__.py +5 -2
  357. esphome/components/online_image/__init__.py +9 -1
  358. esphome/components/online_image/online_image.cpp +17 -7
  359. esphome/components/online_image/online_image.h +10 -2
  360. esphome/components/opentherm/opentherm.cpp +7 -12
  361. esphome/components/opentherm/output/output.cpp +1 -1
  362. esphome/components/openthread/__init__.py +47 -40
  363. esphome/components/openthread/const.py +1 -0
  364. esphome/components/openthread/openthread_esp.cpp +27 -5
  365. esphome/components/opt3001/__init__.py +0 -0
  366. esphome/components/opt3001/opt3001.cpp +122 -0
  367. esphome/components/opt3001/opt3001.h +27 -0
  368. esphome/components/opt3001/sensor.py +35 -0
  369. esphome/components/ota/__init__.py +17 -0
  370. esphome/components/ota/ota_backend.h +27 -1
  371. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  372. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  373. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  374. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  375. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  376. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  377. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  378. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  379. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  380. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  381. esphome/components/packages/__init__.py +5 -2
  382. esphome/components/packet_transport/binary_sensor.py +61 -4
  383. esphome/components/packet_transport/packet_transport.cpp +34 -1
  384. esphome/components/packet_transport/packet_transport.h +11 -5
  385. esphome/components/pcf8574/__init__.py +1 -1
  386. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  387. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  388. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  389. esphome/components/pmsa003i/pmsa003i.h +0 -1
  390. esphome/components/pmsx003/pmsx003.h +0 -1
  391. esphome/components/pn7150/pn7150.cpp +7 -7
  392. esphome/components/pn7150/pn7150.h +0 -1
  393. esphome/components/pn7160/pn7160.cpp +7 -7
  394. esphome/components/pn7160/pn7160.h +0 -1
  395. esphome/components/preferences/syncer.h +2 -0
  396. esphome/components/prometheus/prometheus_handler.h +1 -1
  397. esphome/components/psram/psram.cpp +0 -20
  398. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  399. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  400. esphome/components/pulse_width/pulse_width.h +0 -1
  401. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  402. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  403. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  404. esphome/components/qr_code/__init__.py +13 -10
  405. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  406. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  407. esphome/components/rc522/rc522.h +0 -1
  408. esphome/components/rdm6300/rdm6300.h +0 -2
  409. esphome/components/remote_base/__init__.py +7 -5
  410. esphome/components/remote_base/remote_base.cpp +24 -21
  411. esphome/components/remote_base/remote_base.h +3 -26
  412. esphome/components/remote_receiver/__init__.py +40 -46
  413. esphome/components/remote_receiver/remote_receiver.h +4 -18
  414. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  415. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  416. esphome/components/remote_transmitter/__init__.py +42 -43
  417. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  418. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  419. esphome/components/resistance/resistance_sensor.h +0 -1
  420. esphome/components/rp2040/__init__.py +2 -0
  421. esphome/components/rp2040/helpers.cpp +55 -0
  422. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  423. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  424. esphome/components/rtttl/__init__.py +4 -4
  425. esphome/components/rtttl/rtttl.cpp +10 -1
  426. esphome/components/ruuvitag/ruuvitag.h +0 -1
  427. esphome/components/safe_mode/safe_mode.cpp +2 -0
  428. esphome/components/safe_mode/safe_mode.h +4 -1
  429. esphome/components/scd30/scd30.h +0 -1
  430. esphome/components/scd30/sensor.py +2 -2
  431. esphome/components/scd4x/scd4x.cpp +61 -54
  432. esphome/components/scd4x/scd4x.h +17 -15
  433. esphome/components/scd4x/sensor.py +4 -4
  434. esphome/components/script/script.h +0 -2
  435. esphome/components/sdp3x/sensor.py +1 -1
  436. esphome/components/select/__init__.py +5 -2
  437. esphome/components/sen5x/sen5x.h +0 -1
  438. esphome/components/senseair/senseair.h +0 -1
  439. esphome/components/sensor/__init__.py +4 -2
  440. esphome/components/sensor/filter.cpp +1 -1
  441. esphome/components/sensor/sensor.cpp +12 -6
  442. esphome/components/sensor/sensor.h +13 -5
  443. esphome/components/servo/servo.cpp +2 -2
  444. esphome/components/servo/servo.h +0 -1
  445. esphome/components/sfa30/sfa30.h +0 -1
  446. esphome/components/sgp30/sgp30.h +0 -1
  447. esphome/components/sgp4x/sgp4x.h +0 -1
  448. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  449. esphome/components/sht4x/sht4x.h +0 -1
  450. esphome/components/sm300d2/sm300d2.h +0 -2
  451. esphome/components/smt100/sensor.py +8 -4
  452. esphome/components/smt100/smt100.cpp +5 -5
  453. esphome/components/smt100/smt100.h +3 -3
  454. esphome/components/sn74hc595/__init__.py +1 -1
  455. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  456. esphome/components/sntp/sntp_component.cpp +9 -3
  457. esphome/components/sntp/time.py +2 -0
  458. esphome/components/socket/__init__.py +17 -0
  459. esphome/components/spi/__init__.py +27 -6
  460. esphome/components/spi/spi.cpp +3 -2
  461. esphome/components/spi/spi.h +9 -3
  462. esphome/components/spi/spi_arduino.cpp +3 -5
  463. esphome/components/spi/spi_esp_idf.cpp +40 -21
  464. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  465. esphome/components/sps30/sps30.h +0 -1
  466. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  467. esphome/components/st7701s/st7701s.cpp +0 -4
  468. esphome/components/status/status_binary_sensor.h +0 -2
  469. esphome/components/substitutions/__init__.py +81 -21
  470. esphome/components/substitutions/jinja.py +99 -0
  471. esphome/components/sun/sun.cpp +3 -4
  472. esphome/components/switch/__init__.py +5 -2
  473. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  474. esphome/components/sx126x/__init__.py +317 -0
  475. esphome/components/sx126x/automation.h +62 -0
  476. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  477. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  478. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  479. esphome/components/sx126x/sx126x.cpp +523 -0
  480. esphome/components/sx126x/sx126x.h +140 -0
  481. esphome/components/sx126x/sx126x_reg.h +163 -0
  482. esphome/components/sx127x/__init__.py +325 -0
  483. esphome/components/sx127x/automation.h +62 -0
  484. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  485. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  486. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  487. esphome/components/sx127x/sx127x.cpp +498 -0
  488. esphome/components/sx127x/sx127x.h +128 -0
  489. esphome/components/sx127x/sx127x_reg.h +295 -0
  490. esphome/components/syslog/esphome_syslog.cpp +5 -3
  491. esphome/components/syslog/esphome_syslog.h +1 -1
  492. esphome/components/tca9555/__init__.py +1 -1
  493. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  494. esphome/components/text/__init__.py +5 -2
  495. esphome/components/text_sensor/__init__.py +5 -2
  496. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  497. esphome/components/thermostat/thermostat_climate.h +43 -39
  498. esphome/components/time/__init__.py +16 -2
  499. esphome/components/time/real_time_clock.cpp +4 -0
  500. esphome/components/time/real_time_clock.h +5 -1
  501. esphome/components/tlc5971/tlc5971.cpp +4 -1
  502. esphome/components/tmp1075/tmp1075.h +0 -2
  503. esphome/components/tof10120/tof10120_sensor.h +0 -1
  504. esphome/components/tormatic/tormatic_cover.h +0 -1
  505. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  506. esphome/components/tsl2591/tsl2591.cpp +1 -1
  507. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  508. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  509. esphome/components/tx20/tx20.cpp +2 -2
  510. esphome/components/uart/__init__.py +18 -0
  511. esphome/components/uart/uart_component_esp_idf.cpp +0 -4
  512. esphome/components/update/__init__.py +5 -2
  513. esphome/components/update/update_entity.h +8 -0
  514. esphome/components/usb_host/__init__.py +5 -2
  515. esphome/components/usb_host/usb_host_client.cpp +10 -10
  516. esphome/components/usb_uart/cp210x.cpp +1 -1
  517. esphome/components/usb_uart/usb_uart.cpp +41 -44
  518. esphome/components/usb_uart/usb_uart.h +4 -3
  519. esphome/components/valve/__init__.py +5 -2
  520. esphome/components/vbus/vbus.h +0 -1
  521. esphome/components/veml3235/veml3235.h +0 -1
  522. esphome/components/veml7700/veml7700.h +0 -1
  523. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  524. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  525. esphome/components/watchdog/watchdog.cpp +0 -4
  526. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  527. esphome/components/web_server/__init__.py +34 -19
  528. esphome/components/web_server/ota/__init__.py +32 -0
  529. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  530. esphome/components/web_server/ota/ota_web_server.h +26 -0
  531. esphome/components/web_server/web_server.cpp +318 -436
  532. esphome/components/web_server/web_server.h +33 -23
  533. esphome/components/web_server/web_server_v1.cpp +4 -5
  534. esphome/components/web_server_base/__init__.py +5 -2
  535. esphome/components/web_server_base/web_server_base.cpp +2 -94
  536. esphome/components/web_server_base/web_server_base.h +5 -25
  537. esphome/components/web_server_idf/multipart.cpp +254 -0
  538. esphome/components/web_server_idf/multipart.h +86 -0
  539. esphome/components/web_server_idf/utils.cpp +32 -0
  540. esphome/components/web_server_idf/utils.h +10 -0
  541. esphome/components/web_server_idf/web_server_idf.cpp +164 -16
  542. esphome/components/web_server_idf/web_server_idf.h +11 -10
  543. esphome/components/wiegand/wiegand.cpp +2 -2
  544. esphome/components/wifi/__init__.py +18 -0
  545. esphome/components/wifi/wifi_component.cpp +17 -22
  546. esphome/components/wifi/wifi_component.h +27 -23
  547. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  548. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  549. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  550. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  551. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  552. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  553. esphome/components/wireguard/__init__.py +2 -11
  554. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  555. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  556. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  557. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  558. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  559. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  560. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  561. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  562. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  563. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  564. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  565. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  566. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  567. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  568. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  569. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  570. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  571. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  572. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  573. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  574. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  575. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  576. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  577. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  578. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  579. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  580. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  581. esphome/components/zyaura/zyaura.h +0 -1
  582. esphome/config.py +88 -22
  583. esphome/config_helpers.py +74 -1
  584. esphome/config_validation.py +12 -1
  585. esphome/const.py +65 -10
  586. esphome/core/__init__.py +18 -2
  587. esphome/core/application.cpp +169 -10
  588. esphome/core/application.h +145 -165
  589. esphome/core/area.h +19 -0
  590. esphome/core/automation.h +58 -9
  591. esphome/core/color.cpp +3 -5
  592. esphome/core/color.h +16 -16
  593. esphome/core/component.cpp +156 -22
  594. esphome/core/component.h +98 -4
  595. esphome/core/component_iterator.cpp +11 -9
  596. esphome/core/component_iterator.h +12 -10
  597. esphome/core/config.py +155 -6
  598. esphome/core/controller.cpp +4 -2
  599. esphome/core/controller.h +1 -1
  600. esphome/core/datatypes.h +2 -2
  601. esphome/core/defines.h +17 -2
  602. esphome/core/device.h +20 -0
  603. esphome/core/entity_base.cpp +20 -15
  604. esphome/core/entity_base.h +76 -0
  605. esphome/core/entity_helpers.py +168 -1
  606. esphome/core/event_pool.h +81 -0
  607. esphome/core/helpers.cpp +75 -230
  608. esphome/core/helpers.h +165 -105
  609. esphome/core/lock_free_queue.h +151 -0
  610. esphome/core/log.cpp +2 -2
  611. esphome/core/log.h +2 -0
  612. esphome/core/optional.h +5 -0
  613. esphome/core/ring_buffer.cpp +2 -2
  614. esphome/core/scheduler.cpp +275 -103
  615. esphome/core/scheduler.h +154 -17
  616. esphome/core/time.cpp +5 -5
  617. esphome/core/time.h +5 -5
  618. esphome/cpp_generator.py +17 -0
  619. esphome/cpp_helpers.py +0 -22
  620. esphome/cpp_types.py +3 -1
  621. esphome/dashboard/entries.py +1 -1
  622. esphome/dashboard/util/text.py +5 -21
  623. esphome/dashboard/web_server.py +9 -1
  624. esphome/helpers.py +47 -0
  625. esphome/loader.py +15 -1
  626. esphome/pins.py +14 -8
  627. esphome/platformio_api.py +2 -0
  628. esphome/wizard.py +17 -4
  629. esphome/writer.py +44 -3
  630. esphome/yaml_util.py +0 -2
  631. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/METADATA +10 -9
  632. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/RECORD +637 -578
  633. esphome/components/api/api_pb2_size.h +0 -361
  634. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  635. esphome/components/esp32_ble/queue.h +0 -85
  636. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  637. esphome/components/esp32_hall/esp32_hall.h +0 -23
  638. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  639. esphome/components/ld2410/button/reset_button.cpp +0 -9
  640. esphome/components/ld2450/button/reset_button.cpp +0 -9
  641. esphome/components/openthread/tlv.py +0 -65
  642. /esphome/{dashboard/enum.py → enum.py} +0 -0
  643. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/WHEEL +0 -0
  644. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/entry_points.txt +0 -0
  645. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/licenses/LICENSE +0 -0
  646. {esphome-2025.6.3.dist-info → esphome-2025.7.0.dist-info}/top_level.txt +0 -0
@@ -1,4 +1,5 @@
1
1
  #include "ld2420.h"
2
+ #include "esphome/core/application.h"
2
3
  #include "esphome/core/helpers.h"
3
4
 
4
5
  /*
@@ -40,7 +41,7 @@ There are three documented parameters for modes:
40
41
  00 04 = Energy output mode
41
42
  This mode outputs detailed signal energy values for each gate and the target distance.
42
43
  The data format consist of the following.
43
- Header HH, Length LL, Persence PP, Distance DD, 16 Gate Energies EE, Footer FF
44
+ Header HH, Length LL, Presence PP, Distance DD, 16 Gate Energies EE, Footer FF
44
45
  HH HH HH HH LL LL PP DD DD EE EE .. 16x .. FF FF FF FF
45
46
  F4 F3 F2 F1 23 00 00 00 00 00 00 .. .. .. .. F8 F7 F6 F5
46
47
  00 00 = debug output mode
@@ -62,38 +63,106 @@ namespace ld2420 {
62
63
 
63
64
  static const char *const TAG = "ld2420";
64
65
 
65
- float LD2420Component::get_setup_priority() const { return setup_priority::BUS; }
66
-
67
- void LD2420Component::dump_config() {
68
- ESP_LOGCONFIG(TAG,
69
- "LD2420:\n"
70
- " Firmware Version : %7s\n"
71
- "LD2420 Number:",
72
- this->ld2420_firmware_ver_);
73
- #ifdef USE_NUMBER
74
- LOG_NUMBER(TAG, " Gate Timeout:", this->gate_timeout_number_);
75
- LOG_NUMBER(TAG, " Gate Max Distance:", this->max_gate_distance_number_);
76
- LOG_NUMBER(TAG, " Gate Min Distance:", this->min_gate_distance_number_);
77
- LOG_NUMBER(TAG, " Gate Select:", this->gate_select_number_);
78
- for (uint8_t gate = 0; gate < LD2420_TOTAL_GATES; gate++) {
79
- LOG_NUMBER(TAG, " Gate Move Threshold:", this->gate_move_threshold_numbers_[gate]);
80
- LOG_NUMBER(TAG, " Gate Still Threshold::", this->gate_still_threshold_numbers_[gate]);
81
- }
82
- #endif
83
- #ifdef USE_BUTTON
84
- LOG_BUTTON(TAG, " Apply Config:", this->apply_config_button_);
85
- LOG_BUTTON(TAG, " Revert Edits:", this->revert_config_button_);
86
- LOG_BUTTON(TAG, " Factory Reset:", this->factory_reset_button_);
87
- LOG_BUTTON(TAG, " Restart Module:", this->restart_module_button_);
88
- #endif
89
- ESP_LOGCONFIG(TAG, "LD2420 Select:");
90
- LOG_SELECT(TAG, " Operating Mode", this->operating_selector_);
91
- if (this->get_firmware_int_(ld2420_firmware_ver_) < CALIBRATE_VERSION_MIN) {
92
- ESP_LOGW(TAG, "LD2420 Firmware Version %s and older are only supported in Simple Mode", ld2420_firmware_ver_);
66
+ // Local const's
67
+ static const uint16_t REFRESH_RATE_MS = 1000;
68
+
69
+ // Command sets
70
+ static const uint16_t CMD_DISABLE_CONF = 0x00FE;
71
+ static const uint16_t CMD_ENABLE_CONF = 0x00FF;
72
+ static const uint16_t CMD_PARM_HIGH_TRESH = 0x0012;
73
+ static const uint16_t CMD_PARM_LOW_TRESH = 0x0021;
74
+ static const uint16_t CMD_PROTOCOL_VER = 0x0002;
75
+ static const uint16_t CMD_READ_ABD_PARAM = 0x0008;
76
+ static const uint16_t CMD_READ_REG_ADDR = 0x0020;
77
+ static const uint16_t CMD_READ_REGISTER = 0x0002;
78
+ static const uint16_t CMD_READ_SERIAL_NUM = 0x0011;
79
+ static const uint16_t CMD_READ_SYS_PARAM = 0x0013;
80
+ static const uint16_t CMD_READ_VERSION = 0x0000;
81
+ static const uint16_t CMD_RESTART = 0x0068;
82
+ static const uint16_t CMD_SYSTEM_MODE = 0x0000;
83
+ static const uint16_t CMD_SYSTEM_MODE_GR = 0x0003;
84
+ static const uint16_t CMD_SYSTEM_MODE_MTT = 0x0001;
85
+ static const uint16_t CMD_SYSTEM_MODE_SIMPLE = 0x0064;
86
+ static const uint16_t CMD_SYSTEM_MODE_DEBUG = 0x0000;
87
+ static const uint16_t CMD_SYSTEM_MODE_ENERGY = 0x0004;
88
+ static const uint16_t CMD_SYSTEM_MODE_VS = 0x0002;
89
+ static const uint16_t CMD_WRITE_ABD_PARAM = 0x0007;
90
+ static const uint16_t CMD_WRITE_REGISTER = 0x0001;
91
+ static const uint16_t CMD_WRITE_SYS_PARAM = 0x0012;
92
+
93
+ static const uint8_t CMD_ABD_DATA_REPLY_SIZE = 0x04;
94
+ static const uint8_t CMD_ABD_DATA_REPLY_START = 0x0A;
95
+ static const uint8_t CMD_MAX_BYTES = 0x64;
96
+ static const uint8_t CMD_REG_DATA_REPLY_SIZE = 0x02;
97
+
98
+ static const uint8_t LD2420_ERROR_NONE = 0x00;
99
+ static const uint8_t LD2420_ERROR_TIMEOUT = 0x02;
100
+ static const uint8_t LD2420_ERROR_UNKNOWN = 0x01;
101
+
102
+ // Register address values
103
+ static const uint16_t CMD_MIN_GATE_REG = 0x0000;
104
+ static const uint16_t CMD_MAX_GATE_REG = 0x0001;
105
+ static const uint16_t CMD_TIMEOUT_REG = 0x0004;
106
+ static const uint16_t CMD_GATE_MOVE_THRESH[TOTAL_GATES] = {0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015,
107
+ 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B,
108
+ 0x001C, 0x001D, 0x001E, 0x001F};
109
+ static const uint16_t CMD_GATE_STILL_THRESH[TOTAL_GATES] = {0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025,
110
+ 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B,
111
+ 0x002C, 0x002D, 0x002E, 0x002F};
112
+ static const uint32_t FACTORY_MOVE_THRESH[TOTAL_GATES] = {60000, 30000, 400, 250, 250, 250, 250, 250,
113
+ 250, 250, 250, 250, 250, 250, 250, 250};
114
+ static const uint32_t FACTORY_STILL_THRESH[TOTAL_GATES] = {40000, 20000, 200, 200, 200, 200, 200, 150,
115
+ 150, 100, 100, 100, 100, 100, 100, 100};
116
+ static const uint16_t FACTORY_TIMEOUT = 120;
117
+ static const uint16_t FACTORY_MIN_GATE = 1;
118
+ static const uint16_t FACTORY_MAX_GATE = 12;
119
+
120
+ // COMMAND_BYTE Header & Footer
121
+ static const uint32_t CMD_FRAME_FOOTER = 0x01020304;
122
+ static const uint32_t CMD_FRAME_HEADER = 0xFAFBFCFD;
123
+ static const uint32_t DEBUG_FRAME_FOOTER = 0xFAFBFCFD;
124
+ static const uint32_t DEBUG_FRAME_HEADER = 0x1410BFAA;
125
+ static const uint32_t ENERGY_FRAME_FOOTER = 0xF5F6F7F8;
126
+ static const uint32_t ENERGY_FRAME_HEADER = 0xF1F2F3F4;
127
+ static const int CALIBRATE_VERSION_MIN = 154;
128
+ static const uint8_t CMD_FRAME_COMMAND = 6;
129
+ static const uint8_t CMD_FRAME_DATA_LENGTH = 4;
130
+ static const uint8_t CMD_FRAME_STATUS = 7;
131
+ static const uint8_t CMD_ERROR_WORD = 8;
132
+ static const uint8_t ENERGY_SENSOR_START = 9;
133
+ static const uint8_t CALIBRATE_REPORT_INTERVAL = 4;
134
+ static const std::string OP_NORMAL_MODE_STRING = "Normal";
135
+ static const std::string OP_SIMPLE_MODE_STRING = "Simple";
136
+
137
+ // Memory-efficient lookup tables
138
+ struct StringToUint8 {
139
+ const char *str;
140
+ const uint8_t value;
141
+ };
142
+
143
+ static constexpr StringToUint8 OP_MODE_BY_STR[] = {
144
+ {"Normal", OP_NORMAL_MODE},
145
+ {"Calibrate", OP_CALIBRATE_MODE},
146
+ {"Simple", OP_SIMPLE_MODE},
147
+ };
148
+
149
+ static constexpr const char *ERR_MESSAGE[] = {
150
+ "None",
151
+ "Unknown",
152
+ "Timeout",
153
+ };
154
+
155
+ // Helper function for lookups
156
+ template<size_t N> uint8_t find_uint8(const StringToUint8 (&arr)[N], const std::string &str) {
157
+ for (const auto &entry : arr) {
158
+ if (str == entry.str) {
159
+ return entry.value;
160
+ }
93
161
  }
162
+ return 0xFF; // Not found
94
163
  }
95
164
 
96
- uint8_t LD2420Component::calc_checksum(void *data, size_t size) {
165
+ static uint8_t calc_checksum(void *data, size_t size) {
97
166
  uint8_t checksum = 0;
98
167
  uint8_t *data_bytes = (uint8_t *) data;
99
168
  for (size_t i = 0; i < size; i++) {
@@ -102,7 +171,7 @@ uint8_t LD2420Component::calc_checksum(void *data, size_t size) {
102
171
  return checksum;
103
172
  }
104
173
 
105
- int LD2420Component::get_firmware_int_(const char *version_string) {
174
+ static int get_firmware_int(const char *version_string) {
106
175
  std::string version_str = version_string;
107
176
  if (version_str[0] == 'v') {
108
177
  version_str = version_str.substr(1);
@@ -112,10 +181,41 @@ int LD2420Component::get_firmware_int_(const char *version_string) {
112
181
  return version_integer;
113
182
  }
114
183
 
184
+ float LD2420Component::get_setup_priority() const { return setup_priority::BUS; }
185
+
186
+ void LD2420Component::dump_config() {
187
+ ESP_LOGCONFIG(TAG,
188
+ "LD2420:\n"
189
+ " Firmware version: %7s",
190
+ this->firmware_ver_);
191
+ #ifdef USE_NUMBER
192
+ ESP_LOGCONFIG(TAG, "Number:");
193
+ LOG_NUMBER(" ", "Gate Timeout:", this->gate_timeout_number_);
194
+ LOG_NUMBER(" ", "Gate Max Distance:", this->max_gate_distance_number_);
195
+ LOG_NUMBER(" ", "Gate Min Distance:", this->min_gate_distance_number_);
196
+ LOG_NUMBER(" ", "Gate Select:", this->gate_select_number_);
197
+ for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
198
+ LOG_NUMBER(" ", "Gate Move Threshold:", this->gate_move_threshold_numbers_[gate]);
199
+ LOG_NUMBER(" ", "Gate Still Threshold::", this->gate_still_threshold_numbers_[gate]);
200
+ }
201
+ #endif
202
+ #ifdef USE_BUTTON
203
+ LOG_BUTTON(" ", "Apply Config:", this->apply_config_button_);
204
+ LOG_BUTTON(" ", "Revert Edits:", this->revert_config_button_);
205
+ LOG_BUTTON(" ", "Factory Reset:", this->factory_reset_button_);
206
+ LOG_BUTTON(" ", "Restart Module:", this->restart_module_button_);
207
+ #endif
208
+ ESP_LOGCONFIG(TAG, "Select:");
209
+ LOG_SELECT(" ", "Operating Mode", this->operating_selector_);
210
+ if (ld2420::get_firmware_int(this->firmware_ver_) < CALIBRATE_VERSION_MIN) {
211
+ ESP_LOGW(TAG, "Firmware version %s and older supports Simple Mode only", this->firmware_ver_);
212
+ }
213
+ }
214
+
115
215
  void LD2420Component::setup() {
116
216
  ESP_LOGCONFIG(TAG, "Running setup");
117
217
  if (this->set_config_mode(true) == LD2420_ERROR_TIMEOUT) {
118
- ESP_LOGE(TAG, "LD2420 module has failed to respond, check baud rate and serial connections.");
218
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
119
219
  this->mark_failed();
120
220
  return;
121
221
  }
@@ -124,24 +224,24 @@ void LD2420Component::setup() {
124
224
  this->init_gate_config_numbers();
125
225
  #endif
126
226
  this->get_firmware_version_();
127
- const char *pfw = this->ld2420_firmware_ver_;
227
+ const char *pfw = this->firmware_ver_;
128
228
  std::string fw_str(pfw);
129
229
 
130
- for (auto &listener : listeners_) {
230
+ for (auto &listener : this->listeners_) {
131
231
  listener->on_fw_version(fw_str);
132
232
  }
133
233
 
134
- for (uint8_t gate = 0; gate < LD2420_TOTAL_GATES; gate++) {
234
+ for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
135
235
  delay_microseconds_safe(125);
136
236
  this->get_gate_threshold_(gate);
137
237
  }
138
238
 
139
239
  memcpy(&this->new_config, &this->current_config, sizeof(this->current_config));
140
- if (get_firmware_int_(ld2420_firmware_ver_) < CALIBRATE_VERSION_MIN) {
240
+ if (ld2420::get_firmware_int(this->firmware_ver_) < CALIBRATE_VERSION_MIN) {
141
241
  this->set_operating_mode(OP_SIMPLE_MODE_STRING);
142
242
  this->operating_selector_->publish_state(OP_SIMPLE_MODE_STRING);
143
243
  this->set_mode_(CMD_SYSTEM_MODE_SIMPLE);
144
- ESP_LOGW(TAG, "LD2420 Frimware Version %s and older are only supported in Simple Mode", ld2420_firmware_ver_);
244
+ ESP_LOGW(TAG, "Firmware version %s and older supports Simple Mode only", this->firmware_ver_);
145
245
  } else {
146
246
  this->set_mode_(CMD_SYSTEM_MODE_ENERGY);
147
247
  this->operating_selector_->publish_state(OP_NORMAL_MODE_STRING);
@@ -151,23 +251,22 @@ void LD2420Component::setup() {
151
251
  #endif
152
252
  this->set_system_mode(this->system_mode_);
153
253
  this->set_config_mode(false);
154
- ESP_LOGCONFIG(TAG, "LD2420 setup complete.");
155
254
  }
156
255
 
157
256
  void LD2420Component::apply_config_action() {
158
257
  const uint8_t checksum = calc_checksum(&this->new_config, sizeof(this->new_config));
159
258
  if (checksum == calc_checksum(&this->current_config, sizeof(this->current_config))) {
160
- ESP_LOGCONFIG(TAG, "No configuration change detected");
259
+ ESP_LOGD(TAG, "No configuration change detected");
161
260
  return;
162
261
  }
163
- ESP_LOGCONFIG(TAG, "Reconfiguring LD2420");
262
+ ESP_LOGD(TAG, "Reconfiguring");
164
263
  if (this->set_config_mode(true) == LD2420_ERROR_TIMEOUT) {
165
- ESP_LOGE(TAG, "LD2420 module has failed to respond, check baud rate and serial connections.");
264
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
166
265
  this->mark_failed();
167
266
  return;
168
267
  }
169
268
  this->set_min_max_distances_timeout(this->new_config.max_gate, this->new_config.min_gate, this->new_config.timeout);
170
- for (uint8_t gate = 0; gate < LD2420_TOTAL_GATES; gate++) {
269
+ for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
171
270
  delay_microseconds_safe(125);
172
271
  this->set_gate_threshold(gate);
173
272
  }
@@ -178,13 +277,12 @@ void LD2420Component::apply_config_action() {
178
277
  this->set_system_mode(this->system_mode_);
179
278
  this->set_config_mode(false); // Disable config mode to save new values in LD2420 nvm
180
279
  this->set_operating_mode(OP_NORMAL_MODE_STRING);
181
- ESP_LOGCONFIG(TAG, "LD2420 reconfig complete.");
182
280
  }
183
281
 
184
282
  void LD2420Component::factory_reset_action() {
185
- ESP_LOGCONFIG(TAG, "Setting factory defaults");
283
+ ESP_LOGD(TAG, "Setting factory defaults");
186
284
  if (this->set_config_mode(true) == LD2420_ERROR_TIMEOUT) {
187
- ESP_LOGE(TAG, "LD2420 module has failed to respond, check baud rate and serial connections.");
285
+ ESP_LOGE(TAG, ESP_LOG_MSG_COMM_FAIL);
188
286
  this->mark_failed();
189
287
  return;
190
288
  }
@@ -194,7 +292,7 @@ void LD2420Component::factory_reset_action() {
194
292
  this->min_gate_distance_number_->state = FACTORY_MIN_GATE;
195
293
  this->max_gate_distance_number_->state = FACTORY_MAX_GATE;
196
294
  #endif
197
- for (uint8_t gate = 0; gate < LD2420_TOTAL_GATES; gate++) {
295
+ for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
198
296
  this->new_config.move_thresh[gate] = FACTORY_MOVE_THRESH[gate];
199
297
  this->new_config.still_thresh[gate] = FACTORY_STILL_THRESH[gate];
200
298
  delay_microseconds_safe(125);
@@ -207,18 +305,16 @@ void LD2420Component::factory_reset_action() {
207
305
  this->init_gate_config_numbers();
208
306
  this->refresh_gate_config_numbers();
209
307
  #endif
210
- ESP_LOGCONFIG(TAG, "LD2420 factory reset complete.");
211
308
  }
212
309
 
213
310
  void LD2420Component::restart_module_action() {
214
- ESP_LOGCONFIG(TAG, "Restarting LD2420 module");
311
+ ESP_LOGD(TAG, "Restarting");
215
312
  this->send_module_restart();
216
313
  this->set_timeout(250, [this]() {
217
314
  this->set_config_mode(true);
218
- this->set_system_mode(system_mode_);
315
+ this->set_system_mode(this->system_mode_);
219
316
  this->set_config_mode(false);
220
317
  });
221
- ESP_LOGCONFIG(TAG, "LD2420 Restarted.");
222
318
  }
223
319
 
224
320
  void LD2420Component::revert_config_action() {
@@ -226,25 +322,18 @@ void LD2420Component::revert_config_action() {
226
322
  #ifdef USE_NUMBER
227
323
  this->init_gate_config_numbers();
228
324
  #endif
229
- ESP_LOGCONFIG(TAG, "Reverted config number edits.");
325
+ ESP_LOGD(TAG, "Reverted config number edits");
230
326
  }
231
327
 
232
328
  void LD2420Component::loop() {
233
329
  // If there is a active send command do not process it here, the send command call will handle it.
234
- if (!get_cmd_active_()) {
235
- if (!available())
236
- return;
237
- static uint8_t buffer[2048];
238
- static uint8_t rx_data;
239
- while (available()) {
240
- rx_data = read();
241
- this->readline_(rx_data, buffer, sizeof(buffer));
242
- }
330
+ while (!this->cmd_active_ && this->available()) {
331
+ this->readline_(this->read(), this->buffer_data_, MAX_LINE_LENGTH);
243
332
  }
244
333
  }
245
334
 
246
335
  void LD2420Component::update_radar_data(uint16_t const *gate_energy, uint8_t sample_number) {
247
- for (uint8_t gate = 0; gate < LD2420_TOTAL_GATES; ++gate) {
336
+ for (uint8_t gate = 0; gate < TOTAL_GATES; ++gate) {
248
337
  this->radar_data[gate][sample_number] = gate_energy[gate];
249
338
  }
250
339
  this->total_sample_number_counter++;
@@ -254,7 +343,7 @@ void LD2420Component::auto_calibrate_sensitivity() {
254
343
  // Calculate average and peak values for each gate
255
344
  const float move_factor = gate_move_sensitivity_factor + 1;
256
345
  const float still_factor = (gate_still_sensitivity_factor / 2) + 1;
257
- for (uint8_t gate = 0; gate < LD2420_TOTAL_GATES; ++gate) {
346
+ for (uint8_t gate = 0; gate < TOTAL_GATES; ++gate) {
258
347
  uint32_t sum = 0;
259
348
  uint16_t peak = 0;
260
349
 
@@ -270,8 +359,9 @@ void LD2420Component::auto_calibrate_sensitivity() {
270
359
 
271
360
  // Store average and peak values
272
361
  this->gate_avg[gate] = sum / CALIBRATE_SAMPLES;
273
- if (this->gate_peak[gate] < peak)
362
+ if (this->gate_peak[gate] < peak) {
274
363
  this->gate_peak[gate] = peak;
364
+ }
275
365
 
276
366
  uint32_t calculated_value =
277
367
  (static_cast<uint32_t>(this->gate_peak[gate]) + (move_factor * static_cast<uint32_t>(this->gate_peak[gate])));
@@ -283,7 +373,7 @@ void LD2420Component::auto_calibrate_sensitivity() {
283
373
  }
284
374
 
285
375
  void LD2420Component::report_gate_data() {
286
- for (uint8_t gate = 0; gate < LD2420_TOTAL_GATES; ++gate) {
376
+ for (uint8_t gate = 0; gate < TOTAL_GATES; ++gate) {
287
377
  // Output results
288
378
  ESP_LOGI(TAG, "Gate: %2d Avg: %5d Peak: %5d", gate, this->gate_avg[gate], this->gate_peak[gate]);
289
379
  }
@@ -292,13 +382,13 @@ void LD2420Component::report_gate_data() {
292
382
 
293
383
  void LD2420Component::set_operating_mode(const std::string &state) {
294
384
  // If unsupported firmware ignore mode select
295
- if (get_firmware_int_(ld2420_firmware_ver_) >= CALIBRATE_VERSION_MIN) {
296
- this->current_operating_mode = OP_MODE_TO_UINT.at(state);
385
+ if (ld2420::get_firmware_int(firmware_ver_) >= CALIBRATE_VERSION_MIN) {
386
+ this->current_operating_mode = find_uint8(OP_MODE_BY_STR, state);
297
387
  // Entering Auto Calibrate we need to clear the privoiuos data collection
298
388
  this->operating_selector_->publish_state(state);
299
389
  if (current_operating_mode == OP_CALIBRATE_MODE) {
300
390
  this->set_calibration_(true);
301
- for (uint8_t gate = 0; gate < LD2420_TOTAL_GATES; gate++) {
391
+ for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
302
392
  this->gate_avg[gate] = 0;
303
393
  this->gate_peak[gate] = 0;
304
394
  for (uint8_t i = 0; i < CALIBRATE_SAMPLES; i++) {
@@ -308,8 +398,9 @@ void LD2420Component::set_operating_mode(const std::string &state) {
308
398
  }
309
399
  } else {
310
400
  // Set the current data back so we don't have new data that can be applied in error.
311
- if (this->get_calibration_())
401
+ if (this->get_calibration_()) {
312
402
  memcpy(&this->new_config, &this->current_config, sizeof(this->current_config));
403
+ }
313
404
  this->set_calibration_(false);
314
405
  }
315
406
  } else {
@@ -319,29 +410,32 @@ void LD2420Component::set_operating_mode(const std::string &state) {
319
410
  }
320
411
 
321
412
  void LD2420Component::readline_(int rx_data, uint8_t *buffer, int len) {
322
- static int pos = 0;
323
-
324
- if (rx_data >= 0) {
325
- if (pos < len - 1) {
326
- buffer[pos++] = rx_data;
327
- buffer[pos] = 0;
328
- } else {
329
- pos = 0;
330
- }
331
- if (pos >= 4) {
332
- if (memcmp(&buffer[pos - 4], &CMD_FRAME_FOOTER, sizeof(CMD_FRAME_FOOTER)) == 0) {
333
- this->set_cmd_active_(false); // Set command state to inactive after responce.
334
- this->handle_ack_data_(buffer, pos);
335
- pos = 0;
336
- } else if ((buffer[pos - 2] == 0x0D && buffer[pos - 1] == 0x0A) && (get_mode_() == CMD_SYSTEM_MODE_SIMPLE)) {
337
- this->handle_simple_mode_(buffer, pos);
338
- pos = 0;
339
- } else if ((memcmp(&buffer[pos - 4], &ENERGY_FRAME_FOOTER, sizeof(ENERGY_FRAME_FOOTER)) == 0) &&
340
- (get_mode_() == CMD_SYSTEM_MODE_ENERGY)) {
341
- this->handle_energy_mode_(buffer, pos);
342
- pos = 0;
343
- }
344
- }
413
+ if (rx_data < 0) {
414
+ return; // No data available
415
+ }
416
+ if (this->buffer_pos_ < len - 1) {
417
+ buffer[this->buffer_pos_++] = rx_data;
418
+ buffer[this->buffer_pos_] = 0;
419
+ } else {
420
+ // We should never get here, but just in case...
421
+ ESP_LOGW(TAG, "Max command length exceeded; ignoring");
422
+ this->buffer_pos_ = 0;
423
+ }
424
+ if (this->buffer_pos_ < 4) {
425
+ return; // Not enough data to process yet
426
+ }
427
+ if (memcmp(&buffer[this->buffer_pos_ - 4], &CMD_FRAME_FOOTER, sizeof(CMD_FRAME_FOOTER)) == 0) {
428
+ this->cmd_active_ = false; // Set command state to inactive after response
429
+ this->handle_ack_data_(buffer, this->buffer_pos_);
430
+ this->buffer_pos_ = 0;
431
+ } else if ((buffer[this->buffer_pos_ - 2] == 0x0D && buffer[this->buffer_pos_ - 1] == 0x0A) &&
432
+ (this->get_mode_() == CMD_SYSTEM_MODE_SIMPLE)) {
433
+ this->handle_simple_mode_(buffer, this->buffer_pos_);
434
+ this->buffer_pos_ = 0;
435
+ } else if ((memcmp(&buffer[this->buffer_pos_ - 4], &ENERGY_FRAME_FOOTER, sizeof(ENERGY_FRAME_FOOTER)) == 0) &&
436
+ (this->get_mode_() == CMD_SYSTEM_MODE_ENERGY)) {
437
+ this->handle_energy_mode_(buffer, this->buffer_pos_);
438
+ this->buffer_pos_ = 0;
345
439
  }
346
440
  }
347
441
 
@@ -365,13 +459,14 @@ void LD2420Component::handle_energy_mode_(uint8_t *buffer, int len) {
365
459
  }
366
460
 
367
461
  // Resonable refresh rate for home assistant database size health
368
- const int32_t current_millis = millis();
369
- if (current_millis - this->last_periodic_millis < REFRESH_RATE_MS)
462
+ const int32_t current_millis = App.get_loop_component_start_time();
463
+ if (current_millis - this->last_periodic_millis < REFRESH_RATE_MS) {
370
464
  return;
465
+ }
371
466
  this->last_periodic_millis = current_millis;
372
467
  for (auto &listener : this->listeners_) {
373
- listener->on_distance(get_distance_());
374
- listener->on_presence(get_presence_());
468
+ listener->on_distance(this->get_distance_());
469
+ listener->on_presence(this->get_presence_());
375
470
  listener->on_energy(this->gate_energy_, sizeof(this->gate_energy_) / sizeof(this->gate_energy_[0]));
376
471
  }
377
472
 
@@ -392,9 +487,9 @@ void LD2420Component::handle_simple_mode_(const uint8_t *inbuf, int len) {
392
487
  char outbuf[bufsize]{0};
393
488
  while (true) {
394
489
  if (inbuf[pos - 2] == 'O' && inbuf[pos - 1] == 'F' && inbuf[pos] == 'F') {
395
- set_presence_(false);
490
+ this->set_presence_(false);
396
491
  } else if (inbuf[pos - 1] == 'O' && inbuf[pos] == 'N') {
397
- set_presence_(true);
492
+ this->set_presence_(true);
398
493
  }
399
494
  if (inbuf[pos] >= '0' && inbuf[pos] <= '9') {
400
495
  if (index < bufsize - 1) {
@@ -410,19 +505,21 @@ void LD2420Component::handle_simple_mode_(const uint8_t *inbuf, int len) {
410
505
  }
411
506
  }
412
507
  outbuf[index] = '\0';
413
- if (index > 1)
414
- set_distance_(strtol(outbuf, &endptr, 10));
508
+ if (index > 1) {
509
+ this->set_distance_(strtol(outbuf, &endptr, 10));
510
+ }
415
511
 
416
- if (get_mode_() == CMD_SYSTEM_MODE_SIMPLE) {
512
+ if (this->get_mode_() == CMD_SYSTEM_MODE_SIMPLE) {
417
513
  // Resonable refresh rate for home assistant database size health
418
- const int32_t current_millis = millis();
419
- if (current_millis - this->last_normal_periodic_millis < REFRESH_RATE_MS)
514
+ const int32_t current_millis = App.get_loop_component_start_time();
515
+ if (current_millis - this->last_normal_periodic_millis < REFRESH_RATE_MS) {
420
516
  return;
517
+ }
421
518
  this->last_normal_periodic_millis = current_millis;
422
519
  for (auto &listener : this->listeners_)
423
- listener->on_distance(get_distance_());
520
+ listener->on_distance(this->get_distance_());
424
521
  for (auto &listener : this->listeners_)
425
- listener->on_presence(get_presence_());
522
+ listener->on_presence(this->get_presence_());
426
523
  }
427
524
  }
428
525
 
@@ -433,10 +530,10 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
433
530
  uint8_t data_element = 0;
434
531
  uint16_t data_pos = 0;
435
532
  if (this->cmd_reply_.length > CMD_MAX_BYTES) {
436
- ESP_LOGW(TAG, "LD2420 reply - received command reply frame is corrupt, length exceeds %d bytes.", CMD_MAX_BYTES);
533
+ ESP_LOGW(TAG, "Reply frame too long");
437
534
  return;
438
535
  } else if (this->cmd_reply_.length < 2) {
439
- ESP_LOGW(TAG, "LD2420 reply - received command frame is corrupt, length is less than 2 bytes.");
536
+ ESP_LOGW(TAG, "Command frame too short");
440
537
  return;
441
538
  }
442
539
  memcpy(&this->cmd_reply_.error, &buffer[CMD_ERROR_WORD], sizeof(this->cmd_reply_.error));
@@ -447,13 +544,13 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
447
544
  this->cmd_reply_.ack = true;
448
545
  switch ((uint16_t) this->cmd_reply_.command) {
449
546
  case (CMD_ENABLE_CONF):
450
- ESP_LOGD(TAG, "LD2420 reply - set config enable: CMD = %2X %s", CMD_ENABLE_CONF, result);
547
+ ESP_LOGV(TAG, "Set config enable: CMD = %2X %s", CMD_ENABLE_CONF, result);
451
548
  break;
452
549
  case (CMD_DISABLE_CONF):
453
- ESP_LOGD(TAG, "LD2420 reply - set config disable: CMD = %2X %s", CMD_DISABLE_CONF, result);
550
+ ESP_LOGV(TAG, "Set config disable: CMD = %2X %s", CMD_DISABLE_CONF, result);
454
551
  break;
455
552
  case (CMD_READ_REGISTER):
456
- ESP_LOGD(TAG, "LD2420 reply - read register: CMD = %2X %s", CMD_READ_REGISTER, result);
553
+ ESP_LOGV(TAG, "Read register: CMD = %2X %s", CMD_READ_REGISTER, result);
457
554
  // TODO Read/Write register is not implemented yet, this will get flushed out to a proper header file
458
555
  data_pos = 0x0A;
459
556
  for (uint16_t index = 0; index < (CMD_REG_DATA_REPLY_SIZE * // NOLINT
@@ -465,13 +562,13 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
465
562
  }
466
563
  break;
467
564
  case (CMD_WRITE_REGISTER):
468
- ESP_LOGD(TAG, "LD2420 reply - write register: CMD = %2X %s", CMD_WRITE_REGISTER, result);
565
+ ESP_LOGV(TAG, "Write register: CMD = %2X %s", CMD_WRITE_REGISTER, result);
469
566
  break;
470
567
  case (CMD_WRITE_ABD_PARAM):
471
- ESP_LOGD(TAG, "LD2420 reply - write gate parameter(s): %2X %s", CMD_WRITE_ABD_PARAM, result);
568
+ ESP_LOGV(TAG, "Write gate parameter(s): %2X %s", CMD_WRITE_ABD_PARAM, result);
472
569
  break;
473
570
  case (CMD_READ_ABD_PARAM):
474
- ESP_LOGD(TAG, "LD2420 reply - read gate parameter(s): %2X %s", CMD_READ_ABD_PARAM, result);
571
+ ESP_LOGV(TAG, "Read gate parameter(s): %2X %s", CMD_READ_ABD_PARAM, result);
475
572
  data_pos = CMD_ABD_DATA_REPLY_START;
476
573
  for (uint16_t index = 0; index < (CMD_ABD_DATA_REPLY_SIZE * // NOLINT
477
574
  ((buffer[CMD_FRAME_DATA_LENGTH] - 4) / CMD_ABD_DATA_REPLY_SIZE));
@@ -483,11 +580,11 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
483
580
  }
484
581
  break;
485
582
  case (CMD_WRITE_SYS_PARAM):
486
- ESP_LOGD(TAG, "LD2420 reply - set system parameter(s): %2X %s", CMD_WRITE_SYS_PARAM, result);
583
+ ESP_LOGV(TAG, "Set system parameter(s): %2X %s", CMD_WRITE_SYS_PARAM, result);
487
584
  break;
488
585
  case (CMD_READ_VERSION):
489
- memcpy(this->ld2420_firmware_ver_, &buffer[12], buffer[10]);
490
- ESP_LOGD(TAG, "LD2420 reply - module firmware version: %7s %s", this->ld2420_firmware_ver_, result);
586
+ memcpy(this->firmware_ver_, &buffer[12], buffer[10]);
587
+ ESP_LOGV(TAG, "Firmware version: %7s %s", this->firmware_ver_, result);
491
588
  break;
492
589
  default:
493
590
  break;
@@ -497,11 +594,12 @@ void LD2420Component::handle_ack_data_(uint8_t *buffer, int len) {
497
594
  int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
498
595
  uint32_t start_millis = millis();
499
596
  uint8_t error = 0;
500
- uint8_t ack_buffer[64];
501
- uint8_t cmd_buffer[64];
597
+ uint8_t ack_buffer[MAX_LINE_LENGTH];
598
+ uint8_t cmd_buffer[MAX_LINE_LENGTH];
502
599
  this->cmd_reply_.ack = false;
503
- if (frame.command != CMD_RESTART)
504
- this->set_cmd_active_(true); // Restart does not reply, thus no ack state required.
600
+ if (frame.command != CMD_RESTART) {
601
+ this->cmd_active_ = true;
602
+ } // Restart does not reply, thus no ack state required
505
603
  uint8_t retry = 3;
506
604
  while (retry) {
507
605
  frame.length = 0;
@@ -523,9 +621,7 @@ int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
523
621
 
524
622
  memcpy(cmd_buffer + frame.length, &frame.footer, sizeof(frame.footer));
525
623
  frame.length += sizeof(frame.footer);
526
- for (uint16_t index = 0; index < frame.length; index++) {
527
- this->write_byte(cmd_buffer[index]);
528
- }
624
+ this->write_array(cmd_buffer, frame.length);
529
625
 
530
626
  error = 0;
531
627
  if (frame.command == CMD_RESTART) {
@@ -533,8 +629,8 @@ int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
533
629
  }
534
630
 
535
631
  while (!this->cmd_reply_.ack) {
536
- while (available()) {
537
- this->readline_(read(), ack_buffer, sizeof(ack_buffer));
632
+ while (this->available()) {
633
+ this->readline_(this->read(), ack_buffer, sizeof(ack_buffer));
538
634
  }
539
635
  delay_microseconds_safe(1450);
540
636
  // Wait on an Rx from the LD2420 for up to 3 1 second loops, otherwise it could trigger a WDT.
@@ -545,10 +641,12 @@ int LD2420Component::send_cmd_from_array(CmdFrameT frame) {
545
641
  break;
546
642
  }
547
643
  }
548
- if (this->cmd_reply_.ack)
644
+ if (this->cmd_reply_.ack) {
549
645
  retry = 0;
550
- if (this->cmd_reply_.error > 0)
551
- handle_cmd_error(error);
646
+ }
647
+ if (this->cmd_reply_.error > 0) {
648
+ this->handle_cmd_error(error);
649
+ }
552
650
  }
553
651
  return error;
554
652
  }
@@ -563,7 +661,7 @@ uint8_t LD2420Component::set_config_mode(bool enable) {
563
661
  cmd_frame.data_length += sizeof(CMD_PROTOCOL_VER);
564
662
  }
565
663
  cmd_frame.footer = CMD_FRAME_FOOTER;
566
- ESP_LOGD(TAG, "Sending set config %s command: %2X", enable ? "enable" : "disable", cmd_frame.command);
664
+ ESP_LOGV(TAG, "Sending set config %s command: %2X", enable ? "enable" : "disable", cmd_frame.command);
567
665
  return this->send_cmd_from_array(cmd_frame);
568
666
  }
569
667
 
@@ -576,7 +674,7 @@ void LD2420Component::ld2420_restart() {
576
674
  cmd_frame.header = CMD_FRAME_HEADER;
577
675
  cmd_frame.command = CMD_RESTART;
578
676
  cmd_frame.footer = CMD_FRAME_FOOTER;
579
- ESP_LOGD(TAG, "Sending restart command: %2X", cmd_frame.command);
677
+ ESP_LOGV(TAG, "Sending restart command: %2X", cmd_frame.command);
580
678
  this->send_cmd_from_array(cmd_frame);
581
679
  }
582
680
 
@@ -588,7 +686,7 @@ void LD2420Component::get_reg_value_(uint16_t reg) {
588
686
  cmd_frame.data[1] = reg;
589
687
  cmd_frame.data_length += 2;
590
688
  cmd_frame.footer = CMD_FRAME_FOOTER;
591
- ESP_LOGD(TAG, "Sending read register %4X command: %2X", reg, cmd_frame.command);
689
+ ESP_LOGV(TAG, "Sending read register %4X command: %2X", reg, cmd_frame.command);
592
690
  this->send_cmd_from_array(cmd_frame);
593
691
  }
594
692
 
@@ -602,11 +700,11 @@ void LD2420Component::set_reg_value(uint16_t reg, uint16_t value) {
602
700
  memcpy(&cmd_frame.data[cmd_frame.data_length], &value, sizeof(CMD_REG_DATA_REPLY_SIZE));
603
701
  cmd_frame.data_length += 2;
604
702
  cmd_frame.footer = CMD_FRAME_FOOTER;
605
- ESP_LOGD(TAG, "Sending write register %4X command: %2X data = %4X", reg, cmd_frame.command, value);
703
+ ESP_LOGV(TAG, "Sending write register %4X command: %2X data = %4X", reg, cmd_frame.command, value);
606
704
  this->send_cmd_from_array(cmd_frame);
607
705
  }
608
706
 
609
- void LD2420Component::handle_cmd_error(uint8_t error) { ESP_LOGI(TAG, "Command failed: %s", ERR_MESSAGE[error]); }
707
+ void LD2420Component::handle_cmd_error(uint8_t error) { ESP_LOGE(TAG, "Command failed: %s", ERR_MESSAGE[error]); }
610
708
 
611
709
  int LD2420Component::get_gate_threshold_(uint8_t gate) {
612
710
  uint8_t error;
@@ -619,7 +717,7 @@ int LD2420Component::get_gate_threshold_(uint8_t gate) {
619
717
  memcpy(&cmd_frame.data[cmd_frame.data_length], &CMD_GATE_STILL_THRESH[gate], sizeof(CMD_GATE_STILL_THRESH[gate]));
620
718
  cmd_frame.data_length += 2;
621
719
  cmd_frame.footer = CMD_FRAME_FOOTER;
622
- ESP_LOGD(TAG, "Sending read gate %d high/low theshold command: %2X", gate, cmd_frame.command);
720
+ ESP_LOGV(TAG, "Sending read gate %d high/low threshold command: %2X", gate, cmd_frame.command);
623
721
  error = this->send_cmd_from_array(cmd_frame);
624
722
  if (error == 0) {
625
723
  this->current_config.move_thresh[gate] = cmd_reply_.data[0];
@@ -644,7 +742,7 @@ int LD2420Component::get_min_max_distances_timeout_() {
644
742
  sizeof(CMD_TIMEOUT_REG)); // Register: global delay time
645
743
  cmd_frame.data_length += sizeof(CMD_TIMEOUT_REG);
646
744
  cmd_frame.footer = CMD_FRAME_FOOTER;
647
- ESP_LOGD(TAG, "Sending read gate min max and timeout command: %2X", cmd_frame.command);
745
+ ESP_LOGV(TAG, "Sending read gate min max and timeout command: %2X", cmd_frame.command);
648
746
  error = this->send_cmd_from_array(cmd_frame);
649
747
  if (error == 0) {
650
748
  this->current_config.min_gate = (uint16_t) cmd_reply_.data[0];
@@ -667,9 +765,10 @@ void LD2420Component::set_system_mode(uint16_t mode) {
667
765
  memcpy(&cmd_frame.data[cmd_frame.data_length], &unknown_parm, sizeof(unknown_parm));
668
766
  cmd_frame.data_length += sizeof(unknown_parm);
669
767
  cmd_frame.footer = CMD_FRAME_FOOTER;
670
- ESP_LOGD(TAG, "Sending write system mode command: %2X", cmd_frame.command);
671
- if (this->send_cmd_from_array(cmd_frame) == 0)
672
- set_mode_(mode);
768
+ ESP_LOGV(TAG, "Sending write system mode command: %2X", cmd_frame.command);
769
+ if (this->send_cmd_from_array(cmd_frame) == 0) {
770
+ this->set_mode_(mode);
771
+ }
673
772
  }
674
773
 
675
774
  void LD2420Component::get_firmware_version_() {
@@ -679,7 +778,7 @@ void LD2420Component::get_firmware_version_() {
679
778
  cmd_frame.command = CMD_READ_VERSION;
680
779
  cmd_frame.footer = CMD_FRAME_FOOTER;
681
780
 
682
- ESP_LOGD(TAG, "Sending read firmware version command: %2X", cmd_frame.command);
781
+ ESP_LOGV(TAG, "Sending read firmware version command: %2X", cmd_frame.command);
683
782
  this->send_cmd_from_array(cmd_frame);
684
783
  }
685
784
 
@@ -712,7 +811,7 @@ void LD2420Component::set_min_max_distances_timeout(uint32_t max_gate_distance,
712
811
  cmd_frame.data_length += sizeof(timeout);
713
812
  cmd_frame.footer = CMD_FRAME_FOOTER;
714
813
 
715
- ESP_LOGD(TAG, "Sending write gate min max and timeout command: %2X", cmd_frame.command);
814
+ ESP_LOGV(TAG, "Sending write gate min max and timeout command: %2X", cmd_frame.command);
716
815
  this->send_cmd_from_array(cmd_frame);
717
816
  }
718
817
 
@@ -738,25 +837,31 @@ void LD2420Component::set_gate_threshold(uint8_t gate) {
738
837
  sizeof(this->new_config.still_thresh[gate]));
739
838
  cmd_frame.data_length += sizeof(this->new_config.still_thresh[gate]);
740
839
  cmd_frame.footer = CMD_FRAME_FOOTER;
741
- ESP_LOGD(TAG, "Sending set gate %4X sensitivity command: %2X", gate, cmd_frame.command);
840
+ ESP_LOGV(TAG, "Sending set gate %4X sensitivity command: %2X", gate, cmd_frame.command);
742
841
  this->send_cmd_from_array(cmd_frame);
743
842
  }
744
843
 
745
844
  #ifdef USE_NUMBER
746
845
  void LD2420Component::init_gate_config_numbers() {
747
- if (this->gate_timeout_number_ != nullptr)
846
+ if (this->gate_timeout_number_ != nullptr) {
748
847
  this->gate_timeout_number_->publish_state(static_cast<uint16_t>(this->current_config.timeout));
749
- if (this->gate_select_number_ != nullptr)
848
+ }
849
+ if (this->gate_select_number_ != nullptr) {
750
850
  this->gate_select_number_->publish_state(0);
751
- if (this->min_gate_distance_number_ != nullptr)
851
+ }
852
+ if (this->min_gate_distance_number_ != nullptr) {
752
853
  this->min_gate_distance_number_->publish_state(static_cast<uint16_t>(this->current_config.min_gate));
753
- if (this->max_gate_distance_number_ != nullptr)
854
+ }
855
+ if (this->max_gate_distance_number_ != nullptr) {
754
856
  this->max_gate_distance_number_->publish_state(static_cast<uint16_t>(this->current_config.max_gate));
755
- if (this->gate_move_sensitivity_factor_number_ != nullptr)
857
+ }
858
+ if (this->gate_move_sensitivity_factor_number_ != nullptr) {
756
859
  this->gate_move_sensitivity_factor_number_->publish_state(this->gate_move_sensitivity_factor);
757
- if (this->gate_still_sensitivity_factor_number_ != nullptr)
860
+ }
861
+ if (this->gate_still_sensitivity_factor_number_ != nullptr) {
758
862
  this->gate_still_sensitivity_factor_number_->publish_state(this->gate_still_sensitivity_factor);
759
- for (uint8_t gate = 0; gate < LD2420_TOTAL_GATES; gate++) {
863
+ }
864
+ for (uint8_t gate = 0; gate < TOTAL_GATES; gate++) {
760
865
  if (this->gate_still_threshold_numbers_[gate] != nullptr) {
761
866
  this->gate_still_threshold_numbers_[gate]->publish_state(
762
867
  static_cast<uint16_t>(this->current_config.still_thresh[gate]));