FerusTracker
FerusTracker receives Smart Parks collar data for Dutch sites. It publishes no API documentation; the contract is the Node-RED flow that feeds it today, which the connector reproduces from canonical positions and measurements (decision D89).
What the flow sends
For every uplink of a known payload type the flow decodes the frame with the collar's own
JavaScript decoder and posts, without authentication, to
https://ferustracker.nl/api/smartparks:
{
"devEUI": "70B3D57ED0001234",
"fPort": 2,
"tags": {"payloadType": "opencollar_edge_6", "subType": ""},
"deviceName": "70B3D57ED0001234",
"objectJSON": "{\"latitude\":51.2,\"longitude\":5.7,\"altitude\":34.5}",
"provider": "kpn",
"site": "Kempen-Broek"
}
objectJSON is the decoded fields as a JSON string under the decoder's own names. Payload
types in the flow: opencollar_v2, opencollar_edge_2, opencollar_edge_4,
opencollar_edge_6, and without a decoder dragino_lgt92_v1, ideetron_hp_gps_v1,
opencollar_edge_cat_1_6.
Setup
- Under Integrate, Integrations: New integration, connector FerusTracker. Config:
url(the endpoint above by default),site(the site name FerusTracker files the data under),provider(kpnby default),payload_types(Smart Parks device type key to the payload type its decoder had in the flow) anddefault_payload_typefor unmapped devices. No credentials: the endpoint takes the documents as they are and recognises collars by DevEUI. - Test the connection: the connector only checks that the endpoint answers, since every document is data.
- Enable positions and measurements; events have no counterpart and are skipped.
Mapping
| Smart Parks Protect | FerusTracker document |
|---|---|
| position, OpenCollar Edge types | fPort 2, objectJSON with latitude, longitude, altitude, fix_timestamp (epoch seconds), SIV (satellites), h_acc_est (accuracy) |
position, opencollar_v2 |
fPort 1, objectJSON with latitude, longitude, alt, satellites, gps_time |
battery_voltage measurement |
fPort 4 with bat in millivolts (Edge) or fPort 12 with battery (v2) |
device_temperature or temperature measurement |
fPort 4 with temp (Edge) or fPort 12 with temperature (v2) |
| other measurements, events | skipped |
devEUI and deviceName are the device's primary identity (the flow sends the DevEUI for
both). One field beyond the flow: a top-level time (ISO 8601) with the record's time, since
the flow left the time to the receiver and backfilled deliveries would otherwise lose it.
Assumptions to confirm live
- FerusTracker reads
objectJSONbypayloadTypewith the decoder's field names, so a canonical position rendered under those names lands as a fix. - The
sitevalue the flow sets upstream (Tim knows the names in use). - Whether an unknown
timefield or a partial status message (battery without the other status fields) is accepted; if not, the connector narrows to what the platform takes.
Troubleshooting
ferustracker answered 4xx: the platform rejected the document; the message is in the delivery log. Check the payload type and the DevEUI is known there.- Positions arrive under the wrong time: FerusTracker ignores
timeandfix_timestamp; deliveries then carry the receive time, and backfills are not useful.