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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (601) hide show
  1. esphome/__main__.py +1 -3
  2. esphome/codegen.py +2 -0
  3. esphome/components/ac_dimmer/ac_dimmer.cpp +6 -6
  4. esphome/components/adc/__init__.py +25 -1
  5. esphome/components/adc/adc_sensor.h +11 -11
  6. esphome/components/adc/adc_sensor_common.cpp +1 -1
  7. esphome/components/adc/adc_sensor_esp32.cpp +16 -8
  8. esphome/components/ade7880/ade7880.h +0 -2
  9. esphome/components/ads1115/ads1115.h +0 -1
  10. esphome/components/ads1118/ads1118.h +0 -1
  11. esphome/components/ags10/ags10.h +0 -2
  12. esphome/components/aic3204/aic3204.h +0 -1
  13. esphome/components/alarm_control_panel/__init__.py +5 -2
  14. esphome/components/alpha3/alpha3.h +0 -1
  15. esphome/components/am43/cover/am43_cover.h +0 -1
  16. esphome/components/am43/sensor/am43_sensor.h +0 -1
  17. esphome/components/analog_threshold/analog_threshold_binary_sensor.h +0 -2
  18. esphome/components/anova/anova.cpp +5 -1
  19. esphome/components/anova/anova.h +0 -1
  20. esphome/components/apds9960/apds9960.cpp +1 -1
  21. esphome/components/api/__init__.py +42 -20
  22. esphome/components/api/api_connection.cpp +318 -391
  23. esphome/components/api/api_connection.h +206 -126
  24. esphome/components/api/api_frame_helper.cpp +89 -124
  25. esphome/components/api/api_frame_helper.h +57 -45
  26. esphome/components/api/api_pb2.cpp +414 -4350
  27. esphome/components/api/api_pb2.h +287 -198
  28. esphome/components/api/api_pb2_dump.cpp +4333 -0
  29. esphome/components/api/api_pb2_service.cpp +180 -425
  30. esphome/components/api/api_pb2_service.h +7 -6
  31. esphome/components/api/api_pb2_size.h +2 -4
  32. esphome/components/api/api_server.cpp +138 -167
  33. esphome/components/api/api_server.h +66 -12
  34. esphome/components/api/client.py +10 -4
  35. esphome/components/api/list_entities.cpp +36 -105
  36. esphome/components/api/list_entities.h +31 -23
  37. esphome/components/api/proto.h +26 -3
  38. esphome/components/api/subscribe_state.cpp +23 -29
  39. esphome/components/api/subscribe_state.h +26 -19
  40. esphome/components/as5600/as5600.h +0 -1
  41. esphome/components/async_tcp/__init__.py +14 -5
  42. esphome/components/atc_mithermometer/atc_mithermometer.h +0 -1
  43. esphome/components/atm90e32/atm90e32.cpp +2 -1
  44. esphome/components/audio/audio_decoder.cpp +1 -1
  45. esphome/components/audio/audio_transfer_buffer.cpp +2 -2
  46. esphome/components/b_parasite/b_parasite.h +0 -1
  47. esphome/components/bedjet/bedjet_hub.cpp +5 -1
  48. esphome/components/bedjet/climate/bedjet_climate.cpp +5 -1
  49. esphome/components/beken_spi_led_strip/led_strip.cpp +4 -2
  50. esphome/components/bh1750/bh1750.cpp +5 -5
  51. esphome/components/binary_sensor/__init__.py +82 -5
  52. esphome/components/binary_sensor/automation.h +19 -1
  53. esphome/components/binary_sensor/binary_sensor.cpp +12 -30
  54. esphome/components/binary_sensor/binary_sensor.h +11 -25
  55. esphome/components/binary_sensor/filter.cpp +29 -24
  56. esphome/components/binary_sensor/filter.h +20 -10
  57. esphome/components/ble_client/output/ble_binary_output.h +0 -1
  58. esphome/components/ble_client/sensor/ble_rssi_sensor.cpp +5 -1
  59. esphome/components/ble_client/sensor/ble_rssi_sensor.h +0 -1
  60. esphome/components/ble_client/sensor/ble_sensor.cpp +5 -1
  61. esphome/components/ble_client/sensor/ble_sensor.h +0 -1
  62. esphome/components/ble_client/switch/ble_switch.h +0 -1
  63. esphome/components/ble_client/text_sensor/ble_text_sensor.cpp +5 -1
  64. esphome/components/ble_client/text_sensor/ble_text_sensor.h +0 -1
  65. esphome/components/ble_presence/ble_presence_device.h +0 -1
  66. esphome/components/ble_rssi/ble_rssi_sensor.h +0 -1
  67. esphome/components/ble_scanner/ble_scanner.h +0 -1
  68. esphome/components/bluetooth_proxy/bluetooth_connection.h +9 -2
  69. esphome/components/bluetooth_proxy/bluetooth_proxy.cpp +16 -6
  70. esphome/components/bluetooth_proxy/bluetooth_proxy.h +8 -2
  71. esphome/components/bme680/sensor.py +1 -1
  72. esphome/components/bmp581/bmp581.h +0 -2
  73. esphome/components/button/__init__.py +5 -2
  74. esphome/components/camera/__init__.py +1 -0
  75. esphome/components/camera/camera.cpp +22 -0
  76. esphome/components/camera/camera.h +80 -0
  77. esphome/components/canbus/__init__.py +1 -0
  78. esphome/components/cap1188/cap1188.h +0 -1
  79. esphome/components/captive_portal/__init__.py +12 -2
  80. esphome/components/captive_portal/captive_portal.cpp +12 -2
  81. esphome/components/captive_portal/captive_portal.h +5 -2
  82. esphome/components/ccs811/ccs811.h +0 -2
  83. esphome/components/climate/__init__.py +5 -2
  84. esphome/components/cm1106/sensor.py +2 -2
  85. esphome/components/const/__init__.py +2 -0
  86. esphome/components/copy/binary_sensor/copy_binary_sensor.h +0 -1
  87. esphome/components/copy/button/copy_button.h +0 -1
  88. esphome/components/copy/cover/copy_cover.h +0 -1
  89. esphome/components/copy/fan/copy_fan.h +0 -1
  90. esphome/components/copy/lock/copy_lock.h +0 -1
  91. esphome/components/copy/number/copy_number.h +0 -1
  92. esphome/components/copy/select/copy_select.h +0 -1
  93. esphome/components/copy/sensor/copy_sensor.h +0 -1
  94. esphome/components/copy/switch/copy_switch.h +0 -1
  95. esphome/components/copy/text/copy_text.h +0 -1
  96. esphome/components/copy/text_sensor/copy_text_sensor.h +0 -1
  97. esphome/components/cover/__init__.py +5 -2
  98. esphome/components/cs5460a/cs5460a.h +0 -1
  99. esphome/components/datetime/__init__.py +4 -2
  100. esphome/components/debug/__init__.py +20 -0
  101. esphome/components/deep_sleep/__init__.py +43 -9
  102. esphome/components/demo/__init__.py +2 -2
  103. esphome/components/display/display.cpp +4 -3
  104. esphome/components/display/display.h +0 -2
  105. esphome/components/display/display_buffer.cpp +1 -1
  106. esphome/components/ds2484/__init__.py +1 -0
  107. esphome/components/ds2484/ds2484.cpp +209 -0
  108. esphome/components/ds2484/ds2484.h +43 -0
  109. esphome/components/ds2484/one_wire.py +37 -0
  110. esphome/components/duty_time/duty_time_sensor.h +0 -1
  111. esphome/components/ens160_base/ens160_base.h +0 -1
  112. esphome/components/es7210/es7210.h +0 -1
  113. esphome/components/es7243e/es7243e.h +0 -1
  114. esphome/components/es8156/es8156.h +0 -1
  115. esphome/components/es8311/es8311.h +0 -1
  116. esphome/components/es8388/es8388.h +0 -1
  117. esphome/components/esp32/__init__.py +102 -135
  118. esphome/components/esp32/core.cpp +0 -4
  119. esphome/components/esp32/gpio.h +1 -1
  120. esphome/components/esp32/helpers.cpp +69 -0
  121. esphome/components/esp32_ble/ble.cpp +5 -6
  122. esphome/components/esp32_ble/ble.h +29 -14
  123. esphome/components/esp32_ble/ble_event.h +6 -6
  124. esphome/components/esp32_ble_client/ble_client_base.cpp +21 -6
  125. esphome/components/esp32_ble_client/ble_client_base.h +24 -9
  126. esphome/components/esp32_ble_tracker/__init__.py +2 -8
  127. esphome/components/esp32_ble_tracker/esp32_ble_tracker.cpp +5 -5
  128. esphome/components/esp32_ble_tracker/esp32_ble_tracker.h +11 -7
  129. esphome/components/esp32_camera/__init__.py +111 -97
  130. esphome/components/esp32_camera/esp32_camera.cpp +41 -31
  131. esphome/components/esp32_camera/esp32_camera.h +35 -30
  132. esphome/components/esp32_camera_web_server/__init__.py +2 -1
  133. esphome/components/esp32_camera_web_server/camera_web_server.cpp +8 -8
  134. esphome/components/esp32_camera_web_server/camera_web_server.h +3 -3
  135. esphome/components/esp32_hall/sensor.py +2 -21
  136. esphome/components/esp32_hosted/__init__.py +101 -0
  137. esphome/components/esp32_hosted/esp32_hosted.py.script +12 -0
  138. esphome/components/esp32_improv/esp32_improv_component.cpp +3 -0
  139. esphome/components/esp32_rmt/__init__.py +0 -58
  140. esphome/components/esp32_rmt_led_strip/led_strip.cpp +77 -63
  141. esphome/components/esp32_rmt_led_strip/led_strip.h +11 -17
  142. esphome/components/esp32_rmt_led_strip/light.py +14 -76
  143. esphome/components/esp32_touch/esp32_touch.h +174 -28
  144. esphome/components/esp32_touch/esp32_touch_common.cpp +162 -0
  145. esphome/components/esp32_touch/esp32_touch_v1.cpp +238 -0
  146. esphome/components/esp32_touch/esp32_touch_v2.cpp +397 -0
  147. esphome/components/esp8266/__init__.py +1 -0
  148. esphome/components/esp8266/gpio.cpp +10 -10
  149. esphome/components/esp8266/helpers.cpp +31 -0
  150. esphome/components/esphome/ota/__init__.py +1 -0
  151. esphome/components/esphome/ota/ota_esphome.cpp +24 -19
  152. esphome/components/ethernet/__init__.py +42 -23
  153. esphome/components/ethernet/esp_eth_phy_jl1101.c +0 -16
  154. esphome/components/ethernet/ethernet_component.cpp +69 -29
  155. esphome/components/ethernet/ethernet_component.h +18 -10
  156. esphome/components/event/__init__.py +5 -2
  157. esphome/components/ezo/ezo.h +0 -1
  158. esphome/components/ezo_pmp/ezo_pmp.h +0 -1
  159. esphome/components/fan/__init__.py +5 -2
  160. esphome/components/feedback/feedback_cover.h +0 -1
  161. esphome/components/font/__init__.py +92 -82
  162. esphome/components/font/font.cpp +9 -2
  163. esphome/components/font/font.h +20 -5
  164. esphome/components/fs3000/fs3000.h +0 -1
  165. esphome/components/gcja5/gcja5.h +0 -1
  166. esphome/components/gl_r01_i2c/__init__.py +0 -0
  167. esphome/components/gl_r01_i2c/gl_r01_i2c.cpp +68 -0
  168. esphome/components/gl_r01_i2c/gl_r01_i2c.h +22 -0
  169. esphome/components/gl_r01_i2c/sensor.py +36 -0
  170. esphome/components/gp8403/gp8403.h +0 -1
  171. esphome/components/gpio/binary_sensor/__init__.py +17 -0
  172. esphome/components/gpio/binary_sensor/gpio_binary_sensor.cpp +77 -3
  173. esphome/components/gpio/binary_sensor/gpio_binary_sensor.h +40 -0
  174. esphome/components/grove_gas_mc_v2/grove_gas_mc_v2.h +0 -2
  175. esphome/components/he60r/he60r.h +0 -1
  176. esphome/components/heatpumpir/climate.py +2 -1
  177. esphome/components/heatpumpir/heatpumpir.cpp +1 -0
  178. esphome/components/heatpumpir/heatpumpir.h +1 -0
  179. esphome/components/honeywellabp2_i2c/honeywellabp2.h +0 -1
  180. esphome/components/host/__init__.py +2 -1
  181. esphome/components/host/helpers.cpp +57 -0
  182. esphome/components/http_request/__init__.py +19 -1
  183. esphome/components/http_request/http_request.h +1 -1
  184. esphome/components/http_request/http_request_arduino.cpp +0 -1
  185. esphome/components/http_request/http_request_arduino.h +1 -0
  186. esphome/components/http_request/http_request_idf.cpp +0 -1
  187. esphome/components/http_request/ota/ota_http_request.cpp +1 -1
  188. esphome/components/http_request/update/http_request_update.cpp +28 -9
  189. esphome/components/hydreon_rgxx/hydreon_rgxx.cpp +3 -9
  190. esphome/components/hydreon_rgxx/sensor.py +1 -1
  191. esphome/components/i2c/__init__.py +23 -11
  192. esphome/components/i2c/i2c_bus.h +8 -1
  193. esphome/components/i2c/i2c_bus_arduino.cpp +4 -3
  194. esphome/components/i2c/i2c_bus_arduino.h +6 -3
  195. esphome/components/i2c/i2c_bus_esp_idf.h +5 -3
  196. esphome/components/i2c_device/i2c_device.h +0 -1
  197. esphome/components/i2s_audio/__init__.py +2 -10
  198. esphome/components/i2s_audio/i2s_audio.cpp +1 -5
  199. esphome/components/i2s_audio/media_player/__init__.py +2 -2
  200. esphome/components/i2s_audio/speaker/i2s_audio_speaker.cpp +2 -2
  201. esphome/components/iaqcore/iaqcore.h +0 -2
  202. esphome/components/image/__init__.py +123 -24
  203. esphome/components/improv_serial/improv_serial_component.cpp +0 -4
  204. esphome/components/ina219/ina219.cpp +7 -0
  205. esphome/components/ina219/ina219.h +1 -0
  206. esphome/components/ina260/ina260.h +0 -2
  207. esphome/components/inkbird_ibsth1_mini/inkbird_ibsth1_mini.h +0 -1
  208. esphome/components/inkplate6/display.py +15 -0
  209. esphome/components/inkplate6/inkplate.cpp +2 -2
  210. esphome/components/integration/integration_sensor.h +0 -1
  211. esphome/components/internal_temperature/internal_temperature.cpp +8 -27
  212. esphome/components/internal_temperature/sensor.py +0 -26
  213. esphome/components/interval/interval.h +0 -2
  214. esphome/components/ld2410/button/__init__.py +3 -3
  215. esphome/components/ld2410/button/factory_reset_button.cpp +9 -0
  216. esphome/components/ld2410/button/{reset_button.h → factory_reset_button.h} +2 -2
  217. esphome/components/ld2410/ld2410.cpp +430 -261
  218. esphome/components/ld2410/ld2410.h +44 -146
  219. esphome/components/ld2410/number/__init__.py +2 -2
  220. esphome/components/ld2410/sensor.py +1 -1
  221. esphome/components/ld2410/switch/__init__.py +1 -1
  222. esphome/components/ld2420/ld2420.cpp +196 -100
  223. esphome/components/ld2420/ld2420.h +46 -118
  224. esphome/components/ld2420/number/__init__.py +2 -2
  225. esphome/components/ld2420/sensor/__init__.py +6 -2
  226. esphome/components/ld2420/sensor/ld2420_sensor.h +1 -1
  227. esphome/components/ld2450/button/__init__.py +3 -3
  228. esphome/components/ld2450/button/factory_reset_button.cpp +9 -0
  229. esphome/components/ld2450/button/{reset_button.h → factory_reset_button.h} +2 -2
  230. esphome/components/ld2450/ld2450.cpp +384 -232
  231. esphome/components/ld2450/ld2450.h +60 -69
  232. esphome/components/ld2450/switch/__init__.py +1 -1
  233. esphome/components/ledc/ledc_output.cpp +1 -63
  234. esphome/components/libretiny/__init__.py +4 -3
  235. esphome/components/libretiny/const.py +5 -0
  236. esphome/components/libretiny/generate_components.py +1 -0
  237. esphome/components/libretiny/helpers.cpp +35 -0
  238. esphome/components/libretiny/lt_component.cpp +5 -3
  239. esphome/components/light/__init__.py +4 -2
  240. esphome/components/light/addressable_light.h +3 -3
  241. esphome/components/light/light_call.cpp +180 -243
  242. esphome/components/light/light_call.h +72 -20
  243. esphome/components/light/light_color_values.h +14 -14
  244. esphome/components/light/light_state.h +15 -13
  245. esphome/components/light/transformers.h +2 -2
  246. esphome/components/ln882x/__init__.py +52 -0
  247. esphome/components/ln882x/boards.py +285 -0
  248. esphome/components/lock/__init__.py +5 -2
  249. esphome/components/logger/__init__.py +40 -3
  250. esphome/components/logger/logger.cpp +47 -12
  251. esphome/components/logger/logger.h +80 -49
  252. esphome/components/logger/logger_esp32.cpp +3 -3
  253. esphome/components/lps22/__init__.py +0 -0
  254. esphome/components/lps22/lps22.cpp +75 -0
  255. esphome/components/lps22/lps22.h +27 -0
  256. esphome/components/lps22/sensor.py +58 -0
  257. esphome/components/ltr390/ltr390.h +0 -1
  258. esphome/components/ltr501/ltr501.h +0 -1
  259. esphome/components/ltr_als_ps/ltr_als_ps.h +0 -1
  260. esphome/components/lvgl/__init__.py +1 -1
  261. esphome/components/lvgl/schemas.py +66 -6
  262. esphome/components/lvgl/styles.py +24 -16
  263. esphome/components/lvgl/widgets/__init__.py +12 -2
  264. esphome/components/lvgl/widgets/lv_bar.py +40 -19
  265. esphome/components/m5stack_8angle/light/m5stack_8angle_light.cpp +1 -1
  266. esphome/components/max9611/max9611.h +0 -1
  267. esphome/components/mcp23016/__init__.py +1 -1
  268. esphome/components/mcp23xxx_base/__init__.py +1 -1
  269. esphome/components/mcp4461/__init__.py +1 -1
  270. esphome/components/mcp4461/output/__init__.py +3 -2
  271. esphome/components/mcp9600/mcp9600.h +0 -2
  272. esphome/components/md5/md5.cpp +3 -3
  273. esphome/components/md5/md5.h +1 -6
  274. esphome/components/mdns/__init__.py +22 -11
  275. esphome/components/media_player/__init__.py +4 -3
  276. esphome/components/micro_wake_word/__init__.py +1 -5
  277. esphome/components/micro_wake_word/streaming_model.cpp +2 -2
  278. esphome/components/microphone/microphone.cpp +7 -9
  279. esphome/components/microphone/microphone.h +0 -2
  280. esphome/components/mipi_spi/display.py +1 -0
  281. esphome/components/mmc5603/mmc5603.cpp +1 -1
  282. esphome/components/modbus/modbus.cpp +33 -15
  283. esphome/components/modbus/modbus.h +9 -0
  284. esphome/components/modbus_controller/__init__.py +42 -10
  285. esphome/components/modbus_controller/modbus_controller.cpp +92 -11
  286. esphome/components/modbus_controller/modbus_controller.h +61 -7
  287. esphome/components/mopeka_pro_check/mopeka_pro_check.h +0 -1
  288. esphome/components/mopeka_std_check/mopeka_std_check.h +0 -1
  289. esphome/components/mpl3115a2/mpl3115a2.h +0 -2
  290. esphome/components/mqtt/__init__.py +16 -0
  291. esphome/components/mqtt/mqtt_backend.h +2 -1
  292. esphome/components/mqtt/mqtt_backend_esp32.cpp +126 -45
  293. esphome/components/mqtt/mqtt_backend_esp32.h +106 -4
  294. esphome/components/mqtt/mqtt_client.cpp +15 -9
  295. esphome/components/mqtt/mqtt_client.h +8 -3
  296. esphome/components/ms8607/ms8607.h +0 -1
  297. esphome/components/neopixelbus/light.py +4 -1
  298. esphome/components/neopixelbus/neopixelbus_light.h +1 -1
  299. esphome/components/network/__init__.py +4 -1
  300. esphome/components/network/ip_address.h +1 -0
  301. esphome/components/nextion/__init__.py +16 -0
  302. esphome/components/nextion/base_component.py +1 -0
  303. esphome/components/nextion/binary_sensor/nextion_binarysensor.cpp +1 -1
  304. esphome/components/nextion/display.py +14 -4
  305. esphome/components/nextion/nextion.cpp +166 -101
  306. esphome/components/nextion/nextion.h +84 -53
  307. esphome/components/nextion/nextion_commands.cpp +11 -10
  308. esphome/components/nextion/nextion_component.cpp +28 -28
  309. esphome/components/nextion/nextion_component.h +53 -18
  310. esphome/components/nextion/nextion_component_base.h +3 -0
  311. esphome/components/nextion/nextion_upload.cpp +36 -0
  312. esphome/components/nextion/nextion_upload_arduino.cpp +10 -35
  313. esphome/components/nextion/nextion_upload_idf.cpp +9 -33
  314. esphome/components/nextion/sensor/nextion_sensor.cpp +1 -1
  315. esphome/components/nextion/switch/nextion_switch.cpp +1 -1
  316. esphome/components/nextion/text_sensor/nextion_textsensor.cpp +1 -1
  317. esphome/components/nfc/nfc.cpp +3 -22
  318. esphome/components/nfc/nfc.h +3 -3
  319. esphome/components/number/__init__.py +5 -2
  320. esphome/components/online_image/__init__.py +5 -0
  321. esphome/components/online_image/online_image.cpp +6 -2
  322. esphome/components/online_image/online_image.h +4 -1
  323. esphome/components/opentherm/opentherm.cpp +7 -12
  324. esphome/components/openthread/__init__.py +47 -40
  325. esphome/components/openthread/const.py +1 -0
  326. esphome/components/openthread/openthread_esp.cpp +27 -5
  327. esphome/components/opt3001/__init__.py +0 -0
  328. esphome/components/opt3001/opt3001.cpp +122 -0
  329. esphome/components/opt3001/opt3001.h +27 -0
  330. esphome/components/opt3001/sensor.py +35 -0
  331. esphome/components/ota/__init__.py +17 -0
  332. esphome/components/ota/ota_backend.h +27 -1
  333. esphome/components/ota/ota_backend_arduino_esp32.cpp +12 -2
  334. esphome/components/ota/ota_backend_arduino_esp32.h +3 -0
  335. esphome/components/ota/ota_backend_arduino_esp8266.cpp +18 -4
  336. esphome/components/ota/ota_backend_arduino_esp8266.h +3 -0
  337. esphome/components/ota/ota_backend_arduino_libretiny.cpp +12 -2
  338. esphome/components/ota/ota_backend_arduino_libretiny.h +3 -0
  339. esphome/components/ota/ota_backend_arduino_rp2040.cpp +9 -2
  340. esphome/components/ota/ota_backend_arduino_rp2040.h +3 -0
  341. esphome/components/ota/ota_backend_esp_idf.cpp +10 -16
  342. esphome/components/ota/ota_backend_esp_idf.h +1 -0
  343. esphome/components/packages/__init__.py +5 -2
  344. esphome/components/packet_transport/binary_sensor.py +61 -4
  345. esphome/components/packet_transport/packet_transport.cpp +31 -1
  346. esphome/components/packet_transport/packet_transport.h +11 -5
  347. esphome/components/pcf8574/__init__.py +1 -1
  348. esphome/components/pi4ioe5v6408/__init__.py +84 -0
  349. esphome/components/pi4ioe5v6408/pi4ioe5v6408.cpp +171 -0
  350. esphome/components/pi4ioe5v6408/pi4ioe5v6408.h +70 -0
  351. esphome/components/pmsa003i/pmsa003i.h +0 -1
  352. esphome/components/pmsx003/pmsx003.h +0 -1
  353. esphome/components/pn7150/pn7150.cpp +7 -7
  354. esphome/components/pn7150/pn7150.h +0 -1
  355. esphome/components/pn7160/pn7160.cpp +7 -7
  356. esphome/components/pn7160/pn7160.h +0 -1
  357. esphome/components/preferences/syncer.h +2 -0
  358. esphome/components/prometheus/prometheus_handler.h +1 -1
  359. esphome/components/psram/psram.cpp +0 -20
  360. esphome/components/pulse_counter/pulse_counter_sensor.h +0 -1
  361. esphome/components/pulse_meter/pulse_meter_sensor.cpp +8 -4
  362. esphome/components/pulse_width/pulse_width.h +0 -1
  363. esphome/components/pvvx_mithermometer/display/pvvx_display.cpp +0 -4
  364. esphome/components/pvvx_mithermometer/display/pvvx_display.h +0 -2
  365. esphome/components/pvvx_mithermometer/pvvx_mithermometer.h +0 -1
  366. esphome/components/qr_code/__init__.py +13 -10
  367. esphome/components/qwiic_pir/qwiic_pir.h +0 -1
  368. esphome/components/radon_eye_ble/radon_eye_listener.cpp +1 -1
  369. esphome/components/rc522/rc522.h +0 -1
  370. esphome/components/rdm6300/rdm6300.h +0 -2
  371. esphome/components/remote_base/__init__.py +7 -5
  372. esphome/components/remote_base/remote_base.cpp +24 -21
  373. esphome/components/remote_base/remote_base.h +3 -26
  374. esphome/components/remote_receiver/__init__.py +40 -46
  375. esphome/components/remote_receiver/remote_receiver.h +4 -18
  376. esphome/components/remote_receiver/remote_receiver_esp32.cpp +0 -87
  377. esphome/components/remote_receiver/remote_receiver_esp8266.cpp +1 -1
  378. esphome/components/remote_transmitter/__init__.py +42 -43
  379. esphome/components/remote_transmitter/remote_transmitter.h +2 -14
  380. esphome/components/remote_transmitter/remote_transmitter_esp32.cpp +0 -77
  381. esphome/components/resistance/resistance_sensor.h +0 -1
  382. esphome/components/rp2040/__init__.py +1 -0
  383. esphome/components/rp2040/helpers.cpp +55 -0
  384. esphome/components/rp2040_pio_led_strip/led_strip.cpp +2 -2
  385. esphome/components/rpi_dpi_rgb/rpi_dpi_rgb.cpp +0 -4
  386. esphome/components/rtttl/__init__.py +4 -4
  387. esphome/components/rtttl/rtttl.cpp +10 -1
  388. esphome/components/ruuvitag/ruuvitag.h +0 -1
  389. esphome/components/safe_mode/safe_mode.cpp +2 -0
  390. esphome/components/safe_mode/safe_mode.h +4 -1
  391. esphome/components/scd30/scd30.h +0 -1
  392. esphome/components/scd30/sensor.py +2 -2
  393. esphome/components/scd4x/scd4x.cpp +61 -54
  394. esphome/components/scd4x/scd4x.h +17 -15
  395. esphome/components/scd4x/sensor.py +4 -4
  396. esphome/components/script/script.h +0 -2
  397. esphome/components/sdp3x/sensor.py +1 -1
  398. esphome/components/select/__init__.py +5 -2
  399. esphome/components/sen5x/sen5x.h +0 -1
  400. esphome/components/senseair/senseair.h +0 -1
  401. esphome/components/sensor/__init__.py +4 -2
  402. esphome/components/sensor/filter.cpp +1 -1
  403. esphome/components/sensor/sensor.cpp +12 -6
  404. esphome/components/sensor/sensor.h +13 -5
  405. esphome/components/servo/servo.h +0 -1
  406. esphome/components/sfa30/sfa30.h +0 -1
  407. esphome/components/sgp30/sgp30.h +0 -1
  408. esphome/components/sgp4x/sgp4x.h +0 -1
  409. esphome/components/shelly_dimmer/stm32flash.cpp +1 -2
  410. esphome/components/sht4x/sht4x.h +0 -1
  411. esphome/components/sm300d2/sm300d2.h +0 -2
  412. esphome/components/smt100/sensor.py +8 -4
  413. esphome/components/smt100/smt100.cpp +5 -5
  414. esphome/components/smt100/smt100.h +3 -3
  415. esphome/components/sn74hc595/__init__.py +1 -1
  416. esphome/components/sn74hc595/sn74hc595.cpp +5 -4
  417. esphome/components/sntp/sntp_component.cpp +9 -3
  418. esphome/components/sntp/time.py +2 -0
  419. esphome/components/socket/__init__.py +17 -0
  420. esphome/components/spi/__init__.py +27 -6
  421. esphome/components/spi/spi.cpp +3 -2
  422. esphome/components/spi/spi.h +9 -3
  423. esphome/components/spi/spi_arduino.cpp +3 -5
  424. esphome/components/spi/spi_esp_idf.cpp +40 -21
  425. esphome/components/spi_led_strip/spi_led_strip.cpp +1 -1
  426. esphome/components/sps30/sps30.h +0 -1
  427. esphome/components/ssd1306_base/ssd1306_base.cpp +1 -1
  428. esphome/components/st7701s/st7701s.cpp +0 -4
  429. esphome/components/status/status_binary_sensor.h +0 -2
  430. esphome/components/substitutions/__init__.py +76 -19
  431. esphome/components/substitutions/jinja.py +99 -0
  432. esphome/components/sun/sun.cpp +3 -4
  433. esphome/components/switch/__init__.py +5 -2
  434. esphome/components/switch/binary_sensor/switch_binary_sensor.h +0 -1
  435. esphome/components/sx126x/__init__.py +317 -0
  436. esphome/components/sx126x/automation.h +62 -0
  437. esphome/components/sx126x/packet_transport/__init__.py +26 -0
  438. esphome/components/sx126x/packet_transport/sx126x_transport.cpp +26 -0
  439. esphome/components/sx126x/packet_transport/sx126x_transport.h +25 -0
  440. esphome/components/sx126x/sx126x.cpp +523 -0
  441. esphome/components/sx126x/sx126x.h +140 -0
  442. esphome/components/sx126x/sx126x_reg.h +163 -0
  443. esphome/components/sx127x/__init__.py +325 -0
  444. esphome/components/sx127x/automation.h +62 -0
  445. esphome/components/sx127x/packet_transport/__init__.py +26 -0
  446. esphome/components/sx127x/packet_transport/sx127x_transport.cpp +26 -0
  447. esphome/components/sx127x/packet_transport/sx127x_transport.h +25 -0
  448. esphome/components/sx127x/sx127x.cpp +498 -0
  449. esphome/components/sx127x/sx127x.h +128 -0
  450. esphome/components/sx127x/sx127x_reg.h +295 -0
  451. esphome/components/syslog/esphome_syslog.cpp +5 -3
  452. esphome/components/syslog/esphome_syslog.h +1 -1
  453. esphome/components/tca9555/__init__.py +1 -1
  454. esphome/components/template/binary_sensor/template_binary_sensor.cpp +1 -9
  455. esphome/components/text/__init__.py +5 -2
  456. esphome/components/text_sensor/__init__.py +5 -2
  457. esphome/components/thermostat/thermostat_climate.cpp +34 -31
  458. esphome/components/thermostat/thermostat_climate.h +43 -39
  459. esphome/components/time/__init__.py +16 -2
  460. esphome/components/time/real_time_clock.cpp +4 -0
  461. esphome/components/time/real_time_clock.h +5 -1
  462. esphome/components/tlc5971/tlc5971.cpp +4 -1
  463. esphome/components/tmp1075/tmp1075.h +0 -2
  464. esphome/components/tof10120/tof10120_sensor.h +0 -1
  465. esphome/components/tormatic/tormatic_cover.h +0 -1
  466. esphome/components/total_daily_energy/total_daily_energy.h +0 -1
  467. esphome/components/tsl2591/tsl2591.cpp +1 -1
  468. esphome/components/ttp229_bsf/ttp229_bsf.h +0 -1
  469. esphome/components/ttp229_lsf/ttp229_lsf.h +0 -1
  470. esphome/components/tx20/tx20.cpp +2 -2
  471. esphome/components/uart/__init__.py +18 -0
  472. esphome/components/uart/uart_component_esp_idf.cpp +1 -5
  473. esphome/components/update/__init__.py +5 -2
  474. esphome/components/update/update_entity.h +8 -0
  475. esphome/components/usb_host/__init__.py +5 -2
  476. esphome/components/valve/__init__.py +5 -2
  477. esphome/components/vbus/vbus.h +0 -1
  478. esphome/components/veml3235/veml3235.h +0 -1
  479. esphome/components/veml7700/veml7700.h +0 -1
  480. esphome/components/vl53l0x/vl53l0x_sensor.h +0 -1
  481. esphome/components/voice_assistant/voice_assistant.cpp +4 -4
  482. esphome/components/watchdog/watchdog.cpp +0 -4
  483. esphome/components/waveshare_epaper/waveshare_epaper.cpp +6 -6
  484. esphome/components/web_server/__init__.py +34 -19
  485. esphome/components/web_server/ota/__init__.py +32 -0
  486. esphome/components/web_server/ota/ota_web_server.cpp +210 -0
  487. esphome/components/web_server/ota/ota_web_server.h +26 -0
  488. esphome/components/web_server/web_server.cpp +311 -430
  489. esphome/components/web_server/web_server.h +33 -23
  490. esphome/components/web_server/web_server_v1.cpp +4 -5
  491. esphome/components/web_server_base/__init__.py +5 -2
  492. esphome/components/web_server_base/web_server_base.cpp +2 -94
  493. esphome/components/web_server_base/web_server_base.h +5 -25
  494. esphome/components/web_server_idf/multipart.cpp +254 -0
  495. esphome/components/web_server_idf/multipart.h +86 -0
  496. esphome/components/web_server_idf/utils.cpp +32 -0
  497. esphome/components/web_server_idf/utils.h +10 -0
  498. esphome/components/web_server_idf/web_server_idf.cpp +162 -16
  499. esphome/components/web_server_idf/web_server_idf.h +11 -10
  500. esphome/components/wiegand/wiegand.cpp +2 -2
  501. esphome/components/wifi/__init__.py +18 -0
  502. esphome/components/wifi/wifi_component.cpp +17 -22
  503. esphome/components/wifi/wifi_component.h +27 -23
  504. esphome/components/wifi/wifi_component_esp32_arduino.cpp +52 -59
  505. esphome/components/wifi/wifi_component_esp8266.cpp +46 -46
  506. esphome/components/wifi/wifi_component_esp_idf.cpp +35 -36
  507. esphome/components/wifi/wifi_component_libretiny.cpp +26 -27
  508. esphome/components/wifi/wifi_component_pico_w.cpp +3 -3
  509. esphome/components/wifi_info/wifi_info_text_sensor.cpp +6 -6
  510. esphome/components/wireguard/__init__.py +2 -11
  511. esphome/components/xiaomi_ble/xiaomi_ble.cpp +13 -1
  512. esphome/components/xiaomi_ble/xiaomi_ble.h +1 -0
  513. esphome/components/xiaomi_cgd1/xiaomi_cgd1.h +0 -1
  514. esphome/components/xiaomi_cgdk2/xiaomi_cgdk2.h +0 -1
  515. esphome/components/xiaomi_cgg1/xiaomi_cgg1.h +0 -1
  516. esphome/components/xiaomi_cgpr1/xiaomi_cgpr1.h +0 -1
  517. esphome/components/xiaomi_gcls002/xiaomi_gcls002.h +0 -1
  518. esphome/components/xiaomi_hhccjcy01/xiaomi_hhccjcy01.h +0 -1
  519. esphome/components/xiaomi_hhccjcy10/xiaomi_hhccjcy10.h +0 -1
  520. esphome/components/xiaomi_hhccpot002/xiaomi_hhccpot002.h +0 -1
  521. esphome/components/xiaomi_jqjcy01ym/xiaomi_jqjcy01ym.h +0 -1
  522. esphome/components/xiaomi_lywsd02/xiaomi_lywsd02.h +0 -1
  523. esphome/components/xiaomi_lywsd02mmc/xiaomi_lywsd02mmc.h +0 -1
  524. esphome/components/xiaomi_lywsd03mmc/xiaomi_lywsd03mmc.h +0 -1
  525. esphome/components/xiaomi_lywsdcgq/xiaomi_lywsdcgq.h +0 -1
  526. esphome/components/xiaomi_mhoc303/xiaomi_mhoc303.h +0 -1
  527. esphome/components/xiaomi_mhoc401/xiaomi_mhoc401.h +0 -1
  528. esphome/components/xiaomi_miscale/xiaomi_miscale.h +0 -1
  529. esphome/components/xiaomi_mjyd02yla/xiaomi_mjyd02yla.h +0 -1
  530. esphome/components/xiaomi_mue4094rt/xiaomi_mue4094rt.h +0 -1
  531. esphome/components/xiaomi_rtcgq02lm/xiaomi_rtcgq02lm.h +0 -1
  532. esphome/components/xiaomi_wx08zm/xiaomi_wx08zm.h +0 -1
  533. esphome/components/xiaomi_xmwsdj04mmc/__init__.py +0 -0
  534. esphome/components/xiaomi_xmwsdj04mmc/sensor.py +77 -0
  535. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.cpp +77 -0
  536. esphome/components/xiaomi_xmwsdj04mmc/xiaomi_xmwsdj04mmc.h +36 -0
  537. esphome/components/zio_ultrasonic/zio_ultrasonic.h +0 -2
  538. esphome/components/zyaura/zyaura.h +0 -1
  539. esphome/config.py +88 -22
  540. esphome/config_helpers.py +74 -1
  541. esphome/config_validation.py +12 -1
  542. esphome/const.py +65 -10
  543. esphome/core/__init__.py +18 -2
  544. esphome/core/application.cpp +163 -10
  545. esphome/core/application.h +145 -165
  546. esphome/core/area.h +19 -0
  547. esphome/core/automation.h +58 -9
  548. esphome/core/color.cpp +3 -5
  549. esphome/core/color.h +16 -16
  550. esphome/core/component.cpp +151 -18
  551. esphome/core/component.h +98 -4
  552. esphome/core/component_iterator.cpp +7 -7
  553. esphome/core/component_iterator.h +9 -7
  554. esphome/core/config.py +155 -6
  555. esphome/core/controller.cpp +4 -2
  556. esphome/core/controller.h +1 -1
  557. esphome/core/datatypes.h +2 -2
  558. esphome/core/defines.h +17 -2
  559. esphome/core/device.h +20 -0
  560. esphome/core/entity_base.cpp +20 -15
  561. esphome/core/entity_base.h +76 -0
  562. esphome/core/entity_helpers.py +162 -1
  563. esphome/core/event_pool.h +81 -0
  564. esphome/core/helpers.cpp +75 -230
  565. esphome/core/helpers.h +164 -104
  566. esphome/core/lock_free_queue.h +151 -0
  567. esphome/core/log.cpp +2 -2
  568. esphome/core/log.h +2 -0
  569. esphome/core/optional.h +5 -0
  570. esphome/core/ring_buffer.cpp +2 -2
  571. esphome/core/scheduler.cpp +278 -103
  572. esphome/core/scheduler.h +157 -17
  573. esphome/core/time.cpp +5 -5
  574. esphome/core/time.h +5 -5
  575. esphome/cpp_generator.py +17 -0
  576. esphome/cpp_helpers.py +0 -22
  577. esphome/cpp_types.py +3 -1
  578. esphome/dashboard/entries.py +1 -1
  579. esphome/dashboard/util/text.py +5 -21
  580. esphome/dashboard/web_server.py +9 -1
  581. esphome/helpers.py +47 -0
  582. esphome/loader.py +15 -1
  583. esphome/pins.py +14 -8
  584. esphome/wizard.py +16 -3
  585. esphome/writer.py +21 -3
  586. esphome/yaml_util.py +0 -2
  587. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/METADATA +10 -9
  588. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/RECORD +593 -533
  589. esphome/components/esp32_ble/ble_event_pool.h +0 -72
  590. esphome/components/esp32_ble/queue.h +0 -85
  591. esphome/components/esp32_hall/esp32_hall.cpp +0 -25
  592. esphome/components/esp32_hall/esp32_hall.h +0 -23
  593. esphome/components/esp32_touch/esp32_touch.cpp +0 -355
  594. esphome/components/ld2410/button/reset_button.cpp +0 -9
  595. esphome/components/ld2450/button/reset_button.cpp +0 -9
  596. esphome/components/openthread/tlv.py +0 -65
  597. /esphome/{dashboard/enum.py → enum.py} +0 -0
  598. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/WHEEL +0 -0
  599. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/entry_points.txt +0 -0
  600. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/licenses/LICENSE +0 -0
  601. {esphome-2025.6.2.dist-info → esphome-2025.7.0b1.dist-info}/top_level.txt +0 -0
@@ -8,6 +8,9 @@
8
8
  #include "esphome/components/sensor/sensor.h"
9
9
  #endif
10
10
 
11
+ #include "esphome/core/application.h"
12
+
13
+ #define CHECK_BIT(var, pos) (((var) >> (pos)) & 1)
11
14
  #define highbyte(val) (uint8_t)((val) >> 8)
12
15
  #define lowbyte(val) (uint8_t)((val) &0xff)
13
16
 
@@ -15,68 +18,244 @@ namespace esphome {
15
18
  namespace ld2410 {
16
19
 
17
20
  static const char *const TAG = "ld2410";
21
+ static const char *const UNKNOWN_MAC = "unknown";
22
+ static const char *const VERSION_FMT = "%u.%02X.%02X%02X%02X%02X";
23
+
24
+ enum BaudRate : uint8_t {
25
+ BAUD_RATE_9600 = 1,
26
+ BAUD_RATE_19200 = 2,
27
+ BAUD_RATE_38400 = 3,
28
+ BAUD_RATE_57600 = 4,
29
+ BAUD_RATE_115200 = 5,
30
+ BAUD_RATE_230400 = 6,
31
+ BAUD_RATE_256000 = 7,
32
+ BAUD_RATE_460800 = 8,
33
+ };
34
+
35
+ enum DistanceResolution : uint8_t {
36
+ DISTANCE_RESOLUTION_0_2 = 0x01,
37
+ DISTANCE_RESOLUTION_0_75 = 0x00,
38
+ };
39
+
40
+ enum LightFunction : uint8_t {
41
+ LIGHT_FUNCTION_OFF = 0x00,
42
+ LIGHT_FUNCTION_BELOW = 0x01,
43
+ LIGHT_FUNCTION_ABOVE = 0x02,
44
+ };
45
+
46
+ enum OutPinLevel : uint8_t {
47
+ OUT_PIN_LEVEL_LOW = 0x00,
48
+ OUT_PIN_LEVEL_HIGH = 0x01,
49
+ };
50
+
51
+ enum PeriodicData : uint8_t {
52
+ DATA_TYPES = 6,
53
+ TARGET_STATES = 8,
54
+ MOVING_TARGET_LOW = 9,
55
+ MOVING_TARGET_HIGH = 10,
56
+ MOVING_ENERGY = 11,
57
+ STILL_TARGET_LOW = 12,
58
+ STILL_TARGET_HIGH = 13,
59
+ STILL_ENERGY = 14,
60
+ DETECT_DISTANCE_LOW = 15,
61
+ DETECT_DISTANCE_HIGH = 16,
62
+ MOVING_SENSOR_START = 19,
63
+ STILL_SENSOR_START = 28,
64
+ LIGHT_SENSOR = 37,
65
+ OUT_PIN_SENSOR = 38,
66
+ };
67
+
68
+ enum PeriodicDataValue : uint8_t {
69
+ HEADER = 0xAA,
70
+ FOOTER = 0x55,
71
+ CHECK = 0x00,
72
+ };
73
+
74
+ enum AckData : uint8_t {
75
+ COMMAND = 6,
76
+ COMMAND_STATUS = 7,
77
+ };
78
+
79
+ // Memory-efficient lookup tables
80
+ struct StringToUint8 {
81
+ const char *str;
82
+ const uint8_t value;
83
+ };
84
+
85
+ struct Uint8ToString {
86
+ const uint8_t value;
87
+ const char *str;
88
+ };
89
+
90
+ constexpr StringToUint8 BAUD_RATES_BY_STR[] = {
91
+ {"9600", BAUD_RATE_9600}, {"19200", BAUD_RATE_19200}, {"38400", BAUD_RATE_38400},
92
+ {"57600", BAUD_RATE_57600}, {"115200", BAUD_RATE_115200}, {"230400", BAUD_RATE_230400},
93
+ {"256000", BAUD_RATE_256000}, {"460800", BAUD_RATE_460800},
94
+ };
95
+
96
+ constexpr StringToUint8 DISTANCE_RESOLUTIONS_BY_STR[] = {
97
+ {"0.2m", DISTANCE_RESOLUTION_0_2},
98
+ {"0.75m", DISTANCE_RESOLUTION_0_75},
99
+ };
100
+
101
+ constexpr Uint8ToString DISTANCE_RESOLUTIONS_BY_UINT[] = {
102
+ {DISTANCE_RESOLUTION_0_2, "0.2m"},
103
+ {DISTANCE_RESOLUTION_0_75, "0.75m"},
104
+ };
105
+
106
+ constexpr StringToUint8 LIGHT_FUNCTIONS_BY_STR[] = {
107
+ {"off", LIGHT_FUNCTION_OFF},
108
+ {"below", LIGHT_FUNCTION_BELOW},
109
+ {"above", LIGHT_FUNCTION_ABOVE},
110
+ };
111
+
112
+ constexpr Uint8ToString LIGHT_FUNCTIONS_BY_UINT[] = {
113
+ {LIGHT_FUNCTION_OFF, "off"},
114
+ {LIGHT_FUNCTION_BELOW, "below"},
115
+ {LIGHT_FUNCTION_ABOVE, "above"},
116
+ };
117
+
118
+ constexpr StringToUint8 OUT_PIN_LEVELS_BY_STR[] = {
119
+ {"low", OUT_PIN_LEVEL_LOW},
120
+ {"high", OUT_PIN_LEVEL_HIGH},
121
+ };
122
+
123
+ constexpr Uint8ToString OUT_PIN_LEVELS_BY_UINT[] = {
124
+ {OUT_PIN_LEVEL_LOW, "low"},
125
+ {OUT_PIN_LEVEL_HIGH, "high"},
126
+ };
127
+
128
+ // Helper functions for lookups
129
+ template<size_t N> uint8_t find_uint8(const StringToUint8 (&arr)[N], const std::string &str) {
130
+ for (const auto &entry : arr) {
131
+ if (str == entry.str)
132
+ return entry.value;
133
+ }
134
+ return 0xFF; // Not found
135
+ }
136
+
137
+ template<size_t N> const char *find_str(const Uint8ToString (&arr)[N], uint8_t value) {
138
+ for (const auto &entry : arr) {
139
+ if (value == entry.value)
140
+ return entry.str;
141
+ }
142
+ return ""; // Not found
143
+ }
18
144
 
19
- LD2410Component::LD2410Component() {}
145
+ // Commands
146
+ static constexpr uint8_t CMD_ENABLE_CONF = 0xFF;
147
+ static constexpr uint8_t CMD_DISABLE_CONF = 0xFE;
148
+ static constexpr uint8_t CMD_ENABLE_ENG = 0x62;
149
+ static constexpr uint8_t CMD_DISABLE_ENG = 0x63;
150
+ static constexpr uint8_t CMD_MAXDIST_DURATION = 0x60;
151
+ static constexpr uint8_t CMD_QUERY = 0x61;
152
+ static constexpr uint8_t CMD_GATE_SENS = 0x64;
153
+ static constexpr uint8_t CMD_QUERY_VERSION = 0xA0;
154
+ static constexpr uint8_t CMD_QUERY_DISTANCE_RESOLUTION = 0xAB;
155
+ static constexpr uint8_t CMD_SET_DISTANCE_RESOLUTION = 0xAA;
156
+ static constexpr uint8_t CMD_QUERY_LIGHT_CONTROL = 0xAE;
157
+ static constexpr uint8_t CMD_SET_LIGHT_CONTROL = 0xAD;
158
+ static constexpr uint8_t CMD_SET_BAUD_RATE = 0xA1;
159
+ static constexpr uint8_t CMD_BT_PASSWORD = 0xA9;
160
+ static constexpr uint8_t CMD_QUERY_MAC_ADDRESS = 0xA5;
161
+ static constexpr uint8_t CMD_RESET = 0xA2;
162
+ static constexpr uint8_t CMD_RESTART = 0xA3;
163
+ static constexpr uint8_t CMD_BLUETOOTH = 0xA4;
164
+ // Commands values
165
+ static constexpr uint8_t CMD_MAX_MOVE_VALUE = 0x00;
166
+ static constexpr uint8_t CMD_MAX_STILL_VALUE = 0x01;
167
+ static constexpr uint8_t CMD_DURATION_VALUE = 0x02;
168
+ // Header & Footer size
169
+ static constexpr uint8_t HEADER_FOOTER_SIZE = 4;
170
+ // Command Header & Footer
171
+ static constexpr uint8_t CMD_FRAME_HEADER[HEADER_FOOTER_SIZE] = {0xFD, 0xFC, 0xFB, 0xFA};
172
+ static constexpr uint8_t CMD_FRAME_FOOTER[HEADER_FOOTER_SIZE] = {0x04, 0x03, 0x02, 0x01};
173
+ // Data Header & Footer
174
+ static constexpr uint8_t DATA_FRAME_HEADER[HEADER_FOOTER_SIZE] = {0xF4, 0xF3, 0xF2, 0xF1};
175
+ static constexpr uint8_t DATA_FRAME_FOOTER[HEADER_FOOTER_SIZE] = {0xF8, 0xF7, 0xF6, 0xF5};
176
+ // MAC address the module uses when Bluetooth is disabled
177
+ static constexpr uint8_t NO_MAC[] = {0x08, 0x05, 0x04, 0x03, 0x02, 0x01};
178
+
179
+ static inline int two_byte_to_int(char firstbyte, char secondbyte) { return (int16_t) (secondbyte << 8) + firstbyte; }
180
+
181
+ static bool validate_header_footer(const uint8_t *header_footer, const uint8_t *buffer) {
182
+ for (uint8_t i = 0; i < HEADER_FOOTER_SIZE; i++) {
183
+ if (header_footer[i] != buffer[i]) {
184
+ return false; // Mismatch in header/footer
185
+ }
186
+ }
187
+ return true; // Valid header/footer
188
+ }
20
189
 
21
190
  void LD2410Component::dump_config() {
22
- ESP_LOGCONFIG(TAG, "LD2410:");
191
+ std::string mac_str =
192
+ mac_address_is_valid(this->mac_address_) ? format_mac_address_pretty(this->mac_address_) : UNKNOWN_MAC;
193
+ std::string version = str_sprintf(VERSION_FMT, this->version_[1], this->version_[0], this->version_[5],
194
+ this->version_[4], this->version_[3], this->version_[2]);
195
+ ESP_LOGCONFIG(TAG,
196
+ "LD2410:\n"
197
+ " Firmware version: %s\n"
198
+ " MAC address: %s\n"
199
+ " Throttle: %u ms",
200
+ version.c_str(), mac_str.c_str(), this->throttle_);
23
201
  #ifdef USE_BINARY_SENSOR
24
- LOG_BINARY_SENSOR(" ", "TargetBinarySensor", this->target_binary_sensor_);
25
- LOG_BINARY_SENSOR(" ", "MovingTargetBinarySensor", this->moving_target_binary_sensor_);
26
- LOG_BINARY_SENSOR(" ", "StillTargetBinarySensor", this->still_target_binary_sensor_);
27
- LOG_BINARY_SENSOR(" ", "OutPinPresenceStatusBinarySensor", this->out_pin_presence_status_binary_sensor_);
28
- #endif
29
- #ifdef USE_SWITCH
30
- LOG_SWITCH(" ", "EngineeringModeSwitch", this->engineering_mode_switch_);
31
- LOG_SWITCH(" ", "BluetoothSwitch", this->bluetooth_switch_);
32
- #endif
33
- #ifdef USE_BUTTON
34
- LOG_BUTTON(" ", "ResetButton", this->reset_button_);
35
- LOG_BUTTON(" ", "RestartButton", this->restart_button_);
36
- LOG_BUTTON(" ", "QueryButton", this->query_button_);
202
+ ESP_LOGCONFIG(TAG, "Binary Sensors:");
203
+ LOG_BINARY_SENSOR(" ", "Target", this->target_binary_sensor_);
204
+ LOG_BINARY_SENSOR(" ", "MovingTarget", this->moving_target_binary_sensor_);
205
+ LOG_BINARY_SENSOR(" ", "StillTarget", this->still_target_binary_sensor_);
206
+ LOG_BINARY_SENSOR(" ", "OutPinPresenceStatus", this->out_pin_presence_status_binary_sensor_);
37
207
  #endif
38
208
  #ifdef USE_SENSOR
39
- LOG_SENSOR(" ", "LightSensor", this->light_sensor_);
40
- LOG_SENSOR(" ", "MovingTargetDistanceSensor", this->moving_target_distance_sensor_);
41
- LOG_SENSOR(" ", "StillTargetDistanceSensor", this->still_target_distance_sensor_);
42
- LOG_SENSOR(" ", "MovingTargetEnergySensor", this->moving_target_energy_sensor_);
43
- LOG_SENSOR(" ", "StillTargetEnergySensor", this->still_target_energy_sensor_);
44
- LOG_SENSOR(" ", "DetectionDistanceSensor", this->detection_distance_sensor_);
45
- for (sensor::Sensor *s : this->gate_still_sensors_) {
46
- LOG_SENSOR(" ", "NthGateStillSesnsor", s);
47
- }
209
+ ESP_LOGCONFIG(TAG, "Sensors:");
210
+ LOG_SENSOR(" ", "Light", this->light_sensor_);
211
+ LOG_SENSOR(" ", "DetectionDistance", this->detection_distance_sensor_);
212
+ LOG_SENSOR(" ", "MovingTargetDistance", this->moving_target_distance_sensor_);
213
+ LOG_SENSOR(" ", "MovingTargetEnergy", this->moving_target_energy_sensor_);
214
+ LOG_SENSOR(" ", "StillTargetDistance", this->still_target_distance_sensor_);
215
+ LOG_SENSOR(" ", "StillTargetEnergy", this->still_target_energy_sensor_);
48
216
  for (sensor::Sensor *s : this->gate_move_sensors_) {
49
- LOG_SENSOR(" ", "NthGateMoveSesnsor", s);
217
+ LOG_SENSOR(" ", "GateMove", s);
218
+ }
219
+ for (sensor::Sensor *s : this->gate_still_sensors_) {
220
+ LOG_SENSOR(" ", "GateStill", s);
50
221
  }
51
222
  #endif
52
223
  #ifdef USE_TEXT_SENSOR
53
- LOG_TEXT_SENSOR(" ", "VersionTextSensor", this->version_text_sensor_);
54
- LOG_TEXT_SENSOR(" ", "MacTextSensor", this->mac_text_sensor_);
55
- #endif
56
- #ifdef USE_SELECT
57
- LOG_SELECT(" ", "LightFunctionSelect", this->light_function_select_);
58
- LOG_SELECT(" ", "OutPinLevelSelect", this->out_pin_level_select_);
59
- LOG_SELECT(" ", "DistanceResolutionSelect", this->distance_resolution_select_);
60
- LOG_SELECT(" ", "BaudRateSelect", this->baud_rate_select_);
224
+ ESP_LOGCONFIG(TAG, "Text Sensors:");
225
+ LOG_TEXT_SENSOR(" ", "Mac", this->mac_text_sensor_);
226
+ LOG_TEXT_SENSOR(" ", "Version", this->version_text_sensor_);
61
227
  #endif
62
228
  #ifdef USE_NUMBER
63
- LOG_NUMBER(" ", "LightThresholdNumber", this->light_threshold_number_);
64
- LOG_NUMBER(" ", "MaxStillDistanceGateNumber", this->max_still_distance_gate_number_);
65
- LOG_NUMBER(" ", "MaxMoveDistanceGateNumber", this->max_move_distance_gate_number_);
66
- LOG_NUMBER(" ", "TimeoutNumber", this->timeout_number_);
67
- for (number::Number *n : this->gate_still_threshold_numbers_) {
68
- LOG_NUMBER(" ", "Still Thresholds Number", n);
69
- }
229
+ ESP_LOGCONFIG(TAG, "Numbers:");
230
+ LOG_NUMBER(" ", "LightThreshold", this->light_threshold_number_);
231
+ LOG_NUMBER(" ", "MaxMoveDistanceGate", this->max_move_distance_gate_number_);
232
+ LOG_NUMBER(" ", "MaxStillDistanceGate", this->max_still_distance_gate_number_);
233
+ LOG_NUMBER(" ", "Timeout", this->timeout_number_);
70
234
  for (number::Number *n : this->gate_move_threshold_numbers_) {
71
- LOG_NUMBER(" ", "Move Thresholds Number", n);
235
+ LOG_NUMBER(" ", "MoveThreshold", n);
236
+ }
237
+ for (number::Number *n : this->gate_still_threshold_numbers_) {
238
+ LOG_NUMBER(" ", "StillThreshold", n);
72
239
  }
73
240
  #endif
74
- this->read_all_info();
75
- ESP_LOGCONFIG(TAG,
76
- " Throttle_ : %ums\n"
77
- " MAC Address : %s\n"
78
- " Firmware Version : %s",
79
- this->throttle_, const_cast<char *>(this->mac_.c_str()), const_cast<char *>(this->version_.c_str()));
241
+ #ifdef USE_SELECT
242
+ ESP_LOGCONFIG(TAG, "Selects:");
243
+ LOG_SELECT(" ", "BaudRate", this->baud_rate_select_);
244
+ LOG_SELECT(" ", "DistanceResolution", this->distance_resolution_select_);
245
+ LOG_SELECT(" ", "LightFunction", this->light_function_select_);
246
+ LOG_SELECT(" ", "OutPinLevel", this->out_pin_level_select_);
247
+ #endif
248
+ #ifdef USE_SWITCH
249
+ ESP_LOGCONFIG(TAG, "Switches:");
250
+ LOG_SWITCH(" ", "Bluetooth", this->bluetooth_switch_);
251
+ LOG_SWITCH(" ", "EngineeringMode", this->engineering_mode_switch_);
252
+ #endif
253
+ #ifdef USE_BUTTON
254
+ ESP_LOGCONFIG(TAG, "Buttons:");
255
+ LOG_BUTTON(" ", "FactoryReset", this->factory_reset_button_);
256
+ LOG_BUTTON(" ", "Query", this->query_button_);
257
+ LOG_BUTTON(" ", "Restart", this->restart_button_);
258
+ #endif
80
259
  }
81
260
 
82
261
  void LD2410Component::setup() {
@@ -89,12 +268,12 @@ void LD2410Component::read_all_info() {
89
268
  this->get_version_();
90
269
  this->get_mac_();
91
270
  this->get_distance_resolution_();
92
- this->get_light_control_();
271
+ this->query_light_control_();
93
272
  this->query_parameters_();
94
273
  this->set_config_mode_(false);
95
274
  #ifdef USE_SELECT
96
275
  const auto baud_rate = std::to_string(this->parent_->get_baud_rate());
97
- if (this->baud_rate_select_ != nullptr && this->baud_rate_select_->state != baud_rate) {
276
+ if (this->baud_rate_select_ != nullptr) {
98
277
  this->baud_rate_select_->publish_state(baud_rate);
99
278
  }
100
279
  #endif
@@ -107,66 +286,59 @@ void LD2410Component::restart_and_read_all_info() {
107
286
  }
108
287
 
109
288
  void LD2410Component::loop() {
110
- const int max_line_length = 80;
111
- static uint8_t buffer[max_line_length];
112
-
113
- while (available()) {
114
- this->readline_(read(), buffer, max_line_length);
289
+ while (this->available()) {
290
+ this->readline_(this->read());
115
291
  }
116
292
  }
117
293
 
118
- void LD2410Component::send_command_(uint8_t command, const uint8_t *command_value, int command_value_len) {
294
+ void LD2410Component::send_command_(uint8_t command, const uint8_t *command_value, uint8_t command_value_len) {
119
295
  ESP_LOGV(TAG, "Sending COMMAND %02X", command);
120
- // frame start bytes
121
- this->write_array(CMD_FRAME_HEADER, 4);
296
+ // frame header bytes
297
+ this->write_array(CMD_FRAME_HEADER, sizeof(CMD_FRAME_HEADER));
122
298
  // length bytes
123
- int len = 2;
124
- if (command_value != nullptr)
299
+ uint8_t len = 2;
300
+ if (command_value != nullptr) {
125
301
  len += command_value_len;
126
- this->write_byte(lowbyte(len));
127
- this->write_byte(highbyte(len));
128
-
129
- // command
130
- this->write_byte(lowbyte(command));
131
- this->write_byte(highbyte(command));
302
+ }
303
+ uint8_t len_cmd[] = {lowbyte(len), highbyte(len), command, 0x00};
304
+ this->write_array(len_cmd, sizeof(len_cmd));
132
305
 
133
306
  // command value bytes
134
307
  if (command_value != nullptr) {
135
- for (int i = 0; i < command_value_len; i++) {
308
+ for (uint8_t i = 0; i < command_value_len; i++) {
136
309
  this->write_byte(command_value[i]);
137
310
  }
138
311
  }
139
- // frame end bytes
140
- this->write_array(CMD_FRAME_END, 4);
312
+ // frame footer bytes
313
+ this->write_array(CMD_FRAME_FOOTER, sizeof(CMD_FRAME_FOOTER));
141
314
  // FIXME to remove
142
315
  delay(50); // NOLINT
143
316
  }
144
317
 
145
- void LD2410Component::handle_periodic_data_(uint8_t *buffer, int len) {
146
- if (len < 12)
147
- return; // 4 frame start bytes + 2 length bytes + 1 data end byte + 1 crc byte + 4 frame end bytes
148
- if (buffer[0] != 0xF4 || buffer[1] != 0xF3 || buffer[2] != 0xF2 || buffer[3] != 0xF1) // check 4 frame start bytes
318
+ void LD2410Component::handle_periodic_data_() {
319
+ // Reduce data update rate to reduce home assistant database growth
320
+ // Check this first to prevent unnecessary processing done in later checks/parsing
321
+ if (App.get_loop_component_start_time() - this->last_periodic_millis_ < this->throttle_) {
149
322
  return;
150
- if (buffer[7] != HEAD || buffer[len - 6] != END || buffer[len - 5] != CHECK) // Check constant values
151
- return; // data head=0xAA, data end=0x55, crc=0x00
152
-
153
- /*
154
- Reduce data update rate to prevent home assistant database size grow fast
155
- */
156
- int32_t current_millis = millis();
157
- if (current_millis - last_periodic_millis_ < this->throttle_)
323
+ }
324
+ // 4 frame header bytes + 2 length bytes + 1 data end byte + 1 crc byte + 4 frame footer bytes
325
+ // data header=0xAA, data footer=0x55, crc=0x00
326
+ if (this->buffer_pos_ < 12 || !ld2410::validate_header_footer(DATA_FRAME_HEADER, this->buffer_data_) ||
327
+ this->buffer_data_[7] != HEADER || this->buffer_data_[this->buffer_pos_ - 6] != FOOTER ||
328
+ this->buffer_data_[this->buffer_pos_ - 5] != CHECK) {
158
329
  return;
159
- last_periodic_millis_ = current_millis;
330
+ }
331
+ // Save the timestamp after validating the frame so, if invalid, we'll take the next frame immediately
332
+ this->last_periodic_millis_ = App.get_loop_component_start_time();
160
333
 
161
334
  /*
162
335
  Data Type: 7th
163
336
  0x01: Engineering mode
164
337
  0x02: Normal mode
165
338
  */
166
- bool engineering_mode = buffer[DATA_TYPES] == 0x01;
339
+ bool engineering_mode = this->buffer_data_[DATA_TYPES] == 0x01;
167
340
  #ifdef USE_SWITCH
168
- if (this->engineering_mode_switch_ != nullptr &&
169
- current_millis - last_engineering_mode_change_millis_ > this->throttle_) {
341
+ if (this->engineering_mode_switch_ != nullptr) {
170
342
  this->engineering_mode_switch_->publish_state(engineering_mode);
171
343
  }
172
344
  #endif
@@ -178,7 +350,7 @@ void LD2410Component::handle_periodic_data_(uint8_t *buffer, int len) {
178
350
  0x02 = Still targets
179
351
  0x03 = Moving+Still targets
180
352
  */
181
- char target_state = buffer[TARGET_STATES];
353
+ char target_state = this->buffer_data_[TARGET_STATES];
182
354
  if (this->target_binary_sensor_ != nullptr) {
183
355
  this->target_binary_sensor_->publish_state(target_state != 0x00);
184
356
  }
@@ -198,27 +370,30 @@ void LD2410Component::handle_periodic_data_(uint8_t *buffer, int len) {
198
370
  */
199
371
  #ifdef USE_SENSOR
200
372
  if (this->moving_target_distance_sensor_ != nullptr) {
201
- int new_moving_target_distance = this->two_byte_to_int_(buffer[MOVING_TARGET_LOW], buffer[MOVING_TARGET_HIGH]);
373
+ int new_moving_target_distance =
374
+ ld2410::two_byte_to_int(this->buffer_data_[MOVING_TARGET_LOW], this->buffer_data_[MOVING_TARGET_HIGH]);
202
375
  if (this->moving_target_distance_sensor_->get_state() != new_moving_target_distance)
203
376
  this->moving_target_distance_sensor_->publish_state(new_moving_target_distance);
204
377
  }
205
378
  if (this->moving_target_energy_sensor_ != nullptr) {
206
- int new_moving_target_energy = buffer[MOVING_ENERGY];
379
+ int new_moving_target_energy = this->buffer_data_[MOVING_ENERGY];
207
380
  if (this->moving_target_energy_sensor_->get_state() != new_moving_target_energy)
208
381
  this->moving_target_energy_sensor_->publish_state(new_moving_target_energy);
209
382
  }
210
383
  if (this->still_target_distance_sensor_ != nullptr) {
211
- int new_still_target_distance = this->two_byte_to_int_(buffer[STILL_TARGET_LOW], buffer[STILL_TARGET_HIGH]);
384
+ int new_still_target_distance =
385
+ ld2410::two_byte_to_int(this->buffer_data_[STILL_TARGET_LOW], this->buffer_data_[STILL_TARGET_HIGH]);
212
386
  if (this->still_target_distance_sensor_->get_state() != new_still_target_distance)
213
387
  this->still_target_distance_sensor_->publish_state(new_still_target_distance);
214
388
  }
215
389
  if (this->still_target_energy_sensor_ != nullptr) {
216
- int new_still_target_energy = buffer[STILL_ENERGY];
390
+ int new_still_target_energy = this->buffer_data_[STILL_ENERGY];
217
391
  if (this->still_target_energy_sensor_->get_state() != new_still_target_energy)
218
392
  this->still_target_energy_sensor_->publish_state(new_still_target_energy);
219
393
  }
220
394
  if (this->detection_distance_sensor_ != nullptr) {
221
- int new_detect_distance = this->two_byte_to_int_(buffer[DETECT_DISTANCE_LOW], buffer[DETECT_DISTANCE_HIGH]);
395
+ int new_detect_distance =
396
+ ld2410::two_byte_to_int(this->buffer_data_[DETECT_DISTANCE_LOW], this->buffer_data_[DETECT_DISTANCE_HIGH]);
222
397
  if (this->detection_distance_sensor_->get_state() != new_detect_distance)
223
398
  this->detection_distance_sensor_->publish_state(new_detect_distance);
224
399
  }
@@ -231,7 +406,7 @@ void LD2410Component::handle_periodic_data_(uint8_t *buffer, int len) {
231
406
  for (std::vector<sensor::Sensor *>::size_type i = 0; i != this->gate_move_sensors_.size(); i++) {
232
407
  sensor::Sensor *s = this->gate_move_sensors_[i];
233
408
  if (s != nullptr) {
234
- s->publish_state(buffer[MOVING_SENSOR_START + i]);
409
+ s->publish_state(this->buffer_data_[MOVING_SENSOR_START + i]);
235
410
  }
236
411
  }
237
412
  /*
@@ -240,16 +415,17 @@ void LD2410Component::handle_periodic_data_(uint8_t *buffer, int len) {
240
415
  for (std::vector<sensor::Sensor *>::size_type i = 0; i != this->gate_still_sensors_.size(); i++) {
241
416
  sensor::Sensor *s = this->gate_still_sensors_[i];
242
417
  if (s != nullptr) {
243
- s->publish_state(buffer[STILL_SENSOR_START + i]);
418
+ s->publish_state(this->buffer_data_[STILL_SENSOR_START + i]);
244
419
  }
245
420
  }
246
421
  /*
247
422
  Light sensor: 38th bytes
248
423
  */
249
424
  if (this->light_sensor_ != nullptr) {
250
- int new_light_sensor = buffer[LIGHT_SENSOR];
251
- if (this->light_sensor_->get_state() != new_light_sensor)
425
+ int new_light_sensor = this->buffer_data_[LIGHT_SENSOR];
426
+ if (this->light_sensor_->get_state() != new_light_sensor) {
252
427
  this->light_sensor_->publish_state(new_light_sensor);
428
+ }
253
429
  }
254
430
  } else {
255
431
  for (auto *s : this->gate_move_sensors_) {
@@ -270,7 +446,7 @@ void LD2410Component::handle_periodic_data_(uint8_t *buffer, int len) {
270
446
  #ifdef USE_BINARY_SENSOR
271
447
  if (engineering_mode) {
272
448
  if (this->out_pin_presence_status_binary_sensor_ != nullptr) {
273
- this->out_pin_presence_status_binary_sensor_->publish_state(buffer[OUT_PIN_SENSOR] == 0x01);
449
+ this->out_pin_presence_status_binary_sensor_->publish_state(this->buffer_data_[OUT_PIN_SENSOR] == 0x01);
274
450
  }
275
451
  } else {
276
452
  if (this->out_pin_presence_status_binary_sensor_ != nullptr) {
@@ -280,163 +456,151 @@ void LD2410Component::handle_periodic_data_(uint8_t *buffer, int len) {
280
456
  #endif
281
457
  }
282
458
 
283
- const char VERSION_FMT[] = "%u.%02X.%02X%02X%02X%02X";
284
-
285
- std::string format_version(uint8_t *buffer) {
286
- std::string::size_type version_size = 256;
287
- std::string version;
288
- do {
289
- version.resize(version_size + 1);
290
- version_size = std::snprintf(&version[0], version.size(), VERSION_FMT, buffer[13], buffer[12], buffer[17],
291
- buffer[16], buffer[15], buffer[14]);
292
- } while (version_size + 1 > version.size());
293
- version.resize(version_size);
294
- return version;
295
- }
296
-
297
- const char MAC_FMT[] = "%02X:%02X:%02X:%02X:%02X:%02X";
298
-
299
- const std::string UNKNOWN_MAC("unknown");
300
- const std::string NO_MAC("08:05:04:03:02:01");
301
-
302
- std::string format_mac(uint8_t *buffer) {
303
- std::string::size_type mac_size = 256;
304
- std::string mac;
305
- do {
306
- mac.resize(mac_size + 1);
307
- mac_size = std::snprintf(&mac[0], mac.size(), MAC_FMT, buffer[10], buffer[11], buffer[12], buffer[13], buffer[14],
308
- buffer[15]);
309
- } while (mac_size + 1 > mac.size());
310
- mac.resize(mac_size);
311
- if (mac == NO_MAC) {
312
- return UNKNOWN_MAC;
313
- }
314
- return mac;
315
- }
316
-
317
459
  #ifdef USE_NUMBER
318
460
  std::function<void(void)> set_number_value(number::Number *n, float value) {
319
- float normalized_value = value * 1.0;
320
- if (n != nullptr && (!n->has_state() || n->state != normalized_value)) {
321
- n->state = normalized_value;
322
- return [n, normalized_value]() { n->publish_state(normalized_value); };
461
+ if (n != nullptr && (!n->has_state() || n->state != value)) {
462
+ n->state = value;
463
+ return [n, value]() { n->publish_state(value); };
323
464
  }
324
465
  return []() {};
325
466
  }
326
467
  #endif
327
468
 
328
- bool LD2410Component::handle_ack_data_(uint8_t *buffer, int len) {
329
- ESP_LOGV(TAG, "Handling ACK DATA for COMMAND %02X", buffer[COMMAND]);
330
- if (len < 10) {
331
- ESP_LOGE(TAG, "Error with last command : incorrect length");
469
+ bool LD2410Component::handle_ack_data_() {
470
+ ESP_LOGV(TAG, "Handling ACK DATA for COMMAND %02X", this->buffer_data_[COMMAND]);
471
+ if (this->buffer_pos_ < 10) {
472
+ ESP_LOGE(TAG, "Invalid length");
332
473
  return true;
333
474
  }
334
- if (buffer[0] != 0xFD || buffer[1] != 0xFC || buffer[2] != 0xFB || buffer[3] != 0xFA) { // check 4 frame start bytes
335
- ESP_LOGE(TAG, "Error with last command : incorrect Header");
475
+ if (!ld2410::validate_header_footer(CMD_FRAME_HEADER, this->buffer_data_)) {
476
+ ESP_LOGW(TAG, "Invalid header: %s", format_hex_pretty(this->buffer_data_, HEADER_FOOTER_SIZE).c_str());
336
477
  return true;
337
478
  }
338
- if (buffer[COMMAND_STATUS] != 0x01) {
339
- ESP_LOGE(TAG, "Error with last command : status != 0x01");
479
+ if (this->buffer_data_[COMMAND_STATUS] != 0x01) {
480
+ ESP_LOGE(TAG, "Invalid status");
340
481
  return true;
341
482
  }
342
- if (this->two_byte_to_int_(buffer[8], buffer[9]) != 0x00) {
343
- ESP_LOGE(TAG, "Error with last command , last buffer was: %u , %u", buffer[8], buffer[9]);
483
+ if (ld2410::two_byte_to_int(this->buffer_data_[8], this->buffer_data_[9]) != 0x00) {
484
+ ESP_LOGW(TAG, "Invalid command: %02X, %02X", this->buffer_data_[8], this->buffer_data_[9]);
344
485
  return true;
345
486
  }
346
487
 
347
- switch (buffer[COMMAND]) {
348
- case lowbyte(CMD_ENABLE_CONF):
349
- ESP_LOGV(TAG, "Handled Enable conf command");
488
+ switch (this->buffer_data_[COMMAND]) {
489
+ case CMD_ENABLE_CONF:
490
+ ESP_LOGV(TAG, "Enable conf");
350
491
  break;
351
- case lowbyte(CMD_DISABLE_CONF):
352
- ESP_LOGV(TAG, "Handled Disabled conf command");
492
+
493
+ case CMD_DISABLE_CONF:
494
+ ESP_LOGV(TAG, "Disabled conf");
353
495
  break;
354
- case lowbyte(CMD_SET_BAUD_RATE):
355
- ESP_LOGV(TAG, "Handled baud rate change command");
496
+
497
+ case CMD_SET_BAUD_RATE:
498
+ ESP_LOGV(TAG, "Baud rate change");
356
499
  #ifdef USE_SELECT
357
500
  if (this->baud_rate_select_ != nullptr) {
358
- ESP_LOGE(TAG, "Change baud rate component config to %s and reinstall", this->baud_rate_select_->state.c_str());
501
+ ESP_LOGE(TAG, "Change baud rate to %s and reinstall", this->baud_rate_select_->state.c_str());
359
502
  }
360
503
  #endif
361
504
  break;
362
- case lowbyte(CMD_VERSION):
363
- this->version_ = format_version(buffer);
364
- ESP_LOGV(TAG, "FW Version is: %s", const_cast<char *>(this->version_.c_str()));
505
+
506
+ case CMD_QUERY_VERSION: {
507
+ std::memcpy(this->version_, &this->buffer_data_[12], sizeof(this->version_));
508
+ std::string version = str_sprintf(VERSION_FMT, this->version_[1], this->version_[0], this->version_[5],
509
+ this->version_[4], this->version_[3], this->version_[2]);
510
+ ESP_LOGV(TAG, "Firmware version: %s", version.c_str());
365
511
  #ifdef USE_TEXT_SENSOR
366
512
  if (this->version_text_sensor_ != nullptr) {
367
- this->version_text_sensor_->publish_state(this->version_);
513
+ this->version_text_sensor_->publish_state(version);
368
514
  }
369
515
  #endif
370
516
  break;
371
- case lowbyte(CMD_QUERY_DISTANCE_RESOLUTION): {
372
- std::string distance_resolution =
373
- DISTANCE_RESOLUTION_INT_TO_ENUM.at(this->two_byte_to_int_(buffer[10], buffer[11]));
374
- ESP_LOGV(TAG, "Distance resolution is: %s", const_cast<char *>(distance_resolution.c_str()));
517
+ }
518
+
519
+ case CMD_QUERY_DISTANCE_RESOLUTION: {
520
+ const auto *distance_resolution = find_str(DISTANCE_RESOLUTIONS_BY_UINT, this->buffer_data_[10]);
521
+ ESP_LOGV(TAG, "Distance resolution: %s", distance_resolution);
375
522
  #ifdef USE_SELECT
376
- if (this->distance_resolution_select_ != nullptr &&
377
- this->distance_resolution_select_->state != distance_resolution) {
523
+ if (this->distance_resolution_select_ != nullptr) {
378
524
  this->distance_resolution_select_->publish_state(distance_resolution);
379
525
  }
380
526
  #endif
381
- } break;
382
- case lowbyte(CMD_QUERY_LIGHT_CONTROL): {
383
- this->light_function_ = LIGHT_FUNCTION_INT_TO_ENUM.at(buffer[10]);
384
- this->light_threshold_ = buffer[11] * 1.0;
385
- this->out_pin_level_ = OUT_PIN_LEVEL_INT_TO_ENUM.at(buffer[12]);
386
- ESP_LOGV(TAG, "Light function is: %s", const_cast<char *>(this->light_function_.c_str()));
387
- ESP_LOGV(TAG, "Light threshold is: %f", this->light_threshold_);
388
- ESP_LOGV(TAG, "Out pin level is: %s", const_cast<char *>(this->out_pin_level_.c_str()));
527
+ break;
528
+ }
529
+
530
+ case CMD_QUERY_LIGHT_CONTROL: {
531
+ this->light_function_ = this->buffer_data_[10];
532
+ this->light_threshold_ = this->buffer_data_[11];
533
+ this->out_pin_level_ = this->buffer_data_[12];
534
+ const auto *light_function_str = find_str(LIGHT_FUNCTIONS_BY_UINT, this->light_function_);
535
+ const auto *out_pin_level_str = find_str(OUT_PIN_LEVELS_BY_UINT, this->out_pin_level_);
536
+ ESP_LOGV(TAG,
537
+ "Light function is: %s\n"
538
+ "Light threshold is: %u\n"
539
+ "Out pin level: %s",
540
+ light_function_str, this->light_threshold_, out_pin_level_str);
389
541
  #ifdef USE_SELECT
390
- if (this->light_function_select_ != nullptr && this->light_function_select_->state != this->light_function_) {
391
- this->light_function_select_->publish_state(this->light_function_);
542
+ if (this->light_function_select_ != nullptr) {
543
+ this->light_function_select_->publish_state(light_function_str);
392
544
  }
393
- if (this->out_pin_level_select_ != nullptr && this->out_pin_level_select_->state != this->out_pin_level_) {
394
- this->out_pin_level_select_->publish_state(this->out_pin_level_);
545
+ if (this->out_pin_level_select_ != nullptr) {
546
+ this->out_pin_level_select_->publish_state(out_pin_level_str);
395
547
  }
396
548
  #endif
397
549
  #ifdef USE_NUMBER
398
- if (this->light_threshold_number_ != nullptr &&
399
- (!this->light_threshold_number_->has_state() ||
400
- this->light_threshold_number_->state != this->light_threshold_)) {
401
- this->light_threshold_number_->publish_state(this->light_threshold_);
550
+ if (this->light_threshold_number_ != nullptr) {
551
+ this->light_threshold_number_->publish_state(static_cast<float>(this->light_threshold_));
402
552
  }
403
553
  #endif
404
- } break;
405
- case lowbyte(CMD_MAC):
406
- if (len < 20) {
554
+ break;
555
+ }
556
+ case CMD_QUERY_MAC_ADDRESS: {
557
+ if (this->buffer_pos_ < 20) {
407
558
  return false;
408
559
  }
409
- this->mac_ = format_mac(buffer);
410
- ESP_LOGV(TAG, "MAC Address is: %s", const_cast<char *>(this->mac_.c_str()));
560
+
561
+ this->bluetooth_on_ = std::memcmp(&this->buffer_data_[10], NO_MAC, sizeof(NO_MAC)) != 0;
562
+ if (this->bluetooth_on_) {
563
+ std::memcpy(this->mac_address_, &this->buffer_data_[10], sizeof(this->mac_address_));
564
+ }
565
+
566
+ std::string mac_str =
567
+ mac_address_is_valid(this->mac_address_) ? format_mac_address_pretty(this->mac_address_) : UNKNOWN_MAC;
568
+ ESP_LOGV(TAG, "MAC address: %s", mac_str.c_str());
411
569
  #ifdef USE_TEXT_SENSOR
412
570
  if (this->mac_text_sensor_ != nullptr) {
413
- this->mac_text_sensor_->publish_state(this->mac_);
571
+ this->mac_text_sensor_->publish_state(mac_str);
414
572
  }
415
573
  #endif
416
574
  #ifdef USE_SWITCH
417
575
  if (this->bluetooth_switch_ != nullptr) {
418
- this->bluetooth_switch_->publish_state(this->mac_ != UNKNOWN_MAC);
576
+ this->bluetooth_switch_->publish_state(this->bluetooth_on_);
419
577
  }
420
578
  #endif
421
579
  break;
422
- case lowbyte(CMD_GATE_SENS):
423
- ESP_LOGV(TAG, "Handled sensitivity command");
580
+ }
581
+
582
+ case CMD_GATE_SENS:
583
+ ESP_LOGV(TAG, "Sensitivity");
424
584
  break;
425
- case lowbyte(CMD_BLUETOOTH):
426
- ESP_LOGV(TAG, "Handled bluetooth command");
585
+
586
+ case CMD_BLUETOOTH:
587
+ ESP_LOGV(TAG, "Bluetooth");
427
588
  break;
428
- case lowbyte(CMD_SET_DISTANCE_RESOLUTION):
429
- ESP_LOGV(TAG, "Handled set distance resolution command");
589
+
590
+ case CMD_SET_DISTANCE_RESOLUTION:
591
+ ESP_LOGV(TAG, "Set distance resolution");
430
592
  break;
431
- case lowbyte(CMD_SET_LIGHT_CONTROL):
432
- ESP_LOGV(TAG, "Handled set light control command");
593
+
594
+ case CMD_SET_LIGHT_CONTROL:
595
+ ESP_LOGV(TAG, "Set light control");
433
596
  break;
434
- case lowbyte(CMD_BT_PASSWORD):
435
- ESP_LOGV(TAG, "Handled set bluetooth password command");
597
+
598
+ case CMD_BT_PASSWORD:
599
+ ESP_LOGV(TAG, "Set bluetooth password");
436
600
  break;
437
- case lowbyte(CMD_QUERY): // Query parameters response
438
- {
439
- if (buffer[10] != 0xAA)
601
+
602
+ case CMD_QUERY: { // Query parameters response
603
+ if (this->buffer_data_[10] != 0xAA)
440
604
  return true; // value head=0xAA
441
605
  #ifdef USE_NUMBER
442
606
  /*
@@ -444,29 +608,31 @@ bool LD2410Component::handle_ack_data_(uint8_t *buffer, int len) {
444
608
  Still distance range: 14th byte
445
609
  */
446
610
  std::vector<std::function<void(void)>> updates;
447
- updates.push_back(set_number_value(this->max_move_distance_gate_number_, buffer[12]));
448
- updates.push_back(set_number_value(this->max_still_distance_gate_number_, buffer[13]));
611
+ updates.push_back(set_number_value(this->max_move_distance_gate_number_, this->buffer_data_[12]));
612
+ updates.push_back(set_number_value(this->max_still_distance_gate_number_, this->buffer_data_[13]));
449
613
  /*
450
614
  Moving Sensitivities: 15~23th bytes
451
615
  */
452
616
  for (std::vector<number::Number *>::size_type i = 0; i != this->gate_move_threshold_numbers_.size(); i++) {
453
- updates.push_back(set_number_value(this->gate_move_threshold_numbers_[i], buffer[14 + i]));
617
+ updates.push_back(set_number_value(this->gate_move_threshold_numbers_[i], this->buffer_data_[14 + i]));
454
618
  }
455
619
  /*
456
620
  Still Sensitivities: 24~32th bytes
457
621
  */
458
622
  for (std::vector<number::Number *>::size_type i = 0; i != this->gate_still_threshold_numbers_.size(); i++) {
459
- updates.push_back(set_number_value(this->gate_still_threshold_numbers_[i], buffer[23 + i]));
623
+ updates.push_back(set_number_value(this->gate_still_threshold_numbers_[i], this->buffer_data_[23 + i]));
460
624
  }
461
625
  /*
462
626
  None Duration: 33~34th bytes
463
627
  */
464
- updates.push_back(set_number_value(this->timeout_number_, this->two_byte_to_int_(buffer[32], buffer[33])));
628
+ updates.push_back(set_number_value(this->timeout_number_,
629
+ ld2410::two_byte_to_int(this->buffer_data_[32], this->buffer_data_[33])));
465
630
  for (auto &update : updates) {
466
631
  update();
467
632
  }
468
633
  #endif
469
- } break;
634
+ break;
635
+ }
470
636
  default:
471
637
  break;
472
638
  }
@@ -474,78 +640,84 @@ bool LD2410Component::handle_ack_data_(uint8_t *buffer, int len) {
474
640
  return true;
475
641
  }
476
642
 
477
- void LD2410Component::readline_(int readch, uint8_t *buffer, int len) {
478
- static int pos = 0;
643
+ void LD2410Component::readline_(int readch) {
644
+ if (readch < 0) {
645
+ return; // No data available
646
+ }
479
647
 
480
- if (readch >= 0) {
481
- if (pos < len - 1) {
482
- buffer[pos++] = readch;
483
- buffer[pos] = 0;
648
+ if (this->buffer_pos_ < MAX_LINE_LENGTH - 1) {
649
+ this->buffer_data_[this->buffer_pos_++] = readch;
650
+ this->buffer_data_[this->buffer_pos_] = 0;
651
+ } else {
652
+ // We should never get here, but just in case...
653
+ ESP_LOGW(TAG, "Max command length exceeded; ignoring");
654
+ this->buffer_pos_ = 0;
655
+ }
656
+ if (this->buffer_pos_ < 4) {
657
+ return; // Not enough data to process yet
658
+ }
659
+ if (this->buffer_data_[this->buffer_pos_ - 4] == DATA_FRAME_FOOTER[0] &&
660
+ this->buffer_data_[this->buffer_pos_ - 3] == DATA_FRAME_FOOTER[1] &&
661
+ this->buffer_data_[this->buffer_pos_ - 2] == DATA_FRAME_FOOTER[2] &&
662
+ this->buffer_data_[this->buffer_pos_ - 1] == DATA_FRAME_FOOTER[3]) {
663
+ ESP_LOGV(TAG, "Handling Periodic Data: %s", format_hex_pretty(this->buffer_data_, this->buffer_pos_).c_str());
664
+ this->handle_periodic_data_();
665
+ this->buffer_pos_ = 0; // Reset position index for next message
666
+ } else if (this->buffer_data_[this->buffer_pos_ - 4] == CMD_FRAME_FOOTER[0] &&
667
+ this->buffer_data_[this->buffer_pos_ - 3] == CMD_FRAME_FOOTER[1] &&
668
+ this->buffer_data_[this->buffer_pos_ - 2] == CMD_FRAME_FOOTER[2] &&
669
+ this->buffer_data_[this->buffer_pos_ - 1] == CMD_FRAME_FOOTER[3]) {
670
+ ESP_LOGV(TAG, "Handling Ack Data: %s", format_hex_pretty(this->buffer_data_, this->buffer_pos_).c_str());
671
+ if (this->handle_ack_data_()) {
672
+ this->buffer_pos_ = 0; // Reset position index for next message
484
673
  } else {
485
- pos = 0;
486
- }
487
- if (pos >= 4) {
488
- if (buffer[pos - 4] == 0xF8 && buffer[pos - 3] == 0xF7 && buffer[pos - 2] == 0xF6 && buffer[pos - 1] == 0xF5) {
489
- ESP_LOGV(TAG, "Will handle Periodic Data");
490
- this->handle_periodic_data_(buffer, pos);
491
- pos = 0; // Reset position index ready for next time
492
- } else if (buffer[pos - 4] == 0x04 && buffer[pos - 3] == 0x03 && buffer[pos - 2] == 0x02 &&
493
- buffer[pos - 1] == 0x01) {
494
- ESP_LOGV(TAG, "Will handle ACK Data");
495
- if (this->handle_ack_data_(buffer, pos)) {
496
- pos = 0; // Reset position index ready for next time
497
- } else {
498
- ESP_LOGV(TAG, "ACK Data incomplete");
499
- }
500
- }
674
+ ESP_LOGV(TAG, "Ack Data incomplete");
501
675
  }
502
676
  }
503
677
  }
504
678
 
505
679
  void LD2410Component::set_config_mode_(bool enable) {
506
- uint8_t cmd = enable ? CMD_ENABLE_CONF : CMD_DISABLE_CONF;
507
- uint8_t cmd_value[2] = {0x01, 0x00};
508
- this->send_command_(cmd, enable ? cmd_value : nullptr, 2);
680
+ const uint8_t cmd = enable ? CMD_ENABLE_CONF : CMD_DISABLE_CONF;
681
+ const uint8_t cmd_value[2] = {0x01, 0x00};
682
+ this->send_command_(cmd, enable ? cmd_value : nullptr, sizeof(cmd_value));
509
683
  }
510
684
 
511
685
  void LD2410Component::set_bluetooth(bool enable) {
512
686
  this->set_config_mode_(true);
513
- uint8_t enable_cmd_value[2] = {0x01, 0x00};
514
- uint8_t disable_cmd_value[2] = {0x00, 0x00};
515
- this->send_command_(CMD_BLUETOOTH, enable ? enable_cmd_value : disable_cmd_value, 2);
687
+ const uint8_t cmd_value[2] = {enable ? (uint8_t) 0x01 : (uint8_t) 0x00, 0x00};
688
+ this->send_command_(CMD_BLUETOOTH, cmd_value, sizeof(cmd_value));
516
689
  this->set_timeout(200, [this]() { this->restart_and_read_all_info(); });
517
690
  }
518
691
 
519
692
  void LD2410Component::set_distance_resolution(const std::string &state) {
520
693
  this->set_config_mode_(true);
521
- uint8_t cmd_value[2] = {DISTANCE_RESOLUTION_ENUM_TO_INT.at(state), 0x00};
522
- this->send_command_(CMD_SET_DISTANCE_RESOLUTION, cmd_value, 2);
694
+ const uint8_t cmd_value[2] = {find_uint8(DISTANCE_RESOLUTIONS_BY_STR, state), 0x00};
695
+ this->send_command_(CMD_SET_DISTANCE_RESOLUTION, cmd_value, sizeof(cmd_value));
523
696
  this->set_timeout(200, [this]() { this->restart_and_read_all_info(); });
524
697
  }
525
698
 
526
699
  void LD2410Component::set_baud_rate(const std::string &state) {
527
700
  this->set_config_mode_(true);
528
- uint8_t cmd_value[2] = {BAUD_RATE_ENUM_TO_INT.at(state), 0x00};
529
- this->send_command_(CMD_SET_BAUD_RATE, cmd_value, 2);
701
+ const uint8_t cmd_value[2] = {find_uint8(BAUD_RATES_BY_STR, state), 0x00};
702
+ this->send_command_(CMD_SET_BAUD_RATE, cmd_value, sizeof(cmd_value));
530
703
  this->set_timeout(200, [this]() { this->restart_(); });
531
704
  }
532
705
 
533
706
  void LD2410Component::set_bluetooth_password(const std::string &password) {
534
707
  if (password.length() != 6) {
535
- ESP_LOGE(TAG, "set_bluetooth_password(): invalid password length, must be exactly 6 chars '%s'", password.c_str());
708
+ ESP_LOGE(TAG, "Password must be exactly 6 chars");
536
709
  return;
537
710
  }
538
711
  this->set_config_mode_(true);
539
712
  uint8_t cmd_value[6];
540
713
  std::copy(password.begin(), password.end(), std::begin(cmd_value));
541
- this->send_command_(CMD_BT_PASSWORD, cmd_value, 6);
714
+ this->send_command_(CMD_BT_PASSWORD, cmd_value, sizeof(cmd_value));
542
715
  this->set_config_mode_(false);
543
716
  }
544
717
 
545
718
  void LD2410Component::set_engineering_mode(bool enable) {
719
+ const uint8_t cmd = enable ? CMD_ENABLE_ENG : CMD_DISABLE_ENG;
546
720
  this->set_config_mode_(true);
547
- last_engineering_mode_change_millis_ = millis();
548
- uint8_t cmd = enable ? CMD_ENABLE_ENG : CMD_DISABLE_ENG;
549
721
  this->send_command_(cmd, nullptr, 0);
550
722
  this->set_config_mode_(false);
551
723
  }
@@ -559,14 +731,17 @@ void LD2410Component::factory_reset() {
559
731
  void LD2410Component::restart_() { this->send_command_(CMD_RESTART, nullptr, 0); }
560
732
 
561
733
  void LD2410Component::query_parameters_() { this->send_command_(CMD_QUERY, nullptr, 0); }
562
- void LD2410Component::get_version_() { this->send_command_(CMD_VERSION, nullptr, 0); }
734
+
735
+ void LD2410Component::get_version_() { this->send_command_(CMD_QUERY_VERSION, nullptr, 0); }
736
+
563
737
  void LD2410Component::get_mac_() {
564
- uint8_t cmd_value[2] = {0x01, 0x00};
565
- this->send_command_(CMD_MAC, cmd_value, 2);
738
+ const uint8_t cmd_value[2] = {0x01, 0x00};
739
+ this->send_command_(CMD_QUERY_MAC_ADDRESS, cmd_value, sizeof(cmd_value));
566
740
  }
741
+
567
742
  void LD2410Component::get_distance_resolution_() { this->send_command_(CMD_QUERY_DISTANCE_RESOLUTION, nullptr, 0); }
568
743
 
569
- void LD2410Component::get_light_control_() { this->send_command_(CMD_QUERY_LIGHT_CONTROL, nullptr, 0); }
744
+ void LD2410Component::query_light_control_() { this->send_command_(CMD_QUERY_LIGHT_CONTROL, nullptr, 0); }
570
745
 
571
746
  #ifdef USE_NUMBER
572
747
  void LD2410Component::set_max_distances_timeout() {
@@ -596,7 +771,7 @@ void LD2410Component::set_max_distances_timeout() {
596
771
  0x00,
597
772
  0x00};
598
773
  this->set_config_mode_(true);
599
- this->send_command_(CMD_MAXDIST_DURATION, value, 18);
774
+ this->send_command_(CMD_MAXDIST_DURATION, value, sizeof(value));
600
775
  delay(50); // NOLINT
601
776
  this->query_parameters_();
602
777
  this->set_timeout(200, [this]() { this->restart_and_read_all_info(); });
@@ -626,17 +801,17 @@ void LD2410Component::set_gate_threshold(uint8_t gate) {
626
801
  uint8_t value[18] = {0x00, 0x00, lowbyte(gate), highbyte(gate), 0x00, 0x00,
627
802
  0x01, 0x00, lowbyte(motion), highbyte(motion), 0x00, 0x00,
628
803
  0x02, 0x00, lowbyte(still), highbyte(still), 0x00, 0x00};
629
- this->send_command_(CMD_GATE_SENS, value, 18);
804
+ this->send_command_(CMD_GATE_SENS, value, sizeof(value));
630
805
  delay(50); // NOLINT
631
806
  this->query_parameters_();
632
807
  this->set_config_mode_(false);
633
808
  }
634
809
 
635
- void LD2410Component::set_gate_still_threshold_number(int gate, number::Number *n) {
810
+ void LD2410Component::set_gate_still_threshold_number(uint8_t gate, number::Number *n) {
636
811
  this->gate_still_threshold_numbers_[gate] = n;
637
812
  }
638
813
 
639
- void LD2410Component::set_gate_move_threshold_number(int gate, number::Number *n) {
814
+ void LD2410Component::set_gate_move_threshold_number(uint8_t gate, number::Number *n) {
640
815
  this->gate_move_threshold_numbers_[gate] = n;
641
816
  }
642
817
  #endif
@@ -644,35 +819,29 @@ void LD2410Component::set_gate_move_threshold_number(int gate, number::Number *n
644
819
  void LD2410Component::set_light_out_control() {
645
820
  #ifdef USE_NUMBER
646
821
  if (this->light_threshold_number_ != nullptr && this->light_threshold_number_->has_state()) {
647
- this->light_threshold_ = this->light_threshold_number_->state;
822
+ this->light_threshold_ = static_cast<uint8_t>(this->light_threshold_number_->state);
648
823
  }
649
824
  #endif
650
825
  #ifdef USE_SELECT
651
826
  if (this->light_function_select_ != nullptr && this->light_function_select_->has_state()) {
652
- this->light_function_ = this->light_function_select_->state;
827
+ this->light_function_ = find_uint8(LIGHT_FUNCTIONS_BY_STR, this->light_function_select_->state);
653
828
  }
654
829
  if (this->out_pin_level_select_ != nullptr && this->out_pin_level_select_->has_state()) {
655
- this->out_pin_level_ = this->out_pin_level_select_->state;
830
+ this->out_pin_level_ = find_uint8(OUT_PIN_LEVELS_BY_STR, this->out_pin_level_select_->state);
656
831
  }
657
832
  #endif
658
- if (this->light_function_.empty() || this->out_pin_level_.empty() || this->light_threshold_ < 0) {
659
- return;
660
- }
661
833
  this->set_config_mode_(true);
662
- uint8_t light_function = LIGHT_FUNCTION_ENUM_TO_INT.at(this->light_function_);
663
- uint8_t light_threshold = static_cast<uint8_t>(this->light_threshold_);
664
- uint8_t out_pin_level = OUT_PIN_LEVEL_ENUM_TO_INT.at(this->out_pin_level_);
665
- uint8_t value[4] = {light_function, light_threshold, out_pin_level, 0x00};
666
- this->send_command_(CMD_SET_LIGHT_CONTROL, value, 4);
834
+ uint8_t value[4] = {this->light_function_, this->light_threshold_, this->out_pin_level_, 0x00};
835
+ this->send_command_(CMD_SET_LIGHT_CONTROL, value, sizeof(value));
667
836
  delay(50); // NOLINT
668
- this->get_light_control_();
837
+ this->query_light_control_();
669
838
  this->set_timeout(200, [this]() { this->restart_and_read_all_info(); });
670
839
  this->set_config_mode_(false);
671
840
  }
672
841
 
673
842
  #ifdef USE_SENSOR
674
- void LD2410Component::set_gate_move_sensor(int gate, sensor::Sensor *s) { this->gate_move_sensors_[gate] = s; }
675
- void LD2410Component::set_gate_still_sensor(int gate, sensor::Sensor *s) { this->gate_still_sensors_[gate] = s; }
843
+ void LD2410Component::set_gate_move_sensor(uint8_t gate, sensor::Sensor *s) { this->gate_move_sensors_[gate] = s; }
844
+ void LD2410Component::set_gate_still_sensor(uint8_t gate, sensor::Sensor *s) { this->gate_still_sensors_[gate] = s; }
676
845
  #endif
677
846
 
678
847
  } // namespace ld2410