Skip to content

Instantly share code, notes, and snippets.

@mirkop
Last active June 5, 2025 20:08
Show Gist options
  • Save mirkop/34094412957f6d30254f66ff420cedb6 to your computer and use it in GitHub Desktop.
Save mirkop/34094412957f6d30254f66ff420cedb6 to your computer and use it in GitHub Desktop.
Home Assistant LD2410 Templates

Home Assistant LD2410 Templates

There are five card templates available to aid in configuring the LD2410 mmWave gates and zones.

  • Gate Energy Live Bar Chart
  • Distances Live Bar Chart
  • Occupancy History
  • Gate move/threshold Configuration
  • Zone Configuration

Install the following dependencies:

Follow these steps to add the card templates to a Home Assistant dashboard. The provided YAML use the Streamline Card template. If you want to use Decluttering Card template, replace 'streamline_templates:' with 'decluttering_templates:' and 'type: custom:streamline-card' with 'type: custom:decluttering-card'.

  • Create a new or use an existing dashboard. https://www.home-assistant.io/dashboards/dashboards/#creating-a-new-dashboard
  • Open your dashboard for editing by clicking on the pencil icon (✎) in the top-right corner of the page. Then click the vertical dots (⁞) and select "Raw configuration editor" from the menu.
  • Add the contents of ld2410_templates.yaml file at the top of the existing dashboard yaml. Then, click the SAVE button at the top-right and close the editor by clicking on the X at the top-left.
  • Find the name of the LD2410 device entity you want to use with the cards. You will only need the base name of the entity. You can find the entity's name by visiting the ESPHome Integration and getting its full name. Example: if the full name is 'switch.apollo_msr_2_bada55_radar_engineering_mode', 'apollo_msr_2_bada55' is the base name of that entity that you will use with the cards.
  • Add the desired custom cards to your dashboard by selecting add card, the scrolling to the bottom of the dialog and selecting "Manual" to add the custom card.
  • In the card configuration dialog, paste the desired card's YAML into the editor. Update the variables 'device_title' and 'device_base_name' as needed. The device_title defaults to 'LD2410'. device_base_name should be set to the entity base name that you obtained previously. Then click SAVE to add the card. Repeat as needed to add additional cards.

Gate Energy Live Bar Chart

This chart displays the LD2410's live move and still gate energy. It also shows the current settings of the move and still gate thresholds. To use this chart, the LD2410 Radar Engineering Mode must be turned on.

Distances Live Bar Chart

This chart displays the LD2410's distance related entities.

  • Zones: Zone 1 Start, Zone 1,2,3 End
  • Radar distances for detected, moving and still.
  • Radar gates showing the distances that they cover.
  • Radar max move and still distance settings.
blueprint:
name: LD2410 Automations
description: >
Turns off specified switches after a set period, with an optional notification prompting
the user at mid-duration to turn off immediately or wait until timeout.
domain: automation
input:
switch_entities:
name: Switch Entities
description: The switches to control.
selector:
entity:
domain: switch
multiple: true
notify_mobile_app:
name: Notify Mobile App Service
description: >
Enter the notify service for your mobile app (e.g., notify.mobile_app_pixel_fold).
To find the notify service, go to Developer Tools > Actions in Home Assistant,
and select the service that starts with "notify.mobile_app_".
default: notify.mobile_app
selector:
text:
total_minutes_on:
name: Total Minutes On
description: Total number of minutes the switches will remain on before auto-off.
default: 30
selector:
number:
min: 1
max: 60
step: 1
reminder_delay_minutes:
name: Reminder Delay (minutes)
description: The minutes before sending a reminder notification. Set to 0 to skip notifications.
default: 15
selector:
number:
min: 0
max: 60
step: 1
trigger:
- platform: state
entity_id: !input switch_entities
to: "on"
variables:
total_minutes_on: !input total_minutes_on
reminder_delay_minutes: !input reminder_delay_minutes
action:
- alias: Wait before sending notification reminder (skip if delay is 0)
choose:
- conditions:
- condition: template
value_template: "{{ reminder_delay_minutes | int > 0 }}"
sequence:
- delay:
minutes: "{{ reminder_delay_minutes }}"
default: []
- alias: Notify user to request immediate switch-off (skip if delay is 0)
choose:
- conditions:
- condition: template
value_template: "{{ reminder_delay_minutes | int > 0 }}"
sequence:
- service: !input notify_mobile_app
data:
title: Radar Engineering Mode Reminder
message: >
{{ trigger.to_state.attributes.friendly_name }} has been ON for {{ reminder_delay_minutes }} minutes. Turn it off now?
data:
actions:
- action: TURN_OFF_NOW
title: Yes, Turn Off
- action: KEEP_ON
title: No, Keep On
default: []
- alias: Wait for user notification response or remaining time
wait_for_trigger:
- platform: event
event_type: mobile_app_notification_action
event_data:
action: TURN_OFF_NOW
- platform: event
event_type: mobile_app_notification_action
event_data:
action: KEEP_ON
timeout:
minutes: "{{ (total_minutes_on | int) - (reminder_delay_minutes | int) }}"
continue_on_timeout: true
- alias: Handle user response (Notification Action) or timeout
choose:
- conditions:
- condition: template
value_template: >-
{{ wait.trigger is defined and wait.trigger.event.data.action == 'TURN_OFF_NOW' }}
sequence:
- alias: Immediately turn off switch
service: switch.turn_off
target:
entity_id: "{{ trigger.entity_id }}"
- conditions:
- condition: template
value_template: >-
{{ wait.trigger is defined and wait.trigger.event.data.action == 'KEEP_ON' }}
sequence:
- alias: User chose keep on; wait remaining duration
delay:
minutes: "{{ (total_minutes_on | int) - (reminder_delay_minutes | int) }}"
- alias: Now auto-shutdown switch after total timeout
service: switch.turn_off
target:
entity_id: "{{ trigger.entity_id }}"
default:
- alias: User didn't respond; auto-switch off at total timeout
service: switch.turn_off
target:
entity_id: "{{ trigger.entity_id }}"
mode: parallel
# Variables labeled OPTIONAL have the default value listed.
# Gate Energy Live Bar Chart
type: custom:streamline-card
template: ld2410_gate_energy_chart
variables:
- device_base_name: apollo_msr_2_bada55
- device_title: LD2410 # OPTIONAL
- move_bar_color: "#4b0082" # OPTIONAL
- move_threshold_color: "#9467bd" # OPTIONAL
- still_bar_color: "#274e13" # OPTIONAL
- still_threshold_color: "#8cb640" # OPTIONAL
# Distances Chart
type: custom:streamline-card
template: ld2410_distances_chart
variables:
- device_base_name: apollo_msr_2_bada55
- device_title: LD2410 # OPTIONAL
- move_bar_color: "#4b0082" # OPTIONAL
- still_bar_color: "#274e13" # OPTIONAL
- detection_bar_color: "#8b0000" # OPTIONAL
- show_zones: true # OPTIONAL
- show_distance: true # OPTIONAL
- show_gates: true # OPTIONAL
- show_max_gates: true # OPTIONAL
- bar_size: 35 # OPTIONAL
# Valid values - mm|cm|m|in|ft|yd
- chart_unit_of_measurement: cm # OPTIONAL
# Occupancy History
type: custom:streamline-card
template: ld2410_occupancy_history
variables:
- device_base_name: apollo_msr_2_bada55
- device_title: LD2410 # OPTIONAL
# Gate move/threshold Configuration
type: custom:streamline-card
template: ld2410_gate_energy_configuration
variables:
- device_base_name: apollo_msr_2_bada55
- device_title: LD2410 # OPTIONAL
# Zone Configuration
type: custom:streamline-card
template: ld2410_zone_configuration
variables:
- device_base_name: apollo_msr_2_bada55
- device_title: LD2410 # OPTIONAL
streamline_templates:
##############
### LD2410 ###
##############
ld2410_gate_energy_chart:
default:
device_title: LD2410
move_bar_color: "#4b0082"
move_threshold_color: "#9467bd"
still_bar_color: "#274e13"
still_threshold_color: "#8cb640"
card:
type: custom:plotly-graph
title: "[[device_title]] Gate Energy"
refresh_interval: 1
raw_plotly_config: true
init:
###################
# Common Funcions #
###################
- $ex {
vars.get_entity_state = (entity, default_state) => {
let entity_obj = hass.states[entity];
if (entity_obj === undefined) {
if (default_state === undefined) {
throw new TypeError("Entity not found -> " + entity);
}
return default_state;
}
var state = entity_obj.state;
if (state === undefined || state === null || state === 'unknown') {
if (default_state === undefined) {
throw new TypeError("Entity state is undefined or null -> " + entity);
}
return default_state;
}
return state;
};
}
##################################
# Radar Engineering Mode Message #
##################################
- $ex {
let radar_engineering_mode = vars.get_entity_state('switch.[[device_base_name]]_radar_engineering_mode');
vars.show_radar_engineering_mode_on = radar_engineering_mode === 'on';
}
defaults:
entity:
texttemplate: "%{y}"
x:
- G0
- G1
- G2
- G3
- G4
- G5
- G6
- G7
- G8
entities:
- entity: ""
name: Move Energy
legendgroup: Move
type: bar
marker:
color: "[[move_bar_color]]"
"y":
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g0_move_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g1_move_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g2_move_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g3_move_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g4_move_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g5_move_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g6_move_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g7_move_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g8_move_energy', 0)
- entity: ""
name: Move Threshold
legendgroup: Move
visible: $ex vars.show_radar_engineering_mode_on
type: scatter
mode: markers
marker:
symbol: arrow-right
size: 15
color: "[[move_threshold_color]]"
"y":
- $ex vars.get_entity_state('number.[[device_base_name]]_g0_move_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g1_move_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g2_move_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g3_move_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g4_move_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g5_move_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g6_move_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g7_move_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g8_move_threshold')
- entity: ""
name: Still Energy
legendgroup: Still
type: bar
marker:
color: "[[still_bar_color]]"
"y":
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g0_still_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g1_still_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g2_still_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g3_still_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g4_still_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g5_still_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g6_still_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g7_still_energy', 0)
- $ex vars.get_entity_state('sensor.[[device_base_name]]_g8_still_energy', 0)
- entity: ""
name: Still Threshold
legendgroup: Still
visible: $ex vars.show_radar_engineering_mode_on
type: scatter
mode: markers
marker:
symbol: arrow-left
size: 15
color: "[[still_threshold_color]]"
"y":
- $ex vars.get_entity_state('number.[[device_base_name]]_g0_still_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g1_still_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g2_still_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g3_still_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g4_still_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g5_still_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g6_still_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g7_still_threshold')
- $ex vars.get_entity_state('number.[[device_base_name]]_g8_still_threshold')
layout:
barmode: group
dragmode: false
hovermode: false
legend:
itemsizing: constant
orientation: h
margin:
t: 15
l: 30
r: 10
xaxis:
showgrid: false
tickfont:
size: 20
yaxis:
dtick: 10
fixedrange: true
range:
- 0
- 100.3 # Used 100.3 to avoid the top grid line being cut off.
annotations:
- text: 'Turn on "Radar Engineering Mode"<br>to see the gate energy values.'
visible: $ex !vars.show_radar_engineering_mode_on
showarrow: false
x: G4
y: 50
font:
size: 20
color: "#FFFFFF"
borderpad: 16
bgcolor: "#000000BB"
config:
displayModeBar: false
disablePinchToZoom: true
ld2410_distances_chart:
default:
device_title: LD2410
move_bar_color: "#4b0082"
still_bar_color: "#274e13"
detection_bar_color: "#8b0000"
show_radar_targets: true
show_zones: true
show_distance: true
show_gates: true
show_max_gates: true
bar_size: 35
# mm|cm|m|in|ft|yd
chart_unit_of_measurement: input_entity
chart_unit_of_measurement_entity: input_select.ld2410_distances_chart_unit_of_measurement
card:
type: custom:plotly-graph
title: "[[device_title]] Distances"
# ha_theme: false
refresh_interval: 1
raw_plotly_config: true
init:
###################
# Common Funcions #
###################
- $ex {
vars.is_valid_uom = (uom) => {
return uom === 'mm' ||
uom === 'cm' ||
uom === 'm' ||
uom === 'in' ||
uom === 'ft' ||
uom === 'yd';
};
vars.get_entity_state = (entity, default_state) => {
let entity_obj = hass.states[entity];
if (entity_obj === undefined) {
if (default_state === undefined) {
throw new TypeError("Entity not found -> " + entity);
}
return default_state;
}
var state = entity_obj.state;
if (state === undefined || state === null) {
if (default_state === undefined) {
throw new TypeError("Entity state is undefined or null -> " + entity);
}
return default_state;
}
return state;
};
vars.get_entity_uom = (entity, default_uom) => {
let entity_obj = hass.states[entity];
if (entity_obj === undefined) {
if (default_uom === undefined) {
throw new TypeError("UOM entity not found -> " + entity);
}
return default_uom;
}
var uom = undefined;
if (entity_obj.attributes !== undefined &&
entity_obj.attributes.unit_of_measurement !== undefined) {
uom = entity_obj.attributes.unit_of_measurement;
} else {
uom = entity_obj.state;
}
if (uom === undefined || !vars.is_valid_uom(uom)) {
if (default_uom === undefined) {
throw new TypeError("Entity UOM is invalid -> " + entity + " === " + uom);
}
return default_uom;
}
return uom;
};
vars.convert_to_chart_uom = (from_uom, value) => {
let chart_uom_entity = '[[chart_unit_of_measurement_entity]]';
let input_entity = 'input_entity';
vars.chart_uom = '[[chart_unit_of_measurement]]';
if (vars.chart_uom === input_entity) {
vars.chart_uom = vars.get_entity_uom(chart_uom_entity, 'cm');
}
if (from_uom === vars.chart_uom) return value;
// Convert each from_uom to the chart_uom (chart_unit_of_measurement)
// mm, cm, m, in, ft, yd
if (from_uom == 'mm' && vars.chart_uom == 'cm') return value / 10;
if (from_uom == 'mm' && vars.chart_uom == 'm') return value / 1000;
if (from_uom == 'mm' && vars.chart_uom == 'in') return value / 25.4;
if (from_uom == 'mm' && vars.chart_uom == 'ft') return value / 304.8;
if (from_uom == 'mm' && vars.chart_uom == 'yd') return value / 914.4;
if (from_uom == 'cm' && vars.chart_uom == 'mm') return value * 10;
if (from_uom == 'cm' && vars.chart_uom == 'm') return value / 100;
if (from_uom == 'cm' && vars.chart_uom == 'in') return value / 2.54;
if (from_uom == 'cm' && vars.chart_uom == 'ft') return value / 30.48;
if (from_uom == 'cm' && vars.chart_uom == 'yd') return value / 91.44;
if (from_uom == 'm' && vars.chart_uom == 'mm') return value * 1000;
if (from_uom == 'm' && vars.chart_uom == 'cm') return value * 100;
if (from_uom == 'm' && vars.chart_uom == 'in') return value * 39.3701;
if (from_uom == 'm' && vars.chart_uom == 'ft') return value * 3.28084;
if (from_uom == 'm' && vars.chart_uom == 'yd') return value * 1.09361;
if (from_uom == 'in' && vars.chart_uom == 'mm') return value * 25.4;
if (from_uom == 'in' && vars.chart_uom == 'cm') return value * 2.54;
if (from_uom == 'in' && vars.chart_uom == 'm') return value / 39.3701;
if (from_uom == 'in' && vars.chart_uom == 'ft') return value / 12;
if (from_uom == 'in' && vars.chart_uom == 'yd') return value / 36;
if (from_uom == 'ft' && vars.chart_uom == 'mm') return value * 304.8;
if (from_uom == 'ft' && vars.chart_uom == 'cm') return value * 30.48;
if (from_uom == 'ft' && vars.chart_uom == 'm') return value / 3.28084;
if (from_uom == 'ft' && vars.chart_uom == 'in') return value * 12;
if (from_uom == 'ft' && vars.chart_uom == 'yd') return value / 3;
if (from_uom == 'yd' && vars.chart_uom == 'mm') return value * 914.4;
if (from_uom == 'yd' && vars.chart_uom == 'cm') return value * 91.44;
if (from_uom == 'yd' && vars.chart_uom == 'm') return value / 1.09361;
if (from_uom == 'yd' && vars.chart_uom == 'in') return value * 36;
if (from_uom == 'yd' && vars.chart_uom == 'ft') return value * 3;
return value;
};
vars.get_occupied_symbol = (entity_state) =>{
if (entity_state === 'on') {
return "circle";
} else {
return "circle-open";
}
}
}
####################
# Input Validation #
####################
- $ex {
let chart_uom = '[[chart_unit_of_measurement]]';
if (chart_uom !== 'input_entity' && !vars.is_valid_uom(chart_uom)) {
throw new TypeError("Invalid chart_unit_of_measurement [valid - mm|cm|m|in|ft|yd], " + chart_uom);
}
}
####################
# Common Variables #
####################
- $ex {
let gate_size_str = vars.get_entity_state('select.[[device_base_name]]_ld2410_gate_size', '0.75m');
vars.gate_size = vars.convert_to_chart_uom('m', parseFloat(gate_size_str.replace(/[^0-9.]/g, '')));
vars.max_detection_range = vars.gate_size * 8;
vars.marker_symbol_size = 10;
vars.show_radar_targets = Boolean('[[show_radar_targets]]');
vars.show_zones = Boolean('[[show_zones]]');
vars.show_distance = Boolean('[[show_distance]]');
vars.show_gates = Boolean('[[show_gates]]');
vars.show_max_gates = Boolean('[[show_max_gates]]');
}
##################
# Max Gates Bars #
##################
- $ex {
vars.radar_max_still_gate = vars.get_entity_state('number.[[device_base_name]]_radar_max_still_distance');
vars.radar_max_still_distance = vars.radar_max_still_gate * vars.gate_size;
vars.radar_max_move_gate = vars.get_entity_state('number.[[device_base_name]]_radar_max_move_distance');
vars.radar_max_move_distance = vars.radar_max_move_gate * vars.gate_size;
}
##############
# Gates Bars #
##############
- $ex {
}
#################
# Distance Bars #
#################
- $ex {
let radar_still_distance_uom = vars.get_entity_uom('sensor.[[device_base_name]]_radar_still_distance');
let radar_moving_distance_uom = vars.get_entity_uom('sensor.[[device_base_name]]_radar_moving_distance');
let radar_detection_distance_uom = vars.get_entity_uom('sensor.[[device_base_name]]_radar_detection_distance');
vars.radar_still_distance = vars.convert_to_chart_uom(radar_still_distance_uom, vars.get_entity_state('sensor.[[device_base_name]]_radar_still_distance'));
vars.radar_moving_distance = vars.convert_to_chart_uom(radar_moving_distance_uom, vars.get_entity_state('sensor.[[device_base_name]]_radar_moving_distance'));
vars.radar_detection_distance = vars.convert_to_chart_uom(radar_detection_distance_uom, vars.get_entity_state('sensor.[[device_base_name]]_radar_detection_distance'));
}
#############
# Zone Bars #
#############
- $ex {
let radar_zone_1_start_uom = vars.get_entity_uom('number.[[device_base_name]]_radar_zone_1_start');
let radar_end_zone_1_uom = vars.get_entity_uom('number.[[device_base_name]]_radar_end_zone_1');
let radar_end_zone_2_uom = vars.get_entity_uom('number.[[device_base_name]]_radar_end_zone_2');
let radar_end_zone_3_uom = vars.get_entity_uom('number.[[device_base_name]]_radar_end_zone_3');
vars.start_zone_1 = vars.convert_to_chart_uom(radar_zone_1_start_uom, vars.get_entity_state('number.[[device_base_name]]_radar_zone_1_start'));
vars.end_zone_1 = vars.convert_to_chart_uom(radar_end_zone_1_uom, vars.get_entity_state('number.[[device_base_name]]_radar_end_zone_1'));
vars.end_zone_2 = vars.convert_to_chart_uom(radar_end_zone_2_uom, vars.get_entity_state('number.[[device_base_name]]_radar_end_zone_2'));
vars.end_zone_3 = vars.convert_to_chart_uom(radar_end_zone_3_uom, vars.get_entity_state('number.[[device_base_name]]_radar_end_zone_3'));
}
#################
# Zone Occupied #
#################
- $ex {
vars.zone_marker_symbol_offset = vars.gate_size * 0.22;
let zone_1_occupied_state = vars.get_entity_state('binary_sensor.[[device_base_name]]_radar_zone_1_occupancy');
vars.zone_1_occupied = vars.show_zones && zone_1_occupied_state === 'on';
vars.zone_1_occupied_symbol = vars.get_occupied_symbol(zone_1_occupied_state);
let zone_2_occupied_state = vars.get_entity_state('binary_sensor.[[device_base_name]]_radar_zone_2_occupancy');
vars.zone_2_occupied = vars.show_zones && zone_2_occupied_state === 'on';
vars.zone_2_occupied_symbol = vars.get_occupied_symbol(zone_2_occupied_state);
let zone_3_occupied_state = vars.get_entity_state('binary_sensor.[[device_base_name]]_radar_zone_3_occupancy');
vars.zone_3_occupied = vars.show_zones && zone_3_occupied_state === 'on';
vars.zone_3_occupied_symbol = vars.get_occupied_symbol(zone_3_occupied_state);
}
################
# Radar Target #
################
- $ex {
vars.radar_target_size = vars.gate_size * (8/3) * 0.75;
vars.radar_target_spacer_size = vars.gate_size / 2;
vars.radar_target_marker_offset = vars.radar_target_size * 0.13;
let radar_target_state = vars.get_entity_state('binary_sensor.[[device_base_name]]_radar_target');
vars.radar_target_occupied_symbol = vars.get_occupied_symbol(radar_target_state);
let radar_moving_target_state = vars.get_entity_state('binary_sensor.[[device_base_name]]_radar_moving_target');
vars.radar_target_moving_occupied_symbol = vars.get_occupied_symbol(radar_moving_target_state);
let radar_still_target_state = vars.get_entity_state('binary_sensor.[[device_base_name]]_radar_still_target');
vars.radar_target_still_occupied_symbol = vars.get_occupied_symbol(radar_still_target_state);
}
##########
# Layout #
##########
- $ex {
vars.bar_size = parseInt('[[bar_size]]');
vars.layout_margin_t = 15;
vars.layout_margin_b = 65;
vars.layout_height = vars.layout_margin_t + vars.layout_margin_b;
if (vars.show_zones) vars.layout_height += vars.bar_size * 2;
if (vars.show_distance) vars.layout_height += (vars.bar_size * 3);
if (vars.show_gates) vars.layout_height += vars.bar_size;
if (vars.show_max_gates) vars.layout_height += (vars.bar_size * 2);
}
defaults:
entity:
type: bar
showlegend: false
orientation: h
insidetextanchor: "middle"
entities:
##################
# Max Gates Bars #
##################
- entity: ""
visible: $ex vars.show_max_gates
texttemplate:
- "$ex 'G' + ~~vars.radar_max_still_gate"
- "$ex 'G' + ~~vars.radar_max_move_gate"
marker:
color:
- "[[still_bar_color]]"
- "[[move_bar_color]]"
x:
- $ex vars.radar_max_still_distance;
- $ex vars.radar_max_move_distance;
"y":
- Max Still
- Max Move
#############
# Gate Bars #
#############
- entity: ""
visible: $ex vars.show_gates
marker:
# Blackbody,Bluered,Blues,Cividis,Earth,Electric,Greens,Greys,Hot,Jet,Picnic,Portland,Rainbow,RdBu,Reds,Viridis,YlGnBu,YlOrRd
colorscale: Portland
color:
- 0
- 1
- 2
- 3
- 4
- 5
- 6
- 7
texttemplate:
- "G1"
- "G2"
- "G3"
- "G4"
- "G5"
- "G6"
- "G7"
- "G8"
x:
- $ex vars.gate_size
- $ex vars.gate_size
- $ex vars.gate_size
- $ex vars.gate_size
- $ex vars.gate_size
- $ex vars.gate_size
- $ex vars.gate_size
- $ex vars.gate_size
"y":
- Gates
- Gates
- Gates
- Gates
- Gates
- Gates
- Gates
- Gates
- Gates
#################
# Distance Bars #
#################
- entity: ""
visible: $ex vars.show_distance
texttemplate: $ex '%{x:.2f} ' + vars.chart_uom
marker:
color:
- "[[still_bar_color]]"
- "[[move_bar_color]]"
- "[[detection_bar_color]]"
x:
- $ex vars.radar_still_distance
- $ex vars.radar_moving_distance
- $ex vars.radar_detection_distance
"y":
- Still
- Moving
- Detection
#############
# Zone Bars #
#############
- entity: ""
visible: $ex vars.show_zones
marker:
color:
- "#00000000"
- red
- blue
- green
texttemplate:
- ""
- "Zone 1"
- "Zone 2"
- "Zone 3"
x:
- $ex vars.start_zone_1;
- $ex (vars.end_zone_1 - vars.start_zone_1);
- $ex (vars.end_zone_2 - vars.end_zone_1);
- $ex (vars.end_zone_3 - vars.end_zone_2);
"y":
- Zones
- Zones
- Zones
- Zones
##################
# Zone Occupancy #
##################
- entity: ""
visible: $ex vars.show_zones
type: scatter
mode: markers
marker:
color: "#FFFFFFFF"
symbol:
- $ex vars.zone_1_occupied_symbol
- $ex vars.zone_2_occupied_symbol
- $ex vars.zone_3_occupied_symbol
size: $ex vars.marker_symbol_size
x:
- $ex (vars.end_zone_1 - vars.zone_marker_symbol_offset);
- $ex (vars.end_zone_2 - vars.zone_marker_symbol_offset);
- $ex (vars.end_zone_3 - vars.zone_marker_symbol_offset);
"y":
- Zones
- Zones
- Zones
#########################
# Radar Target Detected #
#########################
- entity: ""
visible: $ex vars.show_radar_targets
text:
- ""
- "Target"
- ""
- "Moving Target"
- ""
- "Still Target"
insidetextanchor: "start"
marker:
color:
- "#00000000"
- "#000000E6"
- "#00000000"
- "#000000E6"
- "#00000000"
- "#000000E6"
x:
- $ex vars.radar_target_spacer_size
- $ex vars.radar_target_size
- $ex vars.radar_target_spacer_size
- $ex vars.radar_target_size
- $ex vars.radar_target_spacer_size
- $ex vars.radar_target_size
"y":
- Radar
- Radar
- Radar
- Radar
- Radar
- Radar
- entity: ""
visible: $ex vars.show_radar_targets
type: scatter
mode: markers
marker:
color: "#FFFFFFFF"
symbol:
- $ex vars.radar_target_occupied_symbol
- $ex vars.radar_target_moving_occupied_symbol
- $ex vars.radar_target_still_occupied_symbol
size: $ex vars.marker_symbol_size
x:
- $ex (vars.radar_target_spacer_size + vars.radar_target_size - vars.radar_target_marker_offset);
- $ex (vars.radar_target_spacer_size * 2 + vars.radar_target_size * 2 - vars.radar_target_marker_offset);
- $ex (vars.radar_target_spacer_size * 3 + vars.radar_target_size * 3 - vars.radar_target_marker_offset);
"y":
- Radar
- Radar
- Radar
layout:
height: $ex vars.layout_height
dragmode: false
hovermode: false
barmode: relative
margin:
t: $ex vars.layout_margin_t
l: 60
r: 30
b: $ex vars.layout_margin_b
yaxis:
tickangle: -30
showgrid: false
xaxis:
dtick: $ex (vars.max_detection_range / 8);
ticksuffix: $ex ' ' + vars.chart_uom
tickangle: 60
fixedrange: true
range:
- 0
- $ex vars.max_detection_range * 1.003;
config:
displayModeBar: false
disablePinchToZoom: true
ld2410_occupancy_history:
default:
device_title: LD2410
hours_to_show: 1
card:
type: history-graph
title: "[[device_title]] Occupancy History"
hours_to_show: '[[hours_to_show]]'
entities:
- entity: binary_sensor.[[device_base_name]]_radar_target
name: Detected
- entity: binary_sensor.[[device_base_name]]_radar_zone_1_occupancy
name: Zone 1
- entity: binary_sensor.[[device_base_name]]_radar_zone_2_occupancy
name: Zone 2
- entity: binary_sensor.[[device_base_name]]_radar_zone_3_occupancy
name: Zone 3
ld2410_gate_energy_configuration:
default:
device_title: LD2410
card:
type: entities
title: "[[device_title]] Gate Config"
entities:
- entity: switch.[[device_base_name]]_radar_engineering_mode
name: Radar Engineering Mode
- entity: button.[[device_base_name]]_restart_radar
name: Restart Radar
- entity: number.[[device_base_name]]_radar_timeout
name: Radar Timeout
- entity: number.[[device_base_name]]_radar_max_move_distance
name: Radar Max Move Distance
- entity: number.[[device_base_name]]_radar_max_still_distance
name: Radar Max Still Distance
- entity: number.[[device_base_name]]_g0_move_threshold
name: G0 move threshold
- entity: number.[[device_base_name]]_g0_still_threshold
name: G0 still threshold
- entity: number.[[device_base_name]]_g1_move_threshold
name: G1 move threshold
- entity: number.[[device_base_name]]_g1_still_threshold
name: G1 still threshold
- entity: number.[[device_base_name]]_g2_move_threshold
name: G2 move threshold
- entity: number.[[device_base_name]]_g2_still_threshold
name: G2 still threshold
- entity: number.[[device_base_name]]_g3_move_threshold
name: G3 move threshold
- entity: number.[[device_base_name]]_g3_still_threshold
name: G3 still threshold
- entity: number.[[device_base_name]]_g4_move_threshold
name: G4 move threshold
- entity: number.[[device_base_name]]_g4_still_threshold
name: G4 still threshold
- entity: number.[[device_base_name]]_g5_move_threshold
name: G5 move threshold
- entity: number.[[device_base_name]]_g5_still_threshold
name: G5 still threshold
- entity: number.[[device_base_name]]_g6_move_threshold
name: G6 move threshold
- entity: number.[[device_base_name]]_g6_still_threshold
name: G6 still threshold
- entity: number.[[device_base_name]]_g7_move_threshold
name: G7 move threshold
- entity: number.[[device_base_name]]_g7_still_threshold
name: G7 still threshold
- entity: number.[[device_base_name]]_g8_move_threshold
name: G8 move threshold
- entity: number.[[device_base_name]]_g8_still_threshold
name: G8 still threshold
ld2410_zone_configuration:
default:
device_title: LD2410
card:
type: entities
title: "[[device_title]] Zone Config"
entities:
- entity: binary_sensor.[[device_base_name]]_radar_target
name: Radar Target
- entity: binary_sensor.[[device_base_name]]_radar_zone_1_occupancy
name: Radar Zone 1 Occupancy
- entity: binary_sensor.[[device_base_name]]_radar_zone_2_occupancy
name: Radar Zone 2 Occupancy
- entity: binary_sensor.[[device_base_name]]_radar_zone_3_occupancy
name: Radar Zone 3 Occupancy
- entity: number.[[device_base_name]]_radar_zone_1_start
name: Start Zone 1
- entity: number.[[device_base_name]]_radar_end_zone_1
name: End Zone 1
- entity: number.[[device_base_name]]_radar_end_zone_2
name: End Zone 2
- entity: number.[[device_base_name]]_radar_end_zone_3
name: End Zone 3

Comments are disabled for this gist.