1Introduction
Puck Radar measures the distance to whatever is in front of it with a 60 GHz pulsed coherent radar, from 0.2 to 6.8 m with centimetre resolution, and reports it over LoRaWAN as a distance, a level or an occupied/vacant state. The radar needs no light, so it measures the same by day and by night. Typical jobs are parking bays, water levels in storm drains and wells, fill levels in tanks, silos and waste bins, and snow depth.
The housing is IP67, works from −30 to +80 °C, and has a replaceable 2,100 mAh battery. It comes with one of two lenses:
- Standard lens: a wide beam of about ±60°, 30 mm high, 38 g. For covering an area, such as a parking bay.
- Narrow lens: a focused beam of about ±10°, 45 mm high, 43 g. For a precise measurement at a distance, such as a water level in a well or the waste in a bin.
Two boards, two kinds of software
Inside Puck there are two circuit boards, each with its own processor:
- The radar board runs the radar firmware. It does the measuring: which radar method is used, how often, over what range and with what threshold. It has no VSM application.
- The LoRaWAN board runs the firmware and a VSM application. It handles the network, decides what to send and when, and also measures temperature and humidity inside the housing and scans for Wi-Fi.
Both boards can be configured over LoRaWAN. On site, the Hugin NFC app works with the LoRaWAN board, and the SweIoT Toolbox app talks to the radar board over Bluetooth. See Changing the settings.
It works with any LoRaWAN network server (LoRaWAN 1.0.4, class A, OTAA). What the LoRaWAN board sends, and when, is decided by an application running on Sensative’s Virtual Sensing Machine (VSM). This manual describes the application Puck-radar R31–R33, which can be configured, and replaced by a newer version, over the air or with NFC. Sensative can also offer alternative VSM applications for Puck; see Which application is in the sensor.
What’s in the box
- Puck Radar, with the battery fitted
- An adhesive for flat surfaces
The keys (DevEUI and AppKey) come with the delivery information. Mounting plates are sold separately, and a drilled hole needs none (see step 6).
Parts of the sensor
2Before you start
A LoRaWAN sensor needs a little more preparation than a sensor that pairs with a hub. Have this ready first:
You need
- A LoRaWAN gateway within range, powered on and online
- An account on a LoRaWAN network server (for example The Things Network, ChirpStack, Loriot or Actility), with the gateway added to it
- The keys for the sensor: its DevEUI and AppKey, from the delivery information. The JoinEUI is the same for all Puck and Square sensors:
70B3D52C0001D4C3. - An Android phone with NFC is recommended. It starts the sensor, and runs the two apps you use on site: Hugin (NFC, for the LoRaWAN board; needs an Yggio user account, with the sensor registered to your organisation) and SweIoT Toolbox (Bluetooth, for the radar board; free on Google Play). Both are for Android only, and with Puck they are a great help in setting the radar up correctly, especially for a new application. An iPhone can start the sensor with an NFC reading app (see Finding the NFC antennas), but cannot run the apps.
- A payload decoder for Sensative VSM sensors in your network server or application (see Decoding the messages)
- For a position: a cloud service that supports Wi-Fi positioning, for example Yggio
Choosing the place
- A clear view: nothing should stand between the radar and what it measures. Dirt, ice, water or objects on or in front of the lens weaken the echo or give a false one.
- Behind a cover: Puck can measure through a flat plastic plate, such as a lid, with only a small effect. The plate must not contain glass, metal or carbon. Check the readings before you fix a cover for good.
- Metal: mounting on metal is fine, but do not enclose Puck in metal: metal stops both the radio and the radar.
- Range: up to 10 km in open line of sight, much less from inside a well or a concrete structure. Check the signal at the final spot (step 4).
How the radar sees
- What reflects: metal, water and glass reflect strongly. Paper, plastic, cloth and people reflect more weakly, but are still seen. The shape matters as much as the material. A flat surface works like a mirror: it sends the echo back only from the point where it faces the radar square on, and if it is tilted, the echo goes away instead; that is how stealth ships hide. An uneven surface scatters echoes in many directions, so some always come back. An inside corner sends the echo straight back the way it came, which is how a radar reflector works.
- False echoes: the radar can also see side walls, the bottom of a well, the mounting, or a lid above the sensor, and echoes that bounce between them. Point the radar straight at the target, keep the beam clear of walls, and limit the range to where the target can be (see Radar methods).
- Still water is a mirror: point the radar straight down at a still surface, or tilt it only a few degrees. The beam is about ±10° wide, so with a small tilt part of it still meets the surface square on. A larger tilt reflects the beam away, like light in a mirror, and the echo is lost.
- Where the distance is measured from: the radar reference point lies 1.1 cm (standard lens) or 2.6 cm (narrow lens) below the front of Puck.
Which lens for which job
| Job | Lens | Where Puck goes |
|---|---|---|
| Parking bay | Standard, or narrow for a tight bay | 10–300 cm above the ground, above or in front of the bay |
| Water level in a well or storm drain | Narrow | Above the water, clear of the side walls, tilted a few degrees so that condensation runs off to the side |
| Fill level in a tank or silo, snow depth | Narrow | Above the surface, pointing straight down |
| Waste bin | Narrow | Above the bin looking down, or on a side wall looking across the top |
Finding the NFC antennas
NFC only reaches a couple of centimetres, so lay the phone flat on Puck, antenna over antenna:
- On Puck: in the middle of the top, right in front of the radar.
- On an Android phone (recommended): switch NFC on, and turn on vibration or a sound for NFC in the phone’s settings, so that the phone tells you as soon as it has found the sensor. The antenna is usually on the back, near the top, often close to the camera, but it varies between models: the phone’s manual or the maker’s website shows where it is. If you cannot find it, move the back of the phone slowly over the top of Puck until the phone vibrates.
- Take off the phone case: a protective case, especially a thick one or one with metal or a magnet, can make it hard to get NFC contact.
- Then hold it still: to start a join, keep the phone still on Puck for about 5 seconds. With the Hugin app, keep it there until the app has finished. If you move away too early, the connection breaks and you have to start again.
- On an iPhone: use an NFC reading app, such as NFC Reader & Scanner from the App Store. Open it and tap its NFC button, so that it shows Ready to Scan, then hold the top edge of the back of the iPhone still on top of Puck. The iPhone NFC join guide (PDF) shows each step with pictures.
3Step by step: from box to ready
8 steps. Register the sensor in the network server before you hold the phone to it. Then join it, set the radar for the job, and mount it last.
Unpack
Check Puck and find its keys. Check which lens it has (see Introduction). The sensor sleeps until it meets an NFC field.
Register the sensor in the network server
- Add a new end device in your network server, with activation OTAA.
- Use these LoRaWAN settings: MAC version 1.0.4, regional parameters RP002-1.0.3, max EIRP 14 dBm, and the frequency plan for your region.
- Enter the DevEUI and the AppKey from the delivery information, and the JoinEUI
70B3D52C0001D4C3. Check them carefully: one wrong character and the join fails. - Set up decoding of the messages (see Decoding the messages).
Join the network with NFC
Lay the phone flat on top of Puck and keep it still for about 5 seconds: that starts the join (see Finding the NFC antennas, also for iPhone).
Check the signal where it will sit
Put the sensor at the place where it will be mounted, and look at its messages in the network server: the join, and the first reports.
Choose the radar method and range
The radar measures only while Puck is joined. Check which radar method is active, and that it and its range fit the job and the place (see Radar methods). Then set when Puck reports: the distance step, the averages and the alarm levels (see What it reports).
How to change them: see Changing the settings and the worked examples.
Install
Choose one way:
- Adhesive, on a smooth, dry, flat surface of metal or plastic. Clean the surface with a mixture of isopropyl alcohol and water (50–70 % alcohol) and let it dry. Do not use the adhesive on oily surfaces, or below +5 °C.
- Mounting plate (sold separately): bond Puck to the plate with the plate’s adhesive ring, centred over the opening. Screw the plate to a wall or beam, or strap it to a pipe or post with cable ties through its slots.
- In a drilled hole, flush with a wall or ceiling: drill a 45 mm hole, clean it, and put a thick layer of sealant at the bottom. Set Puck in it, base down and lens out, and hold it straight while the sealant sets. Keep sealant and glue off the lens cap: it would disturb the radar and stop you from opening Puck to change the battery.
- In a well or storm drain: on a bracket or straps across the opening, pointing straight down at the water.
Test
Put something in front of the radar at a known distance, or wait for the first measurements of the real target.
test:10 makes the radar measure every 10 seconds for 10 minutes, so you can see the effect of the mounting at once. Send it from the Commands and Logs menu in SweIoT Toolbox, where you see every measurement, or over LoRaWAN on port 48, where it arrives after Puck’s next message and only changes larger than the Radar Distance Hysteresis are sent. If the distance is 0, wrong or jumps about, see Troubleshooting before you fix Puck for good.Ready
- Registered in the network server, with the JoinEUI and the right region
- Joined with NFC, and the messages are decoded
- Signal checked at the final spot: SF9 or better
- Radar method and range set for the job
- Mounted with a clear view of the target, reachable for NFC and the battery
- Distances arriving and matching the real distance
4Using the sensor
The radar board measures; the VSM application on the LoRaWAN board decides what to send. The settings named in bold are listed in the settings table and under Radar commands.
Radar methods
The radar board measures with one method at a time. This manual describes methods 3 to 8 of radar firmware 2.24. Each method has its own settings: how often it measures, the range, and how strong an echo must be to count. You choose the method and set it with radar commands (see Radar commands) or in SweIoT Toolbox.
| No. | Method | What it reports | Typical use | Default interval and range |
|---|---|---|---|---|
| 3 | Well | The most distant echo above the threshold: the surface. Closer echoes are ignored | Wells, storm drains, septic tanks, water level, snow depth | Every 300 s, 0.5–3.5 m |
| 4 | Bin | The closest echo above the threshold, and an occupied flag after 3 detections in a row | Waste bins and containers | Every 120 s, 0.15–1.15 m |
| 5 | Parking | The strongest echo, and occupied when its strength is 350 or more | Parking bays | Every 30 s, 0.2–1.7 m |
| 6 | Seating | The strongest echo, and occupied or free after a number of measurements in a row agree | Seats | Every 60 s, 0.24–1.24 m |
| 7 | Adv_Seating | Occupied or free, confirmed over several measurements; optionally wheelchair or other object | Seats in trains, buses and waiting areas, wheelchair spaces | Set for each installation |
| 8 | Distance2 | The distance and strength of one echo in each of two zones, each with its own threshold and choice of echo | General distance measuring, two targets | Every 300 s; zone 1 0.20–0.47 m, zone 2 0.50–0.60 m |
- Measurement interval: how often the radar measures. Measuring less often saves battery.
- Range: the start and length of the window the radar looks in, up to 6.8 m from the sensor. Keep it to where the target can be: a shorter window is more reliable and uses less battery.
- Threshold: how strong an echo must be to count. A lower threshold catches weaker echoes, and also more false ones.
- Averaging: several sweeps per measurement, combined as a median or an average, steady the reading in rain or snow and on moving water. Each extra sweep costs battery. So do more hardware samples per sweep (HWAAS).
Wells, water level and snow depth (method 3)
- Set the range so that it ends at least 10 cm above the bottom of the well, and so that the highest expected water level lies in its far half.
- Point Puck straight down at the water, or tilt it a few degrees, and place it so that the beam clears the side walls, and keep large reflecting objects, such as metal, away from around and above it.
- In a well, a slight tilt has a second benefit: condensation that forms on the lens runs off to the side instead of staying in front of the radar.
- Puck measures the distance down to the surface. Work out the level in your application: for a water level, the depth of the well minus the distance; for snow depth, the distance to the bare ground minus the distance to the snow.
- If the surface is not found (distance 0), lower the threshold. If the readings jump on ripples, take more sweeps or a longer pause between them.
- Adaptive range (off by default) lets the window follow the surface, so that the radar sweeps only a narrow band around it. That saves battery; if the level moves out of the band, Puck measures the full range again at once.
Waste bins (method 4)
- Mount Puck above the bin looking down, or on a side wall looking across the top. The range should reach the bottom of the empty bin.
- The threshold is the main setting. Soft waste, such as paper, reflects weakly and may need a lower threshold; metal reflects strongly. If the bin’s own walls or lid give echoes, raise the threshold, or start the range beyond them.
- The smaller the distance, the fuller the bin.
- For bins of every size, from litter bins and wheelie bins to large containers, the Distance2 method with two zones can also tell when the bottom is covered and when the bin is full: see the example below.
Parking (method 5)
- A parking bay counts as occupied when the strongest echo in the range is 350 or more. This level is fixed, so the mounting and the range must make a car give a strong echo, and an empty bay a weak one.
- Choose the lens by the width of the area to cover, and end the range where the car body can be, before the floor, kerb or ceiling beyond it.
- There is no filtering: if the echo hovers around 350, the state can flip. Adjust the mounting or the range.
- With send only changes switched on in the system settings, Puck reports only arrivals and departures, which saves battery (see Radar settings by position).
Seats (methods 6 and 7)
- Seating (6) changes between occupied and free only after a number of measurements in a row agree, 3 by default in each direction. Raise the threshold, or trim the range, if a chair back or table edge gives a false occupied.
- Adv_Seating (7) is an extended seating method for demanding occupancy uses: it filters out short events before the state changes, reports only when the state changes, and in wheelchair mode tells a wheelchair from another object, such as luggage.
Two distances (method 8)
- Each zone reports its own echo: the closest, the strongest or the farthest, as you choose. A zone with an end of 0 is switched off.
Example: a waste bin or container with two zones
With two zones, one Puck above a litter bin, a wheelie bin or a container can tell you three things. Say Puck sits 1.2 m above the bottom:
- Zone 1, from 0.2 m to just above the bottom (here 0.2–1.1 m), with the closest echo chosen: the distance to the top of the waste, so the fill level.
- Zone 2, a narrow zone around the bottom (here 1.15–1.25 m): as long as it has an echo, the bottom is still visible. When the echo is gone, the bottom is covered with waste.
- No echo in either zone: the radar sees nothing beyond 0.2 m. The waste has most likely reached closer than 0.2 m to Puck, and the bin is full. (Something covering the lens gives the same result, so check Puck if it happens in an empty bin.)
Set it with three radar commands, each sent as its own downlink on port 48: sys:8 selects method 8; 8:600,,,,,,0.2,1.1,,,0,1.15,1.25 measures every 10 minutes and sets zone 1 (positions 7 and 8), the closest echo (position 11) and zone 2 (positions 12 and 13); 8:,,,,,,,,,,,,,,,,0,0 switches off exclusion zone 1 (positions 17 and 18), so that it does not hide any part of zone 1. Zone 2 arrives as distance2 and amplitude2 (see Messages).
A new application: see what the radar sees
Before you set up a use that has not been done before, test it on site and find out what the radar actually sees: where the echoes come from, how strong they are, and how the beam is reflected by walls, fittings and the target itself. Two ways help:
- SweIoT Toolbox: on site, try the different methods and settings and watch the results directly (see SweIoT Toolbox).
- A scan over LoRaWAN: select method 7 or 8, and send
meth_cmd:2,start,end,sectionson port 48, with the start and end in metres. The radar answers on port 32 with the echo strength along the zone, as a list: for each section the strongest echo, divided by 10 (with 0 sections, every measuring point). For example,meth_cmd:2,0.5,2.5,40gives 40 values from 0.5 to 2.5 m, one every 5 cm. The list comes from the latest measurement. Methods 3 to 6 do not have the command.
Scans also let an IoT platform such as Yggio calibrate mounted Pucks automatically: it asks each Puck for a scan, finds the target and any fixed reflectors, works out the zones and thresholds, and sends them back as radar commands, repeating until the result is right.
What it reports
The VSM application on the LoRaWAN board takes each radar measurement and sends only what has changed:
- Distance and echo strength: sent when the distance has changed by more than the Radar Distance Hysteresis (10 cm by default), or the echo strength by more than the Radar Amplitude Hysteresis. In the Distance2 method, the echo in zone 2 is sent as well.
- Occupied: 1 or 0, from the methods that judge occupancy: Bin, Parking, Seating and Adv_Seating.
- Average distance: the distance is sampled every minute and averaged over the Average Distance Interval (24 hours by default). The average is sent when it has changed by more than the distance hysteresis.
- Distance alarms: set a Distance Alarm Low Level and a High Level, in metres from the sensor. The alarm follows the average distance, so it reacts no faster than the Average Distance Interval: shorten the interval when you use the alarm. 0 switches the low alarm off.
- No echo found: when a measurement finds no echo above the threshold, the Report Failed Measurements setting decides what happens. Off (the default), nothing is sent, and the last distance reported stands. On, Puck reports it as distance 0, so that you can tell, for example, that the target has gone out of range.
- Detection rate: once a day, the share of measurements that found an echo, in per cent. A drop can mean, for example, running water or heavy rain or snow that keeps the radar from a stable echo.
Temperature, humidity and battery
Every 8 hours by default (the periodic reports interval), Puck sends the battery voltage, the temperature and the humidity, with a counter that goes up by one each time.
- Inside the housing: the temperature and humidity are measured inside the sealed Puck, not in the air around it. The temperature is accurate to about ±2 °C between 0 and 30 °C, and can be adjusted with Temperature Calibration.
- Humidity as a warning: Puck has silica gel inside that takes up moisture. A humidity that keeps rising means moisture is getting in, or the silica gel is spent: see Maintenance.
- Battery: the voltage is measured during a radar measurement. A single low value is normal, and so is a lower voltage in the cold. If it stays below 2.8 V at temperatures above +10 °C, change the battery.
Position
Once a day, while joined, Puck scans for Wi-Fi access points and sends the result, so that a cloud service can give its position (see How Wi-Fi positioning works).
How Wi-Fi positioning works
- 2.4 GHz only: the radio scans only the 2.4 GHz band (2412–2484 MHz). Networks that broadcast only on 5 GHz are not seen.
- Passive: the sensor listens for nearby Wi-Fi access points (802.11 b/g/n) and records their MAC addresses and signal strength (RSSI). It does not connect to any network, needs no password and sends nothing over Wi-Fi. The addresses travel in the LoRaWAN uplink.
- How many: at least 2 access points are needed for a position, and more give a better one.
- The position: a cloud service that supports Wi-Fi positioning is needed for a position, for example Yggio (Munin and LoRa Cloud can also do this). It looks the addresses up in a database of mapped access points and returns the position.
- Accuracy: depends on how many known access points are around: typically 5–20 m indoors. With only one or two, expect the area rather than the room. Adding low-cost 2.4 GHz access points improves it.
- Wi-Fi only: Puck Radar has no satellite positioning.
Network
- Confirmed messages: the distance, echo strength, average, alarm, occupied state and detection rate are acknowledged by the network server, and Puck sends them again if no acknowledgement arrives, waiting at most the Max time between ReSend tries (4 hours by default) between tries.
- Joining: if Puck is not joined, it tries to join every 5 hours (Time between join retries), and at least once a day. An NFC touch starts a join attempt at once. The radar is switched off while Puck is not joined.
- Losing the network: Puck gives the network up and joins again if it has heard nothing from the network for the Time from last RX before unjoin (15 days by default), or for the Downlink Timeout (see Device registers).
- Roaming: with Roaming Network Count above 1, Puck tries several network identities in turn when it joins, by changing the last digit of its AppKey. Each extra identity costs time and battery when joining.
- Adaptive data rate: Puck sets its own data rate and transmit power (sensor ADR, not the network server’s ADR), and the application damps and limits those adjustments. This suits a sensor mounted in one place, where the radio conditions change slowly.
Decoding the messages
The messages are compact binary records, and their meaning depends on the application version. Decode them with a VSM-aware decoder:
- Yggio decodes them with its built-in VSM translator, and keeps track of each sensor’s application version.
- Other platforms: use Munin, Sensative’s open-source MQTT client. It decodes the messages for any network server, keeps the device state the decoder needs and the device time up to date, and solves Wi-Fi positions.
- Your own integration: the open-source VSM translator is the decoder that Munin uses, available as a Node package. It needs two things from you: it must be able to store at least the rulesCrc32 for each sensor between messages, and it must be kept up to date, since new application versions are released without notice.
Changing the settings
There are two kinds of settings: the VSM application’s settings on the LoRaWAN board (when to report, alarms, network), and the radar settings on the radar board (method, interval, range, threshold). Both can be changed over the air, and on site with an app:
| Over LoRaWAN | On site | |
|---|---|---|
| Application settings (LoRaWAN board) | Downlinks on port 2 or port 7 | The Hugin NFC app (Android), for example with a QR code from the VSM Configuration Tool |
| Radar settings (radar board) | Radar commands on port 48 | The SweIoT Toolbox app (Android), over Bluetooth |
| Software updates | New VSM applications | Hugin: the LoRaWAN board’s firmware and VSM application. SweIoT Toolbox: the radar firmware, which can only be updated this way |
The VSM Configuration Tool makes the downlinks for both kinds.
- Pick the application: by name and version, or by the rulesCrc32 from Puck’s port 15 message (see Which application is in the sensor).
- Choose Custom and set the values you want. Each setting shows its description, unit and range. Type radar commands into the Radar Module Commands field, separated by
;, for examplesys:3;3:600. - Take the result: downlinks for port 2 and port 48, or a single payload for port 7, in hex or base64, to send from your network server. Or a QR code to scan with the Hugin NFC app.
5The apps: Hugin and SweIoT Toolbox
Hugin NFC app (LoRaWAN board)
Hugin is an optional Android app for working with the sensor on site, over NFC. It needs an Android phone with NFC and GPS, and an Yggio user account. The sensor must also be registered in Yggio with your organisation as its owner: Hugin checks this with Yggio before it lets you work with the sensor. Hold the phone to the sensor as in Finding the NFC antennas. The app then shows the serial number, the application and its version, the state (for example joined), battery, link and region information, and the DevEUI. Depending on your rights in Yggio, it can read and apply configuration profiles, including one scanned as a QR code from the VSM Configuration Tool, and update the device time and position.
Installation, sign-in, flashing and troubleshooting are in the Hugin NFC app manual.
Hugin also updates the LoRaWAN board’s firmware and VSM application.
SweIoT Toolbox (radar board)
SweIoT Toolbox is an Android app, on Google Play, that talks to the radar board over Bluetooth. There is no iPhone version. Use it on site to read and change the radar settings and to update the radar firmware.
- Start the radar’s Bluetooth with Hugin: Bluetooth on the radar board is off most of the time, for three reasons: it saves battery, it keeps radio traffic in the air down, and it limits who can reach the radar board, in line with the EU Cyber Resilience Act. Only the registered owner of the sensor, or users the owner has given the right, can switch Bluetooth on. To start it for SweIoT Toolbox, hold the phone to Puck with the Hugin app open (see Finding the NFC antennas) and press Activate Radar Bluetooth: the radar board then advertises for about 20 seconds, so connect from SweIoT Toolbox within that time. You can also switch it on remotely, with a LoRaWAN downlink, for example from Yggio: set Radar BT Advertise trigger to 1 (see Settings). In Yggio, only users with the right to the sensor can send it. Apart from this, the radar board advertises only for a few seconds after each measurement.
- In the app: SweIoT Toolbox guides you through choosing a radar method and adjusting its main settings. Its Commands and Logs menu takes the same radar commands as LoRaWAN.
- Updates: the radar firmware can only be updated over Bluetooth, with SweIoT Toolbox.
6Maintenance and removal
Battery
The battery is a replaceable lithium thionyl chloride (LiSOCl₂) cell, 3.6 V and 2,100 mAh, chosen because it works from −30 to +80 °C. How long it lasts depends on the radar method, how often the radar measures, the averaging, and how often Puck reports. As a guide, the radar is designed for ten years in a parking bay measured every 30 seconds, and in a well or a waste bin measured every 10 minutes. A good network (SF7–SF9) helps; a weak link shortens it. Change the battery when the voltage stays below 2.8 V above +10 °C (see Temperature, humidity and battery).
Changing the battery
Use Sensative’s battery kit: a new battery, a new O-ring and rubber cushion, and two Star tools. Change the battery in a dry place.
- Take Puck down. Fit a Star tool on each end and turn the lens cap anticlockwise to open the housing. Never use other tools: they can break the housing, or leave it not properly closed.
- Unplug the old battery at its connector and plug in the new one. Hold the circuit board down with a finger while you pull the connector out. Otherwise the boards can come up out of the housing with it, and they are hard to fit back. Do not cut the battery’s wires.
- Fit the new rubber cushion and the new O-ring, and check that they sit correctly and are clean. They keep Puck watertight.
- Close the housing by turning it clockwise, about a quarter of a turn, then tighten it fully with the two Star tools.
- Puck starts again and, if it was joined before, joins the network again by itself. Check that the measurements arrive. If it was never joined, join it with NFC, as in step 3.
Moisture
Puck is sealed, and silica gel inside takes up moisture that condenses. If the humidity reported from inside keeps rising, open Puck as above, check the O-ring, and replace the silica gel.
Removing Puck Radar
On adhesive, slide dental floss behind Puck and saw gently through it. On a mounting plate, unscrew or cut the plate free; the battery can be changed with the plate still on.
Moving to another network server
Delete the device from the old network server and add it to the new one. Puck then loses the old network, and joins the new one. With the Hugin app you can restart it at once instead (Toggle On/Off), but that also resets any custom settings.
Storage, safety and disposal
- Store unused sensors and batteries at +10 to +30 °C.
- Do not short-circuit the battery, puncture it, or heat it above +80 °C. Open Puck only to change the battery.
- Hand in used batteries for recycling as batteries, and Puck, without its battery, as electronic waste.
7Troubleshooting
| Problem | What to do |
|---|---|
| The distance is 0, or nothing is found | Distance 0 means a measurement found no echo above the threshold (it is sent only with Report Failed Measurements on). The target is outside the range, or its echo is too weak. Check the Start and Length of range, then lower the threshold (see Radar methods). |
| Distance2: no echo from a zone | Check that the ranges of the two zones and of the exclusion zones are set correctly. An exclusion zone that covers a detection zone hides every echo in it. |
| The distance is wrong | The radar sees another path: a side wall, the bottom, the mounting or a lid. Point Puck straight at the target, shorten the range, raise the threshold, or use the narrow lens (see How the radar sees). |
| The readings jump about in rain, snow or on moving water | Take more sweeps per measurement, with the median on, or a longer pause between sweeps (see Radar settings by position). Both cost battery. The daily detection rate shows how often the radar finds a stable echo. |
| No measurements, although Puck has joined | The radar measures only while Puck is joined. Read the radar settings with sys? on port 48: check the method, and that the radar is active (position 6). |
A radar command is answered with * | The command was not accepted. Check its format and values (see Radar commands), and read the current values with sys? or, for a method, for example 3?. |
| SweIoT Toolbox cannot find the radar | Start Bluetooth with the Hugin app, which needs access rights to the sensor in Yggio, then connect within about 20 seconds; or send the Radar BT Advertise trigger. SweIoT Toolbox is Android only. |
| The humidity inside keeps rising | Moisture is getting in, or the silica gel is spent. Check the O-ring and replace the silica gel (see Maintenance). |
| The battery voltage is low | Check the temperature first: the voltage drops in the cold. If it stays below 2.8 V above +10 °C, change the battery. |
| Nothing happens when I hold the phone to it | Check that NFC is on and the phone case is off. Lay the phone flat on top of Puck and move it slowly until it signals contact, then hold it still (see Finding the NFC antennas). |
| Join Request in the network server, but no Join Accept | Check the keys, the JoinEUI 70B3D52C0001D4C3, the LoRaWAN version (1.0.4), the regional parameters (RP002-1.0.3) and the frequency plan (EU868). |
| Nothing at all in the network server | Check that the gateway is on and online, and that Puck is in range and not inside a metal enclosure. Then start a new join with NFC, as in step 3. |
| “MIC mismatch” | The keys are wrong. Check that they belong to this sensor and are typed correctly. |
| Messages arrive, but the decoder shows no readings | The decoder has usually missed the application identity: send 00 on port 15, and check that the decoder is up to date (see Which application is in the sensor). |
| A new setting has no effect | A downlink arrives only after Puck’s next message, and later on a busy network. Check that it is still queued, and that it was made for the rulesCrc32 your Puck reports. |
| Messages missing or irregular | Check RSSI and SNR. Puck may be too far from the gateway, or deep in a well or concrete structure. Some channels can also be disturbed by interference on the same frequency band, for example from a nearby cellular transmitter or an RFID reader. |
| No position | A position needs a cloud service that supports Wi-Fi positioning, for example Yggio, and enough known 2.4 GHz access points within reach. See How Wi-Fi positioning works. |
8Technical reference
For integrators. The values below are for the application Puck-radar R31–R33. Other versions can differ: check the VSM application documentation or the VSM Configuration Tool for yours.
Which application is in the sensor
Right after it has joined, Puck sends its application identity, the rulesCrc32, on port 15. The decoder uses it to pick the right translation, and you need it to make the right downlinks. For this application it is:
| Application | Puck-radar |
| Version | R31–R33 |
| rulesCrc32 | 1946060128 (hex 73FE8560) |
If you missed the message, send 00 on port 15 and Puck sends its identity again. The Hugin NFC app also shows the application and its version on site.
Alternative applications: besides Puck-radar, Sensative can offer other VSM applications for Puck’s LoRaWAN board. They are available in the Hugin NFC app (Android) and can also be loaded over LoRaWAN. Ask Sensative which applications fit your use.
LoRaWAN and ports
| LoRaWAN | MAC 1.0.4, regional parameters RP002-1.0.3, class A, OTAA, max EIRP 14 dBm |
| JoinEUI | 70B3D52C0001D4C3 (all Puck and Square sensors) |
| Port | Direction | What it carries |
|---|---|---|
| 1 | Uplink | Readings and alarms (see Messages) |
| 11 | Uplink | The same outputs in compressed form |
| 15 | Uplink | Application identity (rulesCrc32), first thing after a join |
| 15 | Downlink | 00 asks Puck to send its application identity again |
| 23 | Uplink | Wi-Fi scan, for positioning |
| 2 | Downlink | Application settings and read requests (see Settings on port 2) |
| 2 | Uplink | Puck’s answer: the values it now has |
| 7 | Downlink | A whole configuration in one payload, radar commands included (see A whole configuration on port 7) |
| 7 | Uplink | The status of that configuration: None, Applied, Error or Dirty |
| 48 | Downlink | A radar command, as text (see Radar commands) |
| 32 | Uplink | The radar board’s answer, as text |
Messages
Each output has an id and a scale. “Confirmed” outputs are acknowledged by the network server.
| Output | Id | Size and scale | Unit | Confirmed | Sent |
|---|---|---|---|---|---|
| distance | 91 | 2 bytes, × 0.01 | m | Yes | On a change larger than the Radar Distance Hysteresis |
| amplitude | 90 | 2 bytes | echo strength | Yes | On a change larger than the Radar Amplitude Hysteresis |
| distance2, amplitude2 | 93 92 | 2 bytes each; distance × 0.01 | m, echo strength | Yes | Zone 2 of the Distance2 method, with zone 1 |
| occupied | 80 | 1 byte | 1 = occupied, 0 = free | Yes | From the methods that judge occupancy, on a change |
| distanceAverage | 94 | 2 bytes, × 0.01 | m | Yes | Every Average Distance Interval, if changed |
| averageDistanceAlarm | 81 | 1 byte | 0 = none, 1 = low, 2 = high, 3 = both | Yes | When the alarm state changes |
| radarDetectionPercentageDay | 95 | 2 bytes | % of measurements with an echo | Yes | Once a day |
| radarVoltage_V | B4 | 2 bytes, × 0.001 | V | No | With the periodic reports |
| temp | B6 | 2 bytes, × 0.01 | °C, inside the housing | No | With the periodic reports |
| humidity | B5 | 2 bytes, × 0.01 | % RH, inside the housing | No | With the periodic reports |
| periodicReportsCounter | BB | 4 bytes | count | No | With each periodic report |
| nfcContactCount | 98 | 4 bytes | count | Yes | After an NFC touch, so Puck answers even with the radar off |
Settings
The defaults are the values Puck starts with. The id is what a port 2 downlink uses. Values are sent in the steps shown: a setting in steps of 0.01 is sent as a hundred times its value.
| Setting | Name in the application | Id | What it does | Unit | Range | Default |
|---|---|---|---|---|---|---|
| Radar Distance Hysteresis | distanceHysteresis | A5 | Change in distance needed before a new distance, or average, is sent. | m, steps of 0.01 | 0–1.27 | 0.10 |
| Radar Amplitude Hysteresis | amplitudeHysteresis | B0 | Change in echo strength needed before a new value is sent. | echo strength | 0–32,767 | 250 |
| Average Distance Interval | averageDistanceIntervalMinutes | B1 | The period the average distance is worked out over. The alarms follow the average. | minutes | 2–32,767 | 1,440 |
| Distance Alarm Low Level | averageDistanceLowAlarmLevel | B2 | Alarm when the average distance is below this level. 0 = off. | m, steps of 0.01 | 0–327.67 | 0 |
| Distance Alarm High Level | averageDistanceHighAlarmLevel | B3 | Alarm when the average distance is above this level. | m, steps of 0.01 | 0–327.67 | 0 |
| Report Failed Measurements | reportFailedDistanceMeasurements | A6 | 0 = a measurement with no echo above the threshold is not sent. 1 = it is sent as distance 0. | on/off | 0–1 | 0 |
| Interval between periodic reports | periodicReportsInterval | A7 | How often the battery voltage, temperature and humidity are sent. | hours | 0–250 | 8 |
| Temperature Calibration | temperatureUserCalibration | BC | Offset added to the temperature. | °C, steps of 0.01 | −10 to +10 | 0 |
| Radar BT Advertise trigger | radarBtAdvertiseTrigger | A4 | 1 makes the radar board advertise on Bluetooth, for SweIoT Toolbox. | on/off | 0–1 | 0 |
| Time between join retries | timeBetweenJoinAttemts | B8 | How long Puck waits between join attempts when it is not joined. | minutes | 0–32,767 | 300 |
| Time from last RX before unjoin | timeBeforeUnjoin | B9 | How long Puck goes without hearing the network before it joins again. | hours | 0–32,767 | 360 |
| Max time between ReSend tries | maxResendWaitTime | BA | Longest wait between tries when a confirmed message is not acknowledged. | seconds | 14,400 | |
| Roaming Network Count | roamNetworkCount | A0 | Number of LoRaWAN network identities to try in turn (see Network). | number | 1–15 | 1 |
| Max Power Index | maxPowerIndex | A3 | Highest LoRaWAN power index Puck may use, join included. The default leaves out DR0. | index | 0–16 | 16 |
| LoRaWAN power filter factor up | powerIndexFilterFactorUp | A1 | How slowly Puck follows its own adaptive data rate towards a slower setting. 1 = no filter, 10 = very slow. | number | 1–50 | 10 |
| LoRaWAN power filter factor down | powerIndexFilterFactorDown | A2 | The same, towards a faster setting. | number | 1–50 | 3 |
Device registers
These belong to the firmware rather than to the application, but can be changed the same way. Leave them as they are unless you have a reason.
| Register | Name | Id | What it does | Unit | Range | Default |
|---|---|---|---|---|---|---|
| Downlink Timeout | LINKCHECK_TIME | D0 | How long Puck goes without hearing anything from the network before it gives the network up. From half of this time, every uplink is confirmed; from 80 %, it also sends link checks of its own. | seconds | 300–2,592,000 | 86,400 |
| TX Power Range | TX_POWER_RANGE | D8 | The power index range for fast adaptive data rate. Turning it up costs battery. | 2 bytes | 0–65,535 |
Released profiles
No ready-made profiles are released for this application. Puck starts with the defaults in the settings table; to change them, use Custom in the VSM Configuration Tool.
Settings on port 2
A port 2 downlink is a list of records of 5 bytes each: one byte for the setting’s id, then the value as a signed 32-bit integer, most significant byte first. The value is in the setting’s own steps: a Radar Distance Hysteresis of 0.05 m in steps of 0.01 is sent as 5. Puck applies the values and answers on port 2 with the values it now has.
Reading values
A port 2 downlink of one to four bytes is a read request: Puck sends back the current value of each id in it.
| Port 2 downlink | Puck answers with |
|---|---|
04 | Current temperature, in hundredths of a degree |
05 | Current humidity, in hundredths of a per cent |
A5 | The Radar Distance Hysteresis now set (any setting id works the same way) |
A whole configuration on port 7
The VSM Configuration Tool can also pack a configuration into a single port 7 payload. It starts with the application’s CRC and ends with a checksum of the configuration (configCrc32). The sensor reports the result on port 7: None, Applied, Error or Dirty.
Radar commands
The radar board takes short text commands. Send each as a port 48 downlink, in ASCII; the VSM Configuration Tool makes them for you from the Radar Module Commands field. The radar board answers on port 32, as text: an answer starting with = means the command was accepted, * means an error. About an hour after a change (60 minutes by default), the radar board also sends the settings it now runs, so you can confirm them.
| Command | What it does |
|---|---|
sys? | Read the system settings |
sys:3 | Select method 3 (Well). The first system setting is the method |
3? | Read the settings of method 3 (works for each method) |
3:600 | Set the first setting of method 3, the measurement interval, to 600 s |
4:600,,0.15,1.2 | Set several settings of method 4 at once, by position. An empty position keeps that setting, and the settings after the last one given stay as they are |
measure | Measure once, now |
test:10 | Test mode: measure every 10 s for 10 minutes, then go back to normal. Useful while installing |
meth_cmd:2,0.5,2.5,40 | Methods 7 and 8: a scan from 0.5 to 2.5 m in 40 sections (see A new application) |
version | Read the radar firmware version |
restart | Restart the radar board |
factory | Reset all radar settings, system and methods, to the factory defaults |
Radar settings by position
Each method’s settings are one string of values, separated by commas, in a fixed order. The settings a user normally changes, with their defaults:
| Method | Position: setting (default) |
|---|---|
| 3 Well | 1: interval, s (300) · 2: HWAAS, 1–63 (20) · 3: start of range, m (0.500) · 4: length of range, m (3.000) · 5: sweeps per measurement (3) · 10: adaptive range, m, 0 = off (0) · 11: median, 1 = on (1) · 12: threshold (200) · 13: pause between sweeps, ms (1,000) · 14: radar profile, 1–5 (2) |
| 4 Bin | 1: interval, s (120) · 2: HWAAS (20) · 3: start of range, m (0.150) · 4: length of range, m (1.000) · 5: threshold (290) · 6: offset added to the distance, mm (0) |
| 5 Parking | 1: interval, s (30) · 2: HWAAS (10) · 3: start of range, m (0.200) · 4: length of range, m (1.500) |
| 6 Seating | 1: interval, s (60) · 2: HWAAS (30) · 3: start of range, m (0.240) · 4: length of range, m (1.000) · 5: threshold (200) · 6: offset, mm (0) · 7: measurements in a row to change to occupied (3) · 8: and to free (3) |
| 8 Distance2 | Two zones, each with its own threshold and choice of echo, and up to two exclusion zones (positions 7–22; see the example above) |
For example, 3:,,,,,,,,,,,150 lowers the threshold of the Well method to 150 and leaves the rest as it is.
The system settings are one string too. Position 1 is the method, and position 8, send only changes (0 = off), makes Puck send only results that have changed, such as arrivals and departures in a parking bay: sys:,,,,,,,1. Leave the other system settings as delivered. In particular, never change the transport setting (position 7): it can cut the radar board off from LoRaWAN.
- HWAAS: samples averaged in the radar chip for each point. More samples reduce noise, and cost time and battery.
- Radar profile: a higher profile gives more signal for long distances, such as deep wells, at the cost of distance resolution.
Worked example 1: Storm drain: water level every 10 minutes, with a flood alarm
Select the Well method and measure every 10 minutes. Average over 30 minutes instead of 24 hours, and raise the alarm when the water comes within 1 m of Puck. Both examples were made in the VSM Configuration Tool for rulesCrc32 1946060128. Send either the downlinks in order, or the single port 7 payload, not both.
| Setting | Value | Sent as | Record |
|---|---|---|---|
| Radar Module Commands | sys:3;3:600 | two radar commands | sys:3 and 3:600 on port 48 |
| Average Distance Interval | 30 min | 30 | B1 00 00 00 1E |
| Distance Alarm Low Level | 1.00 m | 100 | B2 00 00 00 64 |
| Port | Downlink (hex) | Base64 |
|---|---|---|
| 2 | B1 00 00 00 1E B2 00 00 00 64 | sQAAAB6yAAAAZA== |
| 48 | 73 79 73 3A 33 | c3lzOjM= |
| 48 | 33 3A 36 30 30 | Mzo2MDA= |
| Or 7 | 73 FE 85 60 02 0A B1 00 00 00 1E B2 00 00 00 64 30 05 73 79 73 3A 33 30 05 33 3A 36 30 30 00 61 78 31 D9 |
Worked example 2: Waste bin, 1.2 m deep, checked every 10 minutes
Select the Bin method, measure every 10 minutes over a range from 0.15 m to 1.35 m, and send a new distance on every 5 cm change.
| Setting | Value | Sent as | Record |
|---|---|---|---|
| Radar Module Commands | sys:4;4:600,,0.15,1.2 | two radar commands | sys:4 and 4:600,,0.15,1.2 on port 48 |
| Radar Distance Hysteresis | 0.05 m | 5 | A5 00 00 00 05 |
| Port | Downlink (hex) | Base64 |
|---|---|---|
| 2 | A5 00 00 00 05 | pQAAAAU= |
| 48 | 73 79 73 3A 34 | c3lzOjQ= |
| 48 | 34 3A 36 30 30 2C 2C 30 2E 31 35 2C 31 2E 32 | NDo2MDAsLDAuMTUsMS4y |
| Or 7 | 73 FE 85 60 02 05 A5 00 00 00 05 30 05 73 79 73 3A 34 30 0F 34 3A 36 30 30 2C 2C 30 2E 31 35 2C 31 2E 32 00 5F 53 34 6A |
9Specifications
| Radar | 60 GHz pulsed coherent radar (Acconeer A111) |
| Range | 0.2–6.8 m, centimetre resolution; the distance is measured from the radar reference point, 1.1 cm (standard) or 2.6 cm (narrow) below the front |
| Beam | Standard lens about ±60°, narrow lens about ±10° |
| Radar methods | Well, Bin, Parking, Seating, Adv_Seating, Distance2 (radar firmware 2.24) |
| Other sensors | Temperature (typical ±2 °C at 0–30 °C) and humidity, inside the housing |
| Positioning | Wi-Fi scan once a day; a cloud service that supports Wi-Fi positioning is needed |
| Radio | LoRaWAN 1.0.4, class A, OTAA; JoinEUI 70B3D52C0001D4C3 |
| Frequency plan | EU868 |
| Range (radio) | Up to 10 km in line of sight |
| Configuration | Both boards over LoRaWAN; on site with Hugin (NFC, Android) and SweIoT Toolbox (Bluetooth, Android) |
| Updates | LoRaWAN board: firmware and VSM application with Hugin, VSM applications also over LoRaWAN. Radar board: firmware only over Bluetooth, with SweIoT Toolbox |
| Application | VSM application Puck-radar (R31–R33) |
| Battery | Replaceable LiSOCl₂, 3.6 V, 2,100 mAh; up to ten years, depending on the method and how often it measures |
| IP rating | IP67, sealed with an O-ring |
| Operating temperature | −30 to +80 °C |
| Storage temperature | +10 to +30 °C |
| Dimensions | Ø 45 × 30 mm (standard lens) or Ø 45 × 45 mm (narrow lens) |
| Weight | 38 g (standard lens) · 43 g (narrow lens), battery included |
| Mounting | Adhesive included; mounting plates sold separately; drilled hole, bracket or straps |
10Support
- VSM Configuration Tool, opened at this application: vsm-lora-config-app.service.sensative.net
- VSM application documentation for this version: github.com/Sensative/vsm-application-documentation
- Munin MQTT client and decoder (open source): github.com/Sensative/vsm-mqtt-client-open-source
- VSM translator (open source): github.com/Sensative/vsm-translator-open-source
- Hugin NFC app: Sensative Docs
- SweIoT Toolbox (Android): Google Play; quick start: sweiot.gitbook.io
- Puck mounting plates: sensative.com/accessories/puck-mounting-plates
- Support, FAQ and downloads: sensative.com/support
- Product page and product sheet: sensative.com/sensors/puck-radar
Sources: Sensative Docs, Puck Radar (read 31 October 2026); manual for the radar module in Puck Radar (SweIoT 2.8.0); Puck Radar product sheet, Rev B; VSM Configuration Tool, application data for Puck-radar (read 31 October 2026); VSM application documentation on GitHub (1946060128-Puck-radar); VSM translator (open source); specifications from the sensative.com product data; Wi-Fi positioning: Semtech, Wi-Fi geolocation with LoRa Edge.