DroneSense → TAK¶
Polls the DroneSense REST API and emits CoT to TAK Server for every active device in your missions: drones, operator phones with a streaming camera, and plain operators without video.
Read the Flows overview first
Every flow in the library requires a data-mode service account with at least one tak_* group assignment. If you haven't set that up yet, start with the overview.
What it emits¶
For each item returned by the API, per poll cycle, the CoT type is picked from the item's shape:
| Input | CoT type | Marker |
|---|---|---|
isDrone: true |
a-f-A-M-H-Q |
Rotary-wing UAV |
isDrone: false, any sensor has rtsp_url |
a-f-G-E-S |
Ground sensor with video |
isDrone: false, no video |
a-f-G-U-C |
Ground unit |
All three emit:
- Platform event at the item's GPS position. Callsign =
<Mission> // <callSign>. <track>with course/speed (speed clamped to 0 if DroneSense reports its-1sentinel for devices without a reliable speed reading).<__video>element — empty<__video/>when no sensor is streaming, or populated withsensor/spi/urlattributes plus a nested<ConnectionEntry>when at least one sensor has an RTSP URL. Stop emitting the URL (sensor goes offline) and the next frame clears it; WinTAK tears down its player.
Drones additionally emit:
- SPI event —
b-m-p-s-p-iatspoiLat/spoiLng(the camera's ground intersection) when DroneSense provides it. Carries a<link>back-reference to the platform uid — WinTAK uses this to draw the sensor line from platform to SPI.
Stale time is time + 10s by default (configurable — see below). DroneSense-specific fields that aren't available (attitude, FOV, range, platform serial, home position) are not emitted; nothing is faked.
Video proxy¶
DroneSense video streams use rtsps:// (RTSP over TLS) with self-signed certificates that most TAK clients can't validate. The flow registers each active stream as a MediaMTX proxy path so TAK clients connect to a plain rtsp:// URL on your server:
DroneSense RTSPS → MediaMTX proxy → rtsp://<your-server>:8554/ds/<sensor-id>?tcp
TLS fingerprints are fetched on first contact with each DroneSense video server and cached in Node-RED flow context — no manual fingerprint configuration required.
The flow continuously reconciles these proxy paths against the DroneSense API: because DroneSense rotates each stream's relay endpoint per session, the flow updates the MediaMTX source when it changes and removes the path when the sensor goes offline.
DroneSense streams inherit MediaMTX's pathDefaults, so enabling video recording captures them automatically. Files land under recordings/ds/<sensor-id>/.
Stream start/stop semantics¶
There is no separate stream-stop CoT. When a sensor's rtsp_url disappears from the DroneSense response, the next platform frame emits <__video/> empty. WinTAK diffs frame-to-frame and tears down its player accordingly.
Install¶
Using the sample account name svc_nodered throughout — substitute your
actual account name where shown.
Before you start¶
Make sure you've done the Flows overview prerequisites:
at least one data-mode service account exists in the FastTAK dashboard with
the tak_* groups this flow should publish to.
1. Import the flow¶
- Open Node-RED.
- Click ☰ (top right) → Import → Local tab.
- Expand the fasttak folder and click dronesense.
- Click Import. A DroneSense UAS tab appears.
2. Configure the TLS node¶
- Click ☰ → Configuration nodes.
- Under tls-config, double-click DroneSense Server TLS (this is
distinct from the shared
FastTAK Server TLS— leave that one alone). - Check the box "Use key or certificate from local file". The cert and key fields change to plain text inputs.
- The Client Certificate and Client Key fields are pre-filled with a
template path —
/data/certs/{svc_user}.cert.pemand.key.pem. Replace{svc_user}with your account's username (e.g., forsvc_noderedthe cert path becomes/data/certs/svc_nodered.cert.pem). CA Certificate stays at/opt/tak/certs/ca.pem. - Leave Server Name at
${SERVER_ADDRESS}— Node-RED resolves it from your.envon every flow load. - Click Update.
3. Add your DroneSense API keys¶
- On the DroneSense UAS tab, double-click the Missions change node.
-
Replace the default value with your API keys:
[ { "name": "Structure Fire", "key": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }, { "name": "Search & Rescue", "key": "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" } ]nameshows as a prefix on the TAK map (e.g.,Structure Fire // DRONE-1). -
Click Done.
4. Deploy¶
Click the red Deploy button at the top right. The first poll fires within a second. Open WinTAK/ATAK to see your drones appear.
Config¶
Environment variables available to the nodered container:
| Variable | Default | Purpose |
|---|---|---|
SERVER_ADDRESS |
localhost |
Public hostname/IP of your TAK Server. Already set from .env via docker-compose.yml. Used in the RTSP proxy URL advertised to clients. |
DRONESENSE_STALE_SECONDS |
10 |
How long WinTAK keeps a marker alive between polls. Should be > poll interval. Add to the nodered service's environment: block in docker-compose.yml to override. |
Poll interval is the Inject node's repeat value (default 5s). Edit the node if you need a different cadence.
Verify¶
After deploy, watch the reconcile activity:
docker compose logs -f nodered | grep 'ds:'
You should see ds: registered ds/<id> when a sensor starts streaming, ds: replaced
(endpoint rotated) ds/<id> when DroneSense issues a new session endpoint, and ds:
deleted ds/<id> (offline) when it stops. In WinTAK, drones appear with their callsign;
when a sensor starts streaming, the <__video> populates and a video button becomes
available on the marker.
Files¶
nodered/flows-library/dronesense.json— the flow (importable).