I on the latest ESPHome v2024.4.2 with LD2410C pair with lolin_s2_mini. Possible to set a fixed “move_threshold” & “still_threshold” in yaml file as I already know the effective value? last year ESPHome still can set this fixed value in yaml file, but latest ESPHome required user to be set at HA interface.
There is a disadvantage to set this gate threshold value on HA interface, once your ESP board die & you configure a new board to use the existing setting, all the gate threshold value will be gone & need to set again
old config:
ld2410:
timeout: 5s
id: uart_1
max_move_distance : 1.5m
max_still_distance: 0.75m
g0_move_threshold: 100
g0_still_threshold: 100
g1_move_threshold: 100
g1_still_threshold: 100
g2_move_threshold: 20
g2_still_threshold: 40
g3_move_threshold: 20
g3_still_threshold: 40
new config:
number:
- platform: ld2410
timeout:
name: timeout
max_move_distance_gate:
name: max move distance gate
max_still_distance_gate:
name: max still distance gate
g0:
move_threshold:
name: g0 move threshold
still_threshold:
name: g0 still threshold
g1:
move_threshold:
name: g1 move threshold
still_threshold:
name: g1 still threshold
g2:
move_threshold:
name: g2 move threshold
still_threshold:
name: g2 still threshold
g3:
move_threshold:
name: g3 move threshold
still_threshold:
name: g3 still threshold
You should be able to set the number in the ESPHome configuration. Give “max move distance gate” and “max still distance gate” some ids and use the number.set action (or a lambda) to set the number in the on_boot: section.
esphome:
# ...
on_boot:
priority: 600
# ...
then:
- number.set: max_move_distance_gate
value: 5
- number.set: max_still_distance_gate
value: 7
number:
- platform: ld2410
timeout:
max_move_distance_gate:
name: max move distance gate
id: max_move_distance_gate
max_still_distance_gate:
name: max still distance gate
id: max_still_distance_gate
And if you don’t want the number to show up in HA, you can just remove the name:
I haven’t tested this though.
PS. I find it easier to just use the HLKRadarTool app and bluetooth to set up the ld2410c and skip the number section in the ESPHome config altogether.
Thank for the reply, I already have some code on lambda as below
esphome:
#....
on_boot:
priority: 900
then:
lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
globals:
- id: cpu_speed
type: int
restore_value: no
initial_value: '0'
how to I add that fixed value inside? I really poor in this programing.
I put the code below
on_boot:
priority: 900
then:
lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
max_move_distance_gate = 3;
max_still_distance_gate = 3;
globals:
- id: cpu_speed
type: int
restore_value: no
initial_value: '0'
but when compile, it come out below error
/config/esphome/common25w-1d9b-ld2410c-esp32.yaml: In lambda function:
/config/esphome/common25w-1d9b-ld2410c-esp32.yaml:15:32: error: invalid conversion from 'int' to 'esphome::ld2410::MaxDistanceTimeoutNumber*' [-fpermissive]
max_move_distance_gate = 3;
^
/config/esphome/common25w-1d9b-ld2410c-esp32.yaml:16:33: error: invalid conversion from 'int' to 'esphome::ld2410::MaxDistanceTimeoutNumber*' [-fpermissive]
max_still_distance_gate = 3;
^
*** [.pioenvs/common25w-1d9b-ld2410c-esp32/src/main.cpp.o] Error 1
I modify the code abit then come out different error
on_boot:
priority: 900
then:
lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
"max_move_distance_gate" = 3;
"max_still_distance_gate" = 3;
globals:
- id: cpu_speed
type: int
restore_value: no
initial_value: '0'
different error come out
/config/esphome/common25w-1d9b-ld2410c-esp32.yaml: In lambda function:
/config/esphome/common25w-1d9b-ld2410c-esp32.yaml:15:34: error: assignment of read-only location '"max_move_distance_gate"'
"max_move_distance_gate" = 3;
^
/config/esphome/common25w-1d9b-ld2410c-esp32.yaml:16:35: error: assignment of read-only location '"max_still_distance_gate"'
"max_still_distance_gate" = 3;
^
Compiling .pioenvs/common25w-1d9b-ld2410c-esp32/libcce/WiFi/WiFiSTA.cpp.o
*** [.pioenvs/common25w-1d9b-ld2410c-esp32/src/main.cpp.o] Error 1
You need to make sure you’ve given the Number an id, as shown in my previous post. Then you can do it like this:
on_boot:
priority: 900
then:
lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
auto call = id(max_move_distance_gate).make_call();
call.set_value(3);
call.perform();
auto call = id(max_still_distance_gate).make_call();
call.set_value(3);
call.perform();
or like this:
on_boot:
priority: 900
then:
- lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
- number.set: max_move_distance_gate
value: 3
- number.set: max_still_distance_gate
value: 3
I would lower the on_boot priority to 600 though.
on_boot:
priority: 900
then:
lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
auto call = id(max_move_distance_gate).make_call();
call.set_value(3);
call.perform();
auto call = id(max_still_distance_gate).make_call();
call.set_value(3);
call.perform();
above code generate error when compile but ok on validate
/config/esphome/common25w-1d9b-ld2410c-esp32.yaml: In lambda function:
/config/esphome/common25w-1d9b-ld2410c-esp32.yaml:18:12: error: conflicting declaration 'auto call'
auto call = id(max_still_distance_gate).make_call();
^~~~
/config/esphome/common25w-1d9b-ld2410c-esp32.yaml:15:12: note: previous declaration as 'esphome::number::NumberCall call'
auto call = id(max_move_distance_gate).make_call();
^~~~
*** [.pioenvs/common25w-1d9b-ld2410c-esp32/src/main.cpp.o] Error 1
while below code also generate error code on validate,
on_boot:
priority: 900
then:
- lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
- number.set: max_move_distance_gate
value: 3
- number.set: max_still_distance_gate
value: 3
on_boot:
priority: 900
then:
- lambda: id(cpu_speed) = ESP.getCpuFreqMHz();
Cannot have two actions in one item. Key 'number.set' overrides 'value'! Did you forget to indent the block inside the number.set?.
- number.set: max_move_distance_gate
value: 3
Cannot have two actions in one item. Key 'number.set' overrides 'value'! Did you forget to indent the block inside the number.set?.
- number.set: max_still_distance_gate
value: 3
That’s the problem when I’m not at my computer and can’t test it. In the first one, it looks like you can’t reuse a variable. With the second, I think it’s just a matter of indentation.
on_boot:
priority: 900
then:
lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
auto call1 = id(max_move_distance_gate).make_call();
call1.set_value(3);
call1.perform();
auto call2 = id(max_still_distance_gate).make_call();
call2.set_value(3);
call2.perform();
on_boot:
priority: 900
then:
- lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
- number.set:
id: max_move_distance_gate
value: 3
- number.set:
id: max_still_distance_gate
value: 3
I try the 2nd code below
on_boot:
priority: 900
then:
- lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
- number.set:
id: max_move_distance_gate
value: 3
- number.set:
id: max_still_distance_gate
value: 3
above code can compile without error but somehow the set value not effective, I still can set the value on HA interface(let said i set it to 5) then try restart the ESP, value 5 will remain there, it didnt follow the value in yaml which is value 3
I trying 1st code as well, compile without error but
on_boot:
priority: 900
then:
lambda: |-
id(cpu_speed) = ESP.getCpuFreqMHz();
auto call1 = id(max_move_distance_gate).make_call();
call1.set_value(3);
call1.perform();
auto call2 = id(max_still_distance_gate).make_call();
call2.set_value(3);
call2.perform();
seem like same problem as 2nd code, after restart ESP, ESP didn’t follow the set value in yaml but follow the value set in HA.
Hmm. You could try to either remove the name: and only have the id: (or set internal: true), so the Number component won’t get exposed to HA. I don’t know if this would work, as I can’t test it at the moment.
number:
- platform: ld2410
timeout:
name: timeout
max_move_distance_gate:
id: max_move_distance_gate
max_still_distance_gate:
id: max_still_distance_gate
If that doesn’t work either, then I would suggest to drop the number and just use the HLKRadarTool app.
Also, unless you have a good reason to use priority 900 in on_boot, you should probably lower it.
1 Like