Update human-sensor-2a-beta-github.yaml
- Show target angle display, orientation and position status display. (It got the idea and key code from walberjunior.) - Added a Zone global switch that can be turned off when the Zone feature is not needed. This may reduce the number of zone triggers if there are too many people. - Adjusts the icons for target X and Y. -
This commit is contained in:
parent
a78e9b8050
commit
4f6a13ee3d
|
|
@ -144,7 +144,30 @@ text_sensor:
|
||||||
lambda: |-
|
lambda: |-
|
||||||
return {"Any Presence Config" };
|
return {"Any Presence Config" };
|
||||||
update_interval: 1000s
|
update_interval: 1000s
|
||||||
|
- platform: template
|
||||||
|
name: "Target1 Direction"
|
||||||
|
id: target1_direction
|
||||||
|
icon: mdi:directions
|
||||||
|
- platform: template
|
||||||
|
name: "Target2 Direction"
|
||||||
|
id: target2_direction
|
||||||
|
icon: mdi:directions
|
||||||
|
- platform: template
|
||||||
|
name: "Target3 Direction"
|
||||||
|
id: target3_direction
|
||||||
|
icon: mdi:directions
|
||||||
|
- platform: template
|
||||||
|
name: "Target1 Position"
|
||||||
|
id: target1_position
|
||||||
|
icon: mdi:directions
|
||||||
|
- platform: template
|
||||||
|
name: "Target2 Position"
|
||||||
|
id: target2_position
|
||||||
|
icon: mdi:directions
|
||||||
|
- platform: template
|
||||||
|
name: "Target3 Position"
|
||||||
|
id: target3_position
|
||||||
|
icon: mdi:directions
|
||||||
|
|
||||||
number:
|
number:
|
||||||
- platform: template
|
- platform: template
|
||||||
|
|
@ -493,7 +516,7 @@ binary_sensor:
|
||||||
device_class: occupancy
|
device_class: occupancy
|
||||||
filters:
|
filters:
|
||||||
- delayed_off: !lambda |-
|
- delayed_off: !lambda |-
|
||||||
if (!id(init_zone_publish)) {
|
if (!id(init_zone_publish) || !id(zone_fn_enable).state) {
|
||||||
return 0;
|
return 0;
|
||||||
};
|
};
|
||||||
return id(any_presence_timeout).state * 1000.0;
|
return id(any_presence_timeout).state * 1000.0;
|
||||||
|
|
@ -503,7 +526,7 @@ binary_sensor:
|
||||||
device_class: occupancy
|
device_class: occupancy
|
||||||
filters:
|
filters:
|
||||||
- delayed_off: !lambda |-
|
- delayed_off: !lambda |-
|
||||||
if (!id(init_zone_publish)) {
|
if (!id(init_zone_publish) || !id(zone_fn_enable).state) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return id(zone1_x_timeout).state * 1000.0;
|
return id(zone1_x_timeout).state * 1000.0;
|
||||||
|
|
@ -513,7 +536,7 @@ binary_sensor:
|
||||||
device_class: occupancy
|
device_class: occupancy
|
||||||
filters:
|
filters:
|
||||||
- delayed_off: !lambda |-
|
- delayed_off: !lambda |-
|
||||||
if (!id(init_zone_publish)) {
|
if (!id(init_zone_publish) || !id(zone_fn_enable).state) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return id(zone2_x_timeout).state * 1000.0;
|
return id(zone2_x_timeout).state * 1000.0;
|
||||||
|
|
@ -523,7 +546,7 @@ binary_sensor:
|
||||||
device_class: occupancy
|
device_class: occupancy
|
||||||
filters:
|
filters:
|
||||||
- delayed_off: !lambda |-
|
- delayed_off: !lambda |-
|
||||||
if (!id(init_zone_publish)) {
|
if (!id(init_zone_publish) || !id(zone_fn_enable).state) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return id(zone3_x_timeout).state * 1000.0;
|
return id(zone3_x_timeout).state * 1000.0;
|
||||||
|
|
@ -718,6 +741,7 @@ sensor:
|
||||||
accuracy_decimals: 0
|
accuracy_decimals: 0
|
||||||
unit_of_measurement: 'mm'
|
unit_of_measurement: 'mm'
|
||||||
state_class: measurement
|
state_class: measurement
|
||||||
|
icon: mdi:focus-field-horizontal
|
||||||
device_class: distance
|
device_class: distance
|
||||||
- platform: template
|
- platform: template
|
||||||
name: "Target1 Y"
|
name: "Target1 Y"
|
||||||
|
|
@ -726,6 +750,7 @@ sensor:
|
||||||
unit_of_measurement: 'mm'
|
unit_of_measurement: 'mm'
|
||||||
state_class: measurement
|
state_class: measurement
|
||||||
device_class: distance
|
device_class: distance
|
||||||
|
icon: mdi:focus-field-vertical
|
||||||
- platform: template
|
- platform: template
|
||||||
name: "Target1 Speed"
|
name: "Target1 Speed"
|
||||||
id: target1_speed
|
id: target1_speed
|
||||||
|
|
@ -749,6 +774,7 @@ sensor:
|
||||||
unit_of_measurement: 'mm'
|
unit_of_measurement: 'mm'
|
||||||
state_class: measurement
|
state_class: measurement
|
||||||
device_class: distance
|
device_class: distance
|
||||||
|
icon: mdi:focus-field-horizontal
|
||||||
- platform: template
|
- platform: template
|
||||||
name: "Target2 Y"
|
name: "Target2 Y"
|
||||||
id: target2_y
|
id: target2_y
|
||||||
|
|
@ -756,6 +782,7 @@ sensor:
|
||||||
unit_of_measurement: 'mm'
|
unit_of_measurement: 'mm'
|
||||||
state_class: measurement
|
state_class: measurement
|
||||||
device_class: distance
|
device_class: distance
|
||||||
|
icon: mdi:focus-field-vertical
|
||||||
- platform: template
|
- platform: template
|
||||||
name: "Target2 Speed"
|
name: "Target2 Speed"
|
||||||
id: target2_speed
|
id: target2_speed
|
||||||
|
|
@ -779,6 +806,7 @@ sensor:
|
||||||
unit_of_measurement: 'mm'
|
unit_of_measurement: 'mm'
|
||||||
state_class: measurement
|
state_class: measurement
|
||||||
device_class: distance
|
device_class: distance
|
||||||
|
icon: mdi:focus-field-horizontal
|
||||||
- platform: template
|
- platform: template
|
||||||
name: "Target3 Y"
|
name: "Target3 Y"
|
||||||
id: target3_y
|
id: target3_y
|
||||||
|
|
@ -786,6 +814,7 @@ sensor:
|
||||||
unit_of_measurement: 'mm'
|
unit_of_measurement: 'mm'
|
||||||
state_class: measurement
|
state_class: measurement
|
||||||
device_class: distance
|
device_class: distance
|
||||||
|
icon: mdi:focus-field-vertical
|
||||||
- platform: template
|
- platform: template
|
||||||
name: "Target3 Speed"
|
name: "Target3 Speed"
|
||||||
id: target3_speed
|
id: target3_speed
|
||||||
|
|
@ -800,7 +829,24 @@ sensor:
|
||||||
unit_of_measurement: 'mm'
|
unit_of_measurement: 'mm'
|
||||||
state_class: measurement
|
state_class: measurement
|
||||||
device_class: distance
|
device_class: distance
|
||||||
|
- platform: template
|
||||||
|
name: "Target1 Angle"
|
||||||
|
id: target1_angle
|
||||||
|
unit_of_measurement: 'º'
|
||||||
|
accuracy_decimals: 1
|
||||||
|
icon: mdi:angle-acute
|
||||||
|
- platform: template
|
||||||
|
name: "Target2 Angle"
|
||||||
|
id: target2_angle
|
||||||
|
accuracy_decimals: 1
|
||||||
|
unit_of_measurement: 'º'
|
||||||
|
icon: mdi:angle-acute
|
||||||
|
- platform: template
|
||||||
|
name: "Target3 Angle"
|
||||||
|
id: target3_angle
|
||||||
|
accuracy_decimals: 1
|
||||||
|
unit_of_measurement: 'º'
|
||||||
|
icon: mdi:angle-acute
|
||||||
|
|
||||||
light:
|
light:
|
||||||
- platform: status_led
|
- platform: status_led
|
||||||
|
|
@ -823,7 +869,6 @@ output:
|
||||||
id: board_info_ed
|
id: board_info_ed
|
||||||
pin: GPIO12
|
pin: GPIO12
|
||||||
|
|
||||||
|
|
||||||
switch:
|
switch:
|
||||||
- platform: factory_reset
|
- platform: factory_reset
|
||||||
name: Factory Reset
|
name: Factory Reset
|
||||||
|
|
@ -837,6 +882,13 @@ switch:
|
||||||
icon: mdi:account-cancel
|
icon: mdi:account-cancel
|
||||||
entity_category: config
|
entity_category: config
|
||||||
restore_mode: RESTORE_DEFAULT_OFF
|
restore_mode: RESTORE_DEFAULT_OFF
|
||||||
|
- platform: template
|
||||||
|
name: Zone Enable
|
||||||
|
id: zone_fn_enable
|
||||||
|
optimistic: True
|
||||||
|
icon: mdi:target-variant
|
||||||
|
entity_category: config
|
||||||
|
restore_mode: RESTORE_DEFAULT_ON
|
||||||
- platform: template
|
- platform: template
|
||||||
name: Illuminance Fast-Update
|
name: Illuminance Fast-Update
|
||||||
id: bh1750_fast_update
|
id: bh1750_fast_update
|
||||||
|
|
@ -1002,9 +1054,19 @@ uart:
|
||||||
|
|
||||||
bool has_target_in_zone_all = (all_target_counts > 0);
|
bool has_target_in_zone_all = (all_target_counts > 0);
|
||||||
|
|
||||||
|
int16_t target_count_in_zone1 = 0;
|
||||||
|
bool has_target_in_zone1 = false;
|
||||||
|
|
||||||
|
int16_t target_count_in_zone2 = 0;
|
||||||
|
bool has_target_in_zone2 = false;
|
||||||
|
|
||||||
|
int16_t target_count_in_zone3 = 0;
|
||||||
|
bool has_target_in_zone3 = false;
|
||||||
|
|
||||||
|
if (id(zone_fn_enable).state){
|
||||||
|
|
||||||
// zone 1 check
|
// zone 1 check
|
||||||
|
|
||||||
int16_t target_count_in_zone1 = 0;
|
|
||||||
int16_t zone1_x_min = id(zone1_x_begin).state;
|
int16_t zone1_x_min = id(zone1_x_begin).state;
|
||||||
int16_t zone1_x_max = id(zone1_x_end).state;
|
int16_t zone1_x_max = id(zone1_x_end).state;
|
||||||
int16_t zone1_y_min = id(zone1_y_begin).state;
|
int16_t zone1_y_min = id(zone1_y_begin).state;
|
||||||
|
|
@ -1025,11 +1087,10 @@ uart:
|
||||||
target_count_in_zone1 ++;
|
target_count_in_zone1 ++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool has_target_in_zone1 = (target_count_in_zone1 > 0);
|
has_target_in_zone1 = (target_count_in_zone1 > 0);
|
||||||
|
|
||||||
// zone 2 check
|
// zone 2 check
|
||||||
|
|
||||||
int16_t target_count_in_zone2 = 0;
|
|
||||||
int16_t zone2_x_min = id(zone2_x_begin).state;
|
int16_t zone2_x_min = id(zone2_x_begin).state;
|
||||||
int16_t zone2_x_max = id(zone2_x_end).state;
|
int16_t zone2_x_max = id(zone2_x_end).state;
|
||||||
int16_t zone2_y_min = id(zone2_y_begin).state;
|
int16_t zone2_y_min = id(zone2_y_begin).state;
|
||||||
|
|
@ -1051,11 +1112,10 @@ uart:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool has_target_in_zone2 = (target_count_in_zone2 > 0);
|
has_target_in_zone2 = (target_count_in_zone2 > 0);
|
||||||
|
|
||||||
// zone 3 check
|
// zone 3 check
|
||||||
|
|
||||||
int16_t target_count_in_zone3 = 0;
|
|
||||||
int16_t zone3_x_min = id(zone3_x_begin).state;
|
int16_t zone3_x_min = id(zone3_x_begin).state;
|
||||||
int16_t zone3_x_max = id(zone3_x_end).state;
|
int16_t zone3_x_max = id(zone3_x_end).state;
|
||||||
int16_t zone3_y_min = id(zone3_y_begin).state;
|
int16_t zone3_y_min = id(zone3_y_begin).state;
|
||||||
|
|
@ -1076,9 +1136,107 @@ uart:
|
||||||
target_count_in_zone3 ++;
|
target_count_in_zone3 ++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bool has_target_in_zone3 = (target_count_in_zone3 > 0);
|
has_target_in_zone3 = (target_count_in_zone3 > 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Angle, Position and Direction, idea from walberjunior.
|
||||||
|
|
||||||
|
float p1_angle = 0;
|
||||||
|
if (p1_vaild){
|
||||||
|
p1_angle = ((float)p1_x / (float)p1_y) * 180 / M_PI;;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::basic_string<char> p1_position = "Static";
|
||||||
|
if (p1_speed > 0) {
|
||||||
|
p1_position = "Moving away";
|
||||||
|
} else if (p1_speed < 0) {
|
||||||
|
p1_position = "Approaching";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::basic_string<char> p1_direction = "None";
|
||||||
|
if (p1_x > 0) {
|
||||||
|
p1_direction = "Right";
|
||||||
|
} else if (p1_x < 0) {
|
||||||
|
p1_direction = "Left";
|
||||||
|
} else if (p1_y > 0){
|
||||||
|
p1_direction = "Middle";
|
||||||
|
}
|
||||||
|
|
||||||
|
float p2_angle = 0;
|
||||||
|
if (p2_vaild){
|
||||||
|
p2_angle = ((float)p2_x / (float)p2_y) * 180 / M_PI;;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::basic_string<char> p2_position = "Static";;
|
||||||
|
if (p2_speed > 0) {
|
||||||
|
p2_position = "Moving away";
|
||||||
|
} else if (p2_speed < 0) {
|
||||||
|
p2_position = "Approaching";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::basic_string<char> p2_direction = "None";
|
||||||
|
if (p2_x > 0) {
|
||||||
|
p2_direction = "Right";
|
||||||
|
} else if (p2_x < 0) {
|
||||||
|
p2_direction = "Left";
|
||||||
|
} else if (p2_y > 0){
|
||||||
|
p2_direction = "Middle";
|
||||||
|
}
|
||||||
|
|
||||||
|
float p3_angle = 0;
|
||||||
|
if (p3_vaild){
|
||||||
|
p3_angle = ((float)p3_x / (float)p3_y) * 180 / M_PI;;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::basic_string<char> p3_position = "Static";;
|
||||||
|
if (p3_speed > 0) {
|
||||||
|
p3_position = "Moving away";
|
||||||
|
} else if (p3_speed < 0) {
|
||||||
|
p3_position = "Approaching";
|
||||||
|
}
|
||||||
|
|
||||||
|
std::basic_string<char> p3_direction = "None";
|
||||||
|
if (p3_x > 0) {
|
||||||
|
p3_direction = "Right";
|
||||||
|
} else if (p3_x < 0) {
|
||||||
|
p3_direction = "Left";
|
||||||
|
} else if (p3_y > 0){
|
||||||
|
p3_direction = "Middle";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (id(target1_angle).state != p1_angle){
|
||||||
|
id(target1_angle).publish_state(p1_angle);
|
||||||
|
}
|
||||||
|
if (id(target2_angle).state != p2_angle){
|
||||||
|
id(target2_angle).publish_state(p2_angle);
|
||||||
|
}
|
||||||
|
if (id(target3_angle).state != p3_angle){
|
||||||
|
id(target3_angle).publish_state(p3_angle);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p1_position != id(target1_position).state){
|
||||||
|
id(target1_position).publish_state(p1_position);
|
||||||
|
}
|
||||||
|
if (p2_position != id(target2_position).state){
|
||||||
|
id(target2_position).publish_state(p2_position);
|
||||||
|
}
|
||||||
|
if (p3_position != id(target3_position).state){
|
||||||
|
id(target3_position).publish_state(p3_position);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p1_direction != id(target1_direction).state){
|
||||||
|
id(target1_direction).publish_state(p1_direction);
|
||||||
|
}
|
||||||
|
if (p2_direction != id(target2_direction).state){
|
||||||
|
id(target2_direction).publish_state(p2_direction);
|
||||||
|
}
|
||||||
|
if (p3_direction != id(target3_direction).state){
|
||||||
|
id(target3_direction).publish_state(p3_direction);
|
||||||
|
}
|
||||||
|
|
||||||
// public all info
|
// public all info
|
||||||
|
|
||||||
if (id(target1_x).state != p1_x){
|
if (id(target1_x).state != p1_x){
|
||||||
id(target1_x).publish_state(p1_x);
|
id(target1_x).publish_state(p1_x);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user