{"id":13035,"date":"2026-09-15T07:35:00","date_gmt":"2026-09-15T05:35:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=13035"},"modified":"2026-10-26T12:04:34","modified_gmt":"2026-10-26T11:04:34","slug":"tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/","title":{"rendered":"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant"},"content":{"rendered":"<p>The LD2450 reports the positions of up to three radar targets: objects tracked from reflected radar signals. Rectangular zones can separate a desk from a doorway when the targets are reliably detected. A target is not a verified person, and a stationary person can disappear from tracking. Zone-based lighting therefore needs measurements and an appropriate hold time.<\/p>\n<figure class=\"lw-diagram\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-13035-radar-20261024.png\" width=\"1120\" height=\"580\" alt=\"Illustrative rectangles in sensor coordinates. Zone 1 includes the example 200 mm margin; parts outside actual coverage remain undetectable.\"><figcaption>Illustrative rectangles in sensor coordinates. Zone 1 includes the example 200 mm margin; parts outside actual coverage remain undetectable.<\/figcaption><\/figure>\n<h2>Hardware, coordinates and version<\/h2>\n<p>The manufacturer specifies 24 GHz, a maximum detection distance of 6 m, an azimuth angle of \u00b160\u00b0 and a pitch angle of \u00b135\u00b0, with wall mounting. These are nominal specifications, not a guaranteed detection boundary in every room. Metal, furniture, mounting angle and reflections can alter the results.<\/p>\n<p>The coordinate origin is the radar. X describes lateral position and Y the forward direction in the sensor frame, in millimetres. A short left\/right walking test establishes the sign for the actual mounting orientation. Rotating or tilting the board changes the measurement geometry; a 90\u00b0 rotation is not generally equivalent to simply swapping the floor-plan axes. Moving the sensor requires rechecking the zone boundaries.<\/p>\n<p>The example below targets <strong>ESPHome 2026.10.0<\/strong> and a classic ESP32 board with GPIO16 and GPIO17 available. ESPHome requires LD2450 firmware V2.02.23090617 or later. The UART uses 256000 baud, no parity and one stop bit. ESP TX connects to radar RX, ESP RX to radar TX, with a common ground. Power supply and signal levels must match the module and board specifications; the example pin assignment is not universal.<\/p>\n<h2>A valid rectangular-zone configuration<\/h2>\n<p>This complete example contains placeholder Wi-Fi credentials. Board selection, credentials and the Home Assistant API security settings require adaptation to the installation. Existing configuration sections are merged rather than duplicated. No firmware was flashed during the article check.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"yaml\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">YAML<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-yaml\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-attr\">esphome<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">name<\/span>: radar-zone-demo\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">esp32<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">board<\/span>: esp32dev\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">framework<\/span>:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">type<\/span>: esp-idf\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">logger<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">baud_rate<\/span>: <span class=\"cbb-number\">0<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">api<\/span>:\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">wifi<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">ssid<\/span>: <span class=\"cbb-string\">\"ExampleNetwork\"<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">password<\/span>: <span class=\"cbb-string\">\"ExamplePassword123\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">uart<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">id<\/span>: uart_radar\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">tx_pin<\/span>: GPIO17\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">rx_pin<\/span>: GPIO16\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">baud_rate<\/span>: <span class=\"cbb-number\">256000<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">parity<\/span>: NONE\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">stop_bits<\/span>: <span class=\"cbb-number\">1<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">ld2450<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">id<\/span>: radar\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-attr\">uart_id<\/span>: uart_radar\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">binary_sensor<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">platform<\/span>: ld2450\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">ld2450_id<\/span>: radar\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">has_target<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Overall presence\"<\/span>\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">platform<\/span>: template\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">id<\/span>: desk_occupied\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Desk occupied\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">device_class<\/span>: occupancy\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">lambda<\/span>: <span class=\"cbb-meta\">|-<\/span>\n<\/span><span class=\"cbb-line\">      if (!id(desk_count).has_state() || isnan(id(desk_count).state)) {\n<\/span><span class=\"cbb-line\">        return {};\n<\/span><span class=\"cbb-line\">      }\n<\/span><span class=\"cbb-line\">      return id(desk_count).state &gt; 0;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">filters<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">delayed_off<\/span>: 20s\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">sensor<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">platform<\/span>: ld2450\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">ld2450_id<\/span>: radar\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">target_1<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">x<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Target 1 X\"<\/span>\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">y<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Target 1 Y\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">zone_1<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">target_count<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">id<\/span>: desk_count\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Desk target count\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">number<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">platform<\/span>: ld2450\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">ld2450_id<\/span>: radar\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">presence_timeout<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Overall presence timeout\"<\/span>\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">zone_1<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">x1<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Zone 1 X1\"<\/span>\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">y1<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Zone 1 Y1\"<\/span>\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">x2<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Zone 1 X2\"<\/span>\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">y2<\/span>:\n<\/span><span class=\"cbb-line\">        <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Zone 1 Y2\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">select<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">platform<\/span>: ld2450\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">ld2450_id<\/span>: radar\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">zone_type<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Hardware zone mode\"<\/span>\n<\/span><span class=\"cbb-line\"><span class=\"cbb-attr\">switch<\/span>:\n<\/span><span class=\"cbb-line\">  <span class=\"cbb-operator\">-<\/span> <span class=\"cbb-attr\">platform<\/span>: ld2450\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">ld2450_id<\/span>: radar\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-attr\">multi_target<\/span>:\n<\/span><span class=\"cbb-line\">      <span class=\"cbb-attr\">name<\/span>: <span class=\"cbb-string\">\"Multi-target tracking\"<\/span><\/span><\/code><\/pre><\/figure>\n<p>The native rectangular-zone settings are named <code>x1<\/code>, <code>y1<\/code>, <code>x2<\/code> and <code>y2<\/code>. The component has no <code>binary_sensor.zone_1.occupancy<\/code> option in the tested version. Instead, a template calculates an occupied\/unoccupied state from the zone\u2019s target count. At least one detected target means occupied. Missing or invalid initial counts do not become a false measured zero.<\/p>\n<p>The component-level <code>throttle<\/code> option has been removed. Numeric LD2450 entities already have default filters that limit ordinary updates to roughly one-second intervals while prioritizing particular changes. Custom filters replace the defaults. An update is not automatically a new Home Assistant state, and database growth cannot be predicted as a fixed number of megabytes per sensor.<\/p>\n<h2>Measuring and saving the rectangle<\/h2>\n<p>For an isolated measurement, one moving target is easier to identify. Target slots are not persistent person identities. Measurements at the corners and along the edges, while standing and sitting, reveal the usable boundary. With several targets, a display of all three slots is useful; the example exposes only the first slot for initial calibration.<\/p>\n<pre><code>Example corner readings, x \/ y in mm:\n380 \/ 840     1760 \/ 810\n420 \/ 2310    1780 \/ 2360\n\nMeasured bounds: x 380..1780, y 810..2360\nWith 200 mm on each side:\nx1 = 180, x2 = 1980, y1 = 610, y2 = 2560<\/code><\/pre>\n<p>The 200 mm margin is an example, not a universal accuracy specification. A larger rectangle can include a nearby walkway. An entity is an individually addressable value or state in Home Assistant. The four number entities are adjustable values that set the radar\u2019s hardware-zone coordinates; the values are not automatically written back into the YAML file. A separate record of coordinates, mounting position and zone mode makes replacement and recovery reproducible.<\/p>\n<p>The hardware zone mode is independent of the template hold time: <code>Detection<\/code> limits reported targets to configured detection areas, <code>Filter<\/code> excludes configured areas, and <code>Disabled<\/code> disables hardware area filtering. These modes can alter all downstream target data. In the tested ESPHome implementation, zone counts are calculated from received coordinates and the configured rectangles; an excluded target cannot be recovered by a template. Calibration therefore includes the actual mode and all intended zones.<\/p>\n<h2>Hold time and automations<\/h2>\n<p>The example\u2019s <code>delayed_off: 20s<\/code> postpones a change to unoccupied until the template has continuously reported false for 20 seconds. Renewed occupancy cancels the pending switch-off. This reduces short detection gaps but does not guarantee detection of a person sitting still for longer.<\/p>\n<p><code>presence_timeout<\/code> belongs to ESPHome\u2019s overall presence binary states, not to the radar\u2019s target-count reports. It does not add another five seconds to this template based on <code>desk_count<\/code>. Reporting filters, automation delays and the last actual detection can add other latency; an exact 25-second switch-off after a person leaves is not guaranteed.<\/p>\n<p>A Home Assistant state trigger on the resulting occupancy entity is convenient. A numeric-state trigger is also valid, but fires on crossing a threshold, not on every coordinate update. Behavior after restart, unavailable entities and loss of the UART connection needs explicit testing. The template keeps the prior state when no valid count is available; it is not a communication watchdog, and a stale count requires separate availability monitoring.<\/p>\n<h2>Room tests and common limitations<\/h2>\n<p>The acceptance test includes entering, leaving, sitting still, walking just outside the zone, movement in an adjacent room, fans and curtains, and operation with another radar switched on and off. Wall penetration and interference depend on construction and installation; neither is an inevitable result. Phantom targets can move as well as remain still. A fixed coordinate alone does not prove a phantom, and a minimum-speed condition can reject the seated person that the automation needs to detect.<\/p>\n<h2>Frequently asked questions<\/h2>\n<h3>Is Y equal to the slant range?<\/h3><p>No general identity applies. The geometric distance \u221a(x\u00b2+y\u00b2+h\u00b2) is a slant range for a known three-dimensional point; it is not a documented conversion formula for the module\u2019s reported Y coordinate. Height, tilt and posture therefore need empirical checks instead of a promised correction based only on mounting height.<\/p>\n<h3>Can the zone count count people?<\/h3><p>Only as an approximate count of detected targets, capped by the module\u2019s three-target capacity. Occlusion, stationary targets, slot changes and reflections prevent a reliable people count.<\/p>\n<h3>Are diagnostic coordinates useful after calibration?<\/h3><p>Yes, for later mounting or furniture changes and fault investigation. Excluding these entities from Home Assistant Recorder can reduce history storage while retaining live readings. Disabled entities need re-enabling before renewed measurement.<\/p>\n<h2>Sources<\/h2><ul><li><a href=\"https:\/\/esphome.io\/components\/sensor\/ld2450\/\">ESPHome: LD2450 Sensor<\/a><\/li><li><a href=\"https:\/\/github.com\/esphome\/esphome\/blob\/2026.10.0\/esphome\/components\/ld2450\/__init__.py\">ESPHome 2026.10.0: LD2450 component schema<\/a><\/li><li><a href=\"https:\/\/github.com\/esphome\/esphome\/blob\/2026.10.0\/esphome\/components\/ld2450\/binary_sensor.py\">ESPHome 2026.10.0: LD2450 binary sensors<\/a><\/li><li><a href=\"https:\/\/github.com\/esphome\/esphome\/blob\/2026.10.0\/esphome\/components\/ld2450\/number\/__init__.py\">ESPHome 2026.10.0: LD2450 number entities<\/a><\/li><li><a href=\"https:\/\/github.com\/esphome\/esphome\/blob\/2026.10.0\/esphome\/components\/ld2450\/ld2450.cpp\">ESPHome 2026.10.0: LD2450 implementation<\/a><\/li><li><a href=\"https:\/\/esphome.io\/components\/binary_sensor\/template\/\">ESPHome: Template binary sensor<\/a><\/li><li><a href=\"https:\/\/esphome.io\/components\/binary_sensor\/#delayed-off\">ESPHome: Binary sensor filters<\/a><\/li><li><a href=\"https:\/\/www.hlktech.net\/index.php?id=1157\">Hi-Link: HLK-LD2450 product specifications<\/a><\/li><li><a href=\"https:\/\/www.home-assistant.io\/docs\/automation\/trigger\/\">Home Assistant: Automation triggers<\/a><\/li><li><a href=\"https:\/\/www.home-assistant.io\/integrations\/recorder\/\">Home Assistant: Recorder<\/a><\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>An LD2450 zone is defined in sensor coordinates. A version-checked ESPHome example, measured bounds and a separate occupancy hold time make the setup reproducible; stationary targets, reflections and communication failures still need practical tests.<\/p>\n","protected":false},"author":1,"featured_media":24175,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[92624],"tags":[91591,91365,91626,91219],"class_list":["post-13035","post","type-post","status-publish","format-standard","hentry","category-tutorials-en-smart-home","tag-esphome","tag-home-assistant","tag-smart-home-de","tag-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Fixing the coordinate origin, measuring zone bounds instead of guessing them, and turning a zone into an automation that does not flicker.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Fixing the coordinate origin, measuring zone bounds instead of guessing them, and turning a zone into an automation that does not flicker.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-15T05:35:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T11:04:34+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13035-radar-20261024-dark.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant\",\"datePublished\":\"2026-09-15T05:35:00+00:00\",\"dateModified\":\"2026-10-26T11:04:34+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/\"},\"wordCount\":1024,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13035-radar-20261024-dark.png\",\"keywords\":[\"ESPHome\",\"Home Assistant\",\"Smart Home\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/\",\"name\":\"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13035-radar-20261024-dark.png\",\"datePublished\":\"2026-09-15T05:35:00+00:00\",\"dateModified\":\"2026-10-26T11:04:34+00:00\",\"description\":\"Fixing the coordinate origin, measuring zone bounds instead of guessing them, and turning a zone into an automation that does not flicker.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13035-radar-20261024-dark.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-13035-radar-20261024-dark.png\",\"width\":1200,\"height\":630,\"caption\":\"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/smart-home\\\/tutorials-en-smart-home\\\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant | Lukas Wojcik","description":"Fixing the coordinate origin, measuring zone bounds instead of guessing them, and turning a zone into an automation that does not flicker.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/","og_locale":"en_US","og_type":"article","og_title":"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant | Lukas Wojcik","og_description":"Fixing the coordinate origin, measuring zone bounds instead of guessing them, and turning a zone into an automation that does not flicker.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-15T05:35:00+00:00","article_modified_time":"2026-10-26T11:04:34+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13035-radar-20261024-dark.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant","datePublished":"2026-09-15T05:35:00+00:00","dateModified":"2026-10-26T11:04:34+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/"},"wordCount":1024,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13035-radar-20261024-dark.png","keywords":["ESPHome","Home Assistant","Smart Home","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/","name":"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13035-radar-20261024-dark.png","datePublished":"2026-09-15T05:35:00+00:00","dateModified":"2026-10-26T11:04:34+00:00","description":"Fixing the coordinate origin, measuring zone bounds instead of guessing them, and turning a zone into an automation that does not flicker.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13035-radar-20261024-dark.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-13035-radar-20261024-dark.png","width":1200,"height":630,"caption":"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/smart-home\/tutorials-en-smart-home\/tutorial-setting-up-ld2450-radar-zones-in-esphome-and-home-assistant\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Tutorial: Setting Up LD2450 Radar Zones in ESPHome and Home Assistant"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13035","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=13035"}],"version-history":[{"count":5,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13035\/revisions"}],"predecessor-version":[{"id":26766,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/13035\/revisions\/26766"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/24175"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=13035"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=13035"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=13035"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}