UNPKG

signalk-server

Version:

An implementation of a [Signal K](http://signalk.org) server for boats.

366 lines (352 loc) 126 kB
<!DOCTYPE html><html class="default" lang="en" data-base="../../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>Radar API | Signal K</title><meta name="description" content="Documentation for Signal K"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../../assets/style.css?cache=1783009712609"/><link rel="stylesheet" href="../../assets/highlight.css?cache=1783009712609"/><script defer src="../../assets/main.js?cache=1783009712609"></script><script async src="../../assets/icons.js?cache=1783009712609" id="tsd-icons-script"></script><script async src="../../assets/search.js?cache=1783009712609" id="tsd-search-script"></script><script async src="../../assets/navigation.js?cache=1783009712609" id="tsd-nav-script"></script><script async src="../../assets/hierarchy.js?cache=1783009712609" id="tsd-hierarchy-script"></script><link rel="stylesheet" href="../../assets/theme.css"/><script>if(window.self!==window.top){document.documentElement.classList.add('embedded')}</script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../../index.html" class="title"><img class="title-logo" src="../../assets/logo.svg" alt="Signal K"/><svg class="title-home-icon" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-label="Documentation home"><path d="M3 9l9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z"></path><polyline points="9 22 9 12 15 12 15 22"></polyline></svg></a><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../../assets/icons.svg#icon-search"></use></svg><span class="visible@s">Search</span></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><div id="tsd-toolbar-links"><a href="https://discord.gg/uuZrwz4dCS" target="_blank" rel="noopener" class="toolbar-icon visible@s" aria-label="Discord"><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"><path d="M524.5 69.8a1.5 1.5 0 0 0 -.8-.7A485.1 485.1 0 0 0 404.1 32a1.8 1.8 0 0 0 -1.9 .9 337.5 337.5 0 0 0 -14.9 30.6 447.8 447.8 0 0 0 -134.4 0 309.5 309.5 0 0 0 -15.1-30.6 1.9 1.9 0 0 0 -1.9-.9A483.7 483.7 0 0 0 116.1 69.1a1.7 1.7 0 0 0 -.8 .7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 0 0 .8 1.4A487.7 487.7 0 0 0 176 479.9a1.9 1.9 0 0 0 2.1-.7A348.2 348.2 0 0 0 208.1 430.4a1.9 1.9 0 0 0 -1-2.6 321.2 321.2 0 0 1 -45.9-21.9 1.9 1.9 0 0 1 -.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8 0 0 1 1.9-.3c96.2 43.9 200.4 43.9 295.5 0a1.8 1.8 0 0 1 1.9 .2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9 0 0 1 -.2 3.1 301.4 301.4 0 0 1 -45.9 21.8 1.9 1.9 0 0 0 -1 2.6 391.1 391.1 0 0 0 30 48.8 1.9 1.9 0 0 0 2.1 .7A486 486 0 0 0 610.7 405.7a1.9 1.9 0 0 0 .8-1.4C623.7 277.6 590.9 167.5 524.5 69.8zM222.5 337.6c-29 0-52.8-26.6-52.8-59.2S193.1 219.1 222.5 219.1c29.7 0 53.3 26.8 52.8 59.2C275.3 311 251.9 337.6 222.5 337.6zm195.4 0c-29 0-52.8-26.6-52.8-59.2S388.4 219.1 417.9 219.1c29.7 0 53.3 26.8 52.8 59.2C470.7 311 447.5 337.6 417.9 337.6z"></path></svg></a><a href="https://github.com/SignalK/signalk-server" target="_blank" rel="noopener" class="toolbar-icon visible@s" aria-label="Discord"><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3 .3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5 .3-6.2 2.3zm44.2-1.7c-2.9 .7-4.9 2.6-4.6 4.9 .3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3 .7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3 .3 2.9 2.3 3.9 1.6 1 3.6 .7 4.3-.7 .7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3 .7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3 .7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"></path></svg></a><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="../../Developing.html">Developing</a></li><li><a href="../REST_APIs.html">REST APIs</a></li><li><a href="" aria-current="page">Radar API</a></li></ul></div><div class="tsd-panel tsd-typography"><h1 id="radar-api" class="tsd-anchor-link">Radar API<a href="#radar-api" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h1> <p>The Signal K server Radar API provides a unified interface for viewing and controlling marine radar equipment from any manufacturer. The API is <strong>(web)app-friendly</strong>: clients can build dynamic UIs that automatically adapt to any radar's capabilities without hardcoding support for specific brands or models.</p> <p>This is version v3.1.0 of the API. The version will use semver for version updates.</p> <p>Radar functionality is provided by &quot;provider plugins&quot; that handle the interaction with radar hardware and stream spoke data to connected clients.</p> <p>Requests to the Radar API are made to HTTP REST endpoints rooted at <code>/signalk/v2/api/vessels/self/radars</code> or the Signal K websocket stream at <code>/signalk/v1/stream</code>.</p> <p>Like <code>signalk-server</code> vis-a-vis the Signal K specification there is a reference implementation for this API, which may very well remain the only implementation of the server side of the API, at <a href="https://github.com/MarineYachtRadar/mayara-server">https://github.com/MarineYachtRadar/mayara-server</a>. However, like Signal K itself, there is no reason it needs to remain the only implementation. In particular it would be ultra cool if some manufacturer of marine hardware would implement this API -- even though this is very unlikely.</p> <h2 id="design-philosophy-capabilities-driven-api" class="tsd-anchor-link">Design Philosophy: Capabilities-Driven API<a href="#design-philosophy-capabilities-driven-api" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <p>This API uses a <strong>self-describing schema</strong> pattern that benefits both radar provider developers and client/chartplotter developers.</p> <h3 id="for-clientchartplotter-developers" class="tsd-anchor-link">For Client/Chartplotter Developers<a href="#for-clientchartplotter-developers" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h3> <p>Build a <strong>single, adaptive UI</strong> that works with any radar—now and in the future—without hardcoding brand-specific logic.</p> <p><strong>How it works:</strong></p> <ol> <li><strong>Fetch capabilities once</strong> when a radar connects — this tells you what the radar can do</li> <li><strong>Generate UI widgets from the schema:</strong> <ul> <li><code>dataType: &quot;number&quot;</code> → Slider with min/max/step</li> <li><code>dataType: &quot;enum&quot;</code> with <code>descriptions</code> → Dropdown or button group</li> <li><code>dataType: &quot;string&quot;</code> → Text input field</li> <li><code>dataType: &quot;button&quot;</code> → Action button</li> <li><code>dataType: &quot;sector&quot;</code> → Angle range selector (start/end angles)</li> <li><code>dataType: &quot;zone&quot;</code> → Guard zone editor (angles + distances)</li> <li><code>dataType: &quot;rect&quot;</code> → Rectangular exclusion zone (two corners + width)</li> <li><code>isReadOnly: true</code> → Display-only label</li> </ul> </li> <li><strong>Subscribe to updates for current values</strong> — the schema tells you what to expect</li> <li><strong>Connect to websocket for spoke data</strong> - receive the binary spoke data stream</li> </ol> <p><strong>Example: Rendering a Gain Control</strong></p> <pre><code class="shell"><span class="hl-5">$</span><span class="hl-0"> </span><span class="hl-4">curl</span><span class="hl-0"> </span><span class="hl-2">-s</span><span class="hl-0"> </span><span class="hl-4">http://10.56.0.1:6502/signalk/v2/api/vessels/self/radars/nav1034A/capabilities</span><span class="hl-0"> </span><span class="hl-1">|</span><span class="hl-0"> </span><span class="hl-5">jq</span><span class="hl-0"> </span><span class="hl-4">&#39;.controls.gain&#39;</span><br/><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-5">&quot;category&quot;</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-4">&quot;base&quot;,</span><br/><span class="hl-0"> </span><span class="hl-5">&quot;dataType&quot;</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-4">&quot;number&quot;,</span><br/><span class="hl-0"> </span><span class="hl-5">&quot;description&quot;</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-4">&quot;How sensitive the radar is to returning echoes&quot;,</span><br/><span class="hl-0"> </span><span class="hl-5">&quot;hasAuto&quot;</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-2">true</span><span class="hl-4">,</span><br/><span class="hl-0"> </span><span class="hl-5">&quot;hasAutoAdjustable&quot;</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-2">false</span><span class="hl-4">,</span><br/><span class="hl-0"> </span><span class="hl-5">&quot;id&quot;</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-4">4,</span><br/><span class="hl-0"> </span><span class="hl-5">&quot;maxValue&quot;</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-4">100.0,</span><br/><span class="hl-0"> </span><span class="hl-5">&quot;minValue&quot;</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-4">0.0,</span><br/><span class="hl-0"> </span><span class="hl-5">&quot;name&quot;</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-4">&quot;Gain&quot;,</span><br/><span class="hl-0"> </span><span class="hl-5">&quot;stepValue&quot;</span><span class="hl-2">:</span><span class="hl-0"> </span><span class="hl-2">1.0</span><br/><span class="hl-0">}</span><br/><span class="hl-5">$</span><span class="hl-0"> </span><span class="hl-4">curl</span><span class="hl-0"> </span><span class="hl-2">-s</span><span class="hl-0"> </span><span class="hl-4">http://10.56.0.1:6502/signalk/v2/api/vessels/self/radars/nav1034A/controls/gain</span><br/><span class="hl-0">{</span><span class="hl-5">&quot;auto&quot;</span><span class="hl-5">:false,</span><span class="hl-5">&quot;value&quot;</span><span class="hl-5">:58}</span> </code><button type="button">Copy</button></pre> <p>Your UI renders:</p> <ul> <li>Mode toggle: <code>[Auto] [Manual]</code></li> <li>Value slider: <code>0 ----[58]---- 100</code> (disabled or hidden when mode=auto)</li> </ul> <p>Whether it's a Furuno DRS4D-NXT with 20, a Navico HALO with 40 controls or a basic radar with 5 controls, the same client code handles both.</p> <h3 id="for-radar-provider-developers-plugin-authors" class="tsd-anchor-link">For Radar Provider Developers (Plugin Authors)<a href="#for-radar-provider-developers-plugin-authors" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h3> <p>Different manufacturers have vastly different hardware capabilities, control sets, value ranges, and operating modes. Instead of clients hardcoding knowledge about each model, your provider plugin <strong>declares</strong> what the radar can do:</p> <ol> <li><strong>Capabilities</strong> — hardware capabilities (Doppler, dual-range, no-transmit zones, supported ranges)</li> <li><strong>Controls</strong> — schema for each control (type, valid values, modes, read-only status)</li> </ol> <h2 id="control-categories" class="tsd-anchor-link">Control Categories<a href="#control-categories" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <table> <thead> <tr> <th>Category</th> <th>Description</th> <th>Examples</th> </tr> </thead> <tbody> <tr> <td><code>base</code></td> <td>Available on all radars</td> <td>power, range, gain, sea, rain</td> </tr> <tr> <td><code>targets</code></td> <td>Target tracking settings</td> <td>targetExpansion, targetTrails</td> </tr> <tr> <td><code>guardZones</code></td> <td>Guard zone configuration</td> <td>guardZone1, guardZone2</td> </tr> <tr> <td><code>trails</code></td> <td>Trail display settings</td> <td>trailsTime, clearTrails</td> </tr> <tr> <td><code>advanced</code></td> <td>Model-specific features</td> <td>dopplerMode, beamSharpening, interferenceRejection</td> </tr> <tr> <td><code>installation</code></td> <td>Setup/configuration settings</td> <td>antennaHeight, bearingAlignment, noTransmitSector1</td> </tr> <tr> <td><code>info</code></td> <td>Read-only information</td> <td>serialNumber, firmwareVersion, transmitTime</td> </tr> </tbody> </table> <p>Read-only information (serialNumber, firmwareVersion, operatingHours) is exposed as controls with <code>isReadOnly: true</code>. Some controls are <strong>dynamically</strong> read-only when a particular mode is set. This is handled with an optional <code>allowed: &lt;bool&gt;</code> field in the control value.</p> <p>Some further considerations as how to show controls:</p> <ul> <li>Within each category, all controls have a numeric <code>id</code> field which may be used for ordering.</li> <li>The <code>advanced</code> and especially the <code>installation</code> categories could be shown in a different panel.</li> <li>In particular the <code>installation</code> controls are typically configured once.</li> <li>The <code>power</code> and <code>range</code> controls are used often and should be easy to be controlled.</li> <li>The <code>gain</code>, <code>sea</code> and <code>rain</code> controls are usually represented graphically on a PPI window.</li> </ul> <h2 id="api-overview" class="tsd-anchor-link">API Overview<a href="#api-overview" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <pre><code class="text">/signalk/v2/api/vessels/self/radars ├── GET → List all active radars ├── /interfaces │ └── GET → List network interfaces and listener status └── /{radar_id} ├── /capabilities GET → Get radar capabilities and control definitions ├── /controls │ ├── GET → Get all control values │ └── /{control_id} │ ├── GET → Get single control value │ └── PUT → Set single control value ├── /spokes → WebSocket (spoke data in binary format) └── /targets ├── GET → List tracked targets ├── POST → Acquire target manually └── /{target_id} └── DELETE → Cancel target tracking /signalk/v1/stream → WebSocket (control values and targets for all radars) </code><button type="button">Copy</button></pre> <h2 id="rest-api" class="tsd-anchor-link">REST API<a href="#rest-api" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h2> <h3 id="listing-all-radars" class="tsd-anchor-link">Listing All Radars<a href="#listing-all-radars" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h3> <p>Retrieve all available radars with their current info:</p> <pre><code class="text">HTTP GET &quot;/signalk/v2/api/vessels/self/radars&quot; </code><button type="button">Copy</button></pre> <p><em>Response:</em></p> <pre><code class="json"><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;nav1034A&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;brand&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Navico&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;model&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;HALO&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;name&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;HALO 034A&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;radarIpAddress&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;192.168.1.50&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;spokeDataUrl&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;ws://192.168.1.100:8080/signalk/v2/api/vessels/self/radars/nav1034A/spokes&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;streamUrl&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;ws://192.168.1.100:8080/signalk/v1/stream&quot;</span><br/><span class="hl-0"> },</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;nav1034B&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;brand&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Navico&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;model&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;HALO&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;name&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;HALO 034B&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;radarIpAddress&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;192.168.1.50&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;spokeDataUrl&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;ws://192.168.1.100:8080/signalk/v2/api/vessels/self/radars/nav1034B/spokes&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;streamUrl&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;ws://192.168.1.100:8080/signalk/v1/stream&quot;</span><br/><span class="hl-0"> }</span><br/><span class="hl-0">}</span> </code><button type="button">Copy</button></pre> <h3 id="network-interfaces" class="tsd-anchor-link">Network Interfaces<a href="#network-interfaces" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h3> <p>Check which network interfaces are available and which radar brands are listening:</p> <pre><code class="text">HTTP GET &quot;/signalk/v2/api/vessels/self/radars/interfaces&quot; </code><button type="button">Copy</button></pre> <p><em>Response:</em></p> <pre><code class="json"><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;brands&quot;</span><span class="hl-0">: [</span><span class="hl-4">&quot;Navico&quot;</span><span class="hl-0">, </span><span class="hl-4">&quot;Furuno&quot;</span><span class="hl-0">, </span><span class="hl-4">&quot;Raymarine&quot;</span><span class="hl-0">],</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;interfaces&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;en0&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;status&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Ok&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;ip&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;192.168.1.100&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;netmask&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;255.255.255.0&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;listeners&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;Navico&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Active&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;Furuno&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;No match for 172.31.255.255&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;Raymarine&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Listening&quot;</span><br/><span class="hl-0"> }</span><br/><span class="hl-0"> },</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;en1&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;status&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;WirelessIgnored&quot;</span><br/><span class="hl-0"> }</span><br/><span class="hl-0"> }</span><br/><span class="hl-0">}</span> </code><button type="button">Copy</button></pre> <p>This endpoint is useful for diagnosing network configuration issues when radars are not being detected.</p> <h3 id="getting-radar-capabilities" class="tsd-anchor-link">Getting Radar Capabilities<a href="#getting-radar-capabilities" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h3> <p>The capability manifest describes everything a radar can do. Clients should fetch this at the beginning of a session. The contents do not change during radar operation.</p> <pre><code class="text">HTTP GET &quot;/signalk/v2/api/vessels/self/radars/{radar_id}/capabilities&quot; </code><button type="button">Copy</button></pre> <p><em>Response:</em></p> <pre><code class="json"><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;maxRange&quot;</span><span class="hl-0">: </span><span class="hl-2">74080</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;minRange&quot;</span><span class="hl-0">: </span><span class="hl-2">50</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;supportedRanges&quot;</span><span class="hl-0">: [</span><br/><span class="hl-0"> </span><span class="hl-2">50</span><span class="hl-0">, </span><span class="hl-2">75</span><span class="hl-0">, </span><span class="hl-2">100</span><span class="hl-0">, </span><span class="hl-2">250</span><span class="hl-0">, </span><span class="hl-2">500</span><span class="hl-0">, </span><span class="hl-2">750</span><span class="hl-0">, </span><span class="hl-2">1000</span><span class="hl-0">, </span><span class="hl-2">1500</span><span class="hl-0">, </span><span class="hl-2">2000</span><span class="hl-0">, </span><span class="hl-2">3000</span><span class="hl-0">, </span><span class="hl-2">4000</span><span class="hl-0">, </span><span class="hl-2">6000</span><span class="hl-0">, </span><span class="hl-2">8000</span><span class="hl-0">, </span><span class="hl-2">12000</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-2">16000</span><span class="hl-0">, </span><span class="hl-2">24000</span><span class="hl-0">, </span><span class="hl-2">36000</span><span class="hl-0">, </span><span class="hl-2">48000</span><span class="hl-0">, </span><span class="hl-2">64000</span><span class="hl-0">, </span><span class="hl-2">74080</span><br/><span class="hl-0"> ],</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;spokesPerRevolution&quot;</span><span class="hl-0">: </span><span class="hl-2">2048</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;maxSpokeLength&quot;</span><span class="hl-0">: </span><span class="hl-2">1024</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;pixelValues&quot;</span><span class="hl-0">: </span><span class="hl-2">16</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;hasDoppler&quot;</span><span class="hl-0">: </span><span class="hl-2">true</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;hasDualRadar&quot;</span><span class="hl-0">: </span><span class="hl-2">false</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;hasDualRange&quot;</span><span class="hl-0">: </span><span class="hl-2">true</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;hasSparseSpokes&quot;</span><span class="hl-0">: </span><span class="hl-2">false</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;noTransmitSectors&quot;</span><span class="hl-0">: </span><span class="hl-2">2</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;controls&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;gain&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;id&quot;</span><span class="hl-0">: </span><span class="hl-2">4</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;name&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Gain&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;description&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;How sensitive the radar is to returning echoes&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;category&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;base&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;dataType&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;number&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;minValue&quot;</span><span class="hl-0">: </span><span class="hl-2">0.0</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;maxValue&quot;</span><span class="hl-0">: </span><span class="hl-2">100.0</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;stepValue&quot;</span><span class="hl-0">: </span><span class="hl-2">1.0</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;hasAuto&quot;</span><span class="hl-0">: </span><span class="hl-2">true</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;hasAutoAdjustable&quot;</span><span class="hl-0">: </span><span class="hl-2">false</span><br/><span class="hl-0"> }</span><br/><span class="hl-0"> },</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;legend&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;lowReturn&quot;</span><span class="hl-0">: </span><span class="hl-2">1</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;mediumReturn&quot;</span><span class="hl-0">: </span><span class="hl-2">8</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;strongReturn&quot;</span><span class="hl-0">: </span><span class="hl-2">13</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;targetBorder&quot;</span><span class="hl-0">: </span><span class="hl-2">17</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;dopplerApproaching&quot;</span><span class="hl-0">: </span><span class="hl-2">18</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;dopplerReceding&quot;</span><span class="hl-0">: </span><span class="hl-2">19</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;historyStart&quot;</span><span class="hl-0">: </span><span class="hl-2">20</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;pixelColors&quot;</span><span class="hl-0">: </span><span class="hl-2">16</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;pixels&quot;</span><span class="hl-0">: [</span><br/><span class="hl-0"> { </span><span class="hl-3">&quot;type&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;normal&quot;</span><span class="hl-0">, </span><span class="hl-3">&quot;color&quot;</span><span class="hl-0">: { </span><span class="hl-3">&quot;r&quot;</span><span class="hl-0">: </span><span class="hl-2">0</span><span class="hl-0">, </span><span class="hl-3">&quot;g&quot;</span><span class="hl-0">: </span><span class="hl-2">0</span><span class="hl-0">, </span><span class="hl-3">&quot;b&quot;</span><span class="hl-0">: </span><span class="hl-2">0</span><span class="hl-0">, </span><span class="hl-3">&quot;a&quot;</span><span class="hl-0">: </span><span class="hl-2">0</span><span class="hl-0"> } },</span><br/><span class="hl-0"> { </span><span class="hl-3">&quot;type&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;normal&quot;</span><span class="hl-0">, </span><span class="hl-3">&quot;color&quot;</span><span class="hl-0">: { </span><span class="hl-3">&quot;r&quot;</span><span class="hl-0">: </span><span class="hl-2">0</span><span class="hl-0">, </span><span class="hl-3">&quot;g&quot;</span><span class="hl-0">: </span><span class="hl-2">0</span><span class="hl-0">, </span><span class="hl-3">&quot;b&quot;</span><span class="hl-0">: </span><span class="hl-2">51</span><span class="hl-0">, </span><span class="hl-3">&quot;a&quot;</span><span class="hl-0">: </span><span class="hl-2">255</span><span class="hl-0"> } }</span><br/><span class="hl-0"> ]</span><br/><span class="hl-0"> }</span><br/><span class="hl-0">}</span> </code><button type="button">Copy</button></pre> <p>Capability fields:</p> <ol> <li><code>hasDoppler</code> - if true, the radar can detect boats or objects approaching or receding and emits separate pixel colors for these.</li> <li><code>hasDualRadar</code> - if true, the physical radome reports itself as two independent radars that can be set to different ranges and modes. Currently only Navico 4G and HALO support this.</li> <li><code>hasDualRange</code> - mutually exclusive with <code>hasDualRadar</code>, indicates a more limited form of supporting two ranges with one device.</li> <li><code>minRange</code> and <code>maxRange</code> - define what ranges the radar supports (in meters).</li> <li><code>supportedRanges</code> - list of all discrete range values the radar supports (in meters).</li> <li><code>maxSpokeLength</code> and <code>spokesPerRevolution</code> - define how many pixels the radar produces each revolution.</li> <li><code>noTransmitSectors</code> - how many sectors the radar can stop transmitting to avoid obstacles like masts.</li> <li><code>pixelValues</code> - number of distinct pixel intensity values.</li> <li><code>hasSparseSpokes</code> - if true, the radar produces fewer spokes per revolution than <code>spokesPerRevolution</code> indicates (see <a href="#spoke-skipping">Spoke skipping</a>).</li> </ol> <h3 id="legend" class="tsd-anchor-link">Legend<a href="#legend" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h3> <p>All spokes are sent with one byte per pixel. The legend explains what each byte value represents.</p> <pre><code class="json"><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;lowReturn&quot;</span><span class="hl-0">: </span><span class="hl-2">1</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;mediumReturn&quot;</span><span class="hl-0">: </span><span class="hl-2">8</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;strongReturn&quot;</span><span class="hl-0">: </span><span class="hl-2">13</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;dopplerApproaching&quot;</span><span class="hl-0">: </span><span class="hl-2">18</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;dopplerReceding&quot;</span><span class="hl-0">: </span><span class="hl-2">19</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;historyStart&quot;</span><span class="hl-0">: </span><span class="hl-2">20</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;pixelColors&quot;</span><span class="hl-0">: </span><span class="hl-2">16</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;pixels&quot;</span><span class="hl-0">: [</span><br/><span class="hl-0"> { </span><span class="hl-3">&quot;type&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;normal&quot;</span><span class="hl-0">, </span><span class="hl-3">&quot;color&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;#00000000&quot;</span><span class="hl-0"> },</span><br/><span class="hl-0"> { </span><span class="hl-3">&quot;type&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;normal&quot;</span><span class="hl-0">, </span><span class="hl-3">&quot;color&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;#0000ffff&quot;</span><span class="hl-0"> },</span><br/><span class="hl-0"> { </span><span class="hl-3">&quot;type&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;dopplerApproaching&quot;</span><span class="hl-0">, </span><span class="hl-3">&quot;color&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;#ff00ffff&quot;</span><span class="hl-0"> },</span><br/><span class="hl-0"> { </span><span class="hl-3">&quot;type&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;dopplerReceding&quot;</span><span class="hl-0">, </span><span class="hl-3">&quot;color&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;#00ff00ff&quot;</span><span class="hl-0"> },</span><br/><span class="hl-0"> { </span><span class="hl-3">&quot;type&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;history&quot;</span><span class="hl-0">, </span><span class="hl-3">&quot;color&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;#454545ff&quot;</span><span class="hl-0"> }</span><br/><span class="hl-0"> ]</span><br/><span class="hl-0">}</span> </code><button type="button">Copy</button></pre> <p>The <code>lowReturn</code>, <code>mediumReturn</code>, and <code>strongReturn</code> indicate offsets in the array, typically used for smoothing algorithms.</p> <p>If the radar doesn't implement Doppler, the <code>dopplerApproaching</code> and <code>dopplerReceding</code> fields will be null. If the provider doesn't implement target trails, <code>historyStart</code> will be null.</p> <h3 id="dual-rangeradar" class="tsd-anchor-link">Dual range/radar<a href="#dual-rangeradar" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h3> <p>There are two different ways that radars handle &quot;dual&quot; ranges.</p> <p>Navico radars implement this by acting as if both radars are full independent, to the point where both radars use different ports and IP addresses. They can be seen to be dependent in that if you change some controls they also change on the other radar. The NoTransmitZones are examples of such controls. These radars therefore also show up as two radars in the API. As long as clients listen to updates to controls, which they should do anyway to be able to function in a setting where there is for instance a MFD device, they can assume that all controls can be set.</p> <p>Furuno radars do this in a way where the second range shares as many control settings as possible. Currently there is no support for Furuno dual range yet and its impact on the API is unknown.</p> <h3 id="controls" class="tsd-anchor-link">Controls<a href="#controls" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../../assets/icons.svg#icon-anchor"></use></svg></a></h3> <p>The <code>controls</code> object in capabilities lists all controls the radar supports. Control data types:</p> <table> <thead> <tr> <th>dataType</th> <th>Description</th> </tr> </thead> <tbody> <tr> <td>number</td> <td>Numeric value with min/max/step</td> </tr> <tr> <td>enum</td> <td>Discrete set of values with descriptions</td> </tr> <tr> <td>string</td> <td>Text value</td> </tr> <tr> <td>button</td> <td>Action trigger (no value)</td> </tr> <tr> <td>sector</td> <td>Angle range (start/end)</td> </tr> <tr> <td>zone</td> <td>Guard zone (angles + distances)</td> </tr> <tr> <td>rect</td> <td>Rectangular exclusion zone</td> </tr> </tbody> </table> <ol> <li><strong>number</strong></li> </ol> <pre><code class="json"><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;id&quot;</span><span class="hl-0">: </span><span class="hl-2">47</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;name&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Transmit time&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;description&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;How long the radar has been transmitting over its lifetime&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;category&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;info&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;dataType&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;number&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;isReadOnly&quot;</span><span class="hl-0">: </span><span class="hl-2">true</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;minValue&quot;</span><span class="hl-0">: </span><span class="hl-2">0.0</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;maxValue&quot;</span><span class="hl-0">: </span><span class="hl-2">3599996400.0</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;stepValue&quot;</span><span class="hl-0">: </span><span class="hl-2">3600.0</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;units&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;s&quot;</span><br/><span class="hl-0">}</span> </code><button type="button">Copy</button></pre> <p>The <code>units</code> field indicates the unit of measurement for the control value. A conforming server implementation sends only SI units to clients:</p> <table> <thead> <tr> <th>Category</th> <th>SI Unit</th> <th>Abbreviation</th> </tr> </thead> <tbody> <tr> <td>Distance</td> <td>Meters</td> <td><code>m</code></td> </tr> <tr> <td>Speed</td> <td>Meters per second</td> <td><code>m/s</code></td> </tr> <tr> <td>Angle</td> <td>Radians</td> <td><code>rad</code></td> </tr> <tr> <td>Rotational speed</td> <td>Radians per second</td> <td><code>rad/s</code></td> </tr> <tr> <td>Duration</td> <td>Seconds</td> <td><code>s</code></td> </tr> </tbody> </table> <p>Note how in the above example the server has converted a value in hours (3600 seconds) to seconds to conform to the above, but the client can convert the value back to hours for representation to a human.</p> <p>A conforming API server will allow the following units to be specified when receiving values from a client:</p> <table> <thead> <tr> <th>Category</th> <th>Unit</th> <th>Abbreviation</th> </tr> </thead> <tbody> <tr> <td>Distance</td> <td>Meters</td> <td><code>m</code></td> </tr> <tr> <td>Distance</td> <td>Kilometers</td> <td><code>km</code></td> </tr> <tr> <td>Distance</td> <td>Nautical miles</td> <td><code>nm</code></td> </tr> <tr> <td>Speed</td> <td>Meters per second</td> <td><code>m/s</code></td> </tr> <tr> <td>Speed</td> <td>Knots</td> <td><code>kn</code></td> </tr> <tr> <td>Angle</td> <td>Radians</td> <td><code>rad</code></td> </tr> <tr> <td>Angle</td> <td>Degrees</td> <td><code>deg</code></td> </tr> <tr> <td>Rotational speed</td> <td>Radians per second</td> <td><code>rad/s</code></td> </tr> <tr> <td>Rotational speed</td> <td>Rotations/minute</td> <td><code>rpm</code></td> </tr> <tr> <td>Duration</td> <td>Seconds</td> <td><code>s</code></td> </tr> <tr> <td>Duration</td> <td>Minutes</td> <td><code>min</code></td> </tr> <tr> <td>Duration</td> <td>Hours</td> <td><code>h</code></td> </tr> </tbody> </table> <ol start="2"> <li><strong>enum</strong></li> </ol> <pre><code class="json"><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;id&quot;</span><span class="hl-0">: </span><span class="hl-2">0</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;name&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Power&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;description&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Radar operational state&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;category&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;base&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;dataType&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;enum&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;minValue&quot;</span><span class="hl-0">: </span><span class="hl-2">0.0</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;maxValue&quot;</span><span class="hl-0">: </span><span class="hl-2">3.0</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;stepValue&quot;</span><span class="hl-0">: </span><span class="hl-2">1.0</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;descriptions&quot;</span><span class="hl-0">: {</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;0&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Off&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;1&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Standby&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;2&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Transmit&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;3&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Preparing&quot;</span><br/><span class="hl-0"> },</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;validValues&quot;</span><span class="hl-0">: [</span><span class="hl-2">1</span><span class="hl-0">, </span><span class="hl-2">2</span><span class="hl-0">]</span><br/><span class="hl-0">}</span> </code><button type="button">Copy</button></pre> <p>The <code>validValues</code> array indicates which values can be set by clients. The <code>power</code> control guarantees that at least these values can be set across all radars: 1 (Standby) and 2 (Transmit).</p> <ol start="3"> <li><strong>string</strong></li> </ol> <pre><code class="json"><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;id&quot;</span><span class="hl-0">: </span><span class="hl-2">53</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;name&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Custom name&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;description&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;User defined name for the radar&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;category&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;advanced&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;dataType&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;string&quot;</span><br/><span class="hl-0">}</span> </code><button type="button">Copy</button></pre> <ol start="4"> <li><strong>button</strong></li> </ol> <p>A button triggers an action without needing a value:</p> <pre><code class="json"><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;id&quot;</span><span class="hl-0">: </span><span class="hl-2">15</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;name&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Clear trails&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;description&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;Clear target trails&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;category&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;trails&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;dataType&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;button&quot;</span><br/><span class="hl-0">}</span> </code><button type="button">Copy</button></pre> <ol start="5"> <li><strong>sector</strong></li> </ol> <pre><code class="json"><span class="hl-0">{</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;id&quot;</span><span class="hl-0">: </span><span class="hl-2">35</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;name&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;No Transmit sector&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;description&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;First no-transmit sector&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;category&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;installation&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;dataType&quot;</span><span class="hl-0">: </span><span class="hl-4">&quot;sector&quot;</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;hasEnabled&quot;</span><span class="hl-0">: </span><span class="hl-2">true</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;minValue&quot;</span><span class="hl-0">: </span><span class="hl-2">-3.141592653589793</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;maxValue&quot;</span><span class="hl-0">: </span><span class="hl-2">3.141592653589793</span><span class="hl-0">,</span><br/><span class="hl-0"> </span><span class="hl-3">&quot;stepValue&quot;</span><span class="hl-0">: </span><sp