SDK and documentation for 60GHz mmWave radar sensors.
by
The sleep monitoring radar measures presence in bed, breathing rate, heart rate, body movement, sleep stages, and a sleep score, all without contact and without a camera. It is mounted once above or beside the bed, and it reports data continuously through the night.
This article covers everything about this radar: what each data point means, how a night is processed, where to install it, and how to read the output over MQTT or UART. It is written for the radar sold in this store, so all ranges, frequencies, and values are the ones this specific model uses.
This is a consumer wellness device. It is not a medical device and does not diagnose, treat, or prevent any condition.
This radar is available in two forms, and they use completely different protocols. Check which one you have before reading further.
| Variant | Interface | Protocol | Configuration |
|---|---|---|---|
| Sleep radar module | UART only | Frame protocol at 115200 bps | Wired, no network setup |
| Sleep radar | 2.4 GHz Wi-Fi + MQTT | JSON property protocol over MQTT topics | Web page for MQTT, Android app for Wi-Fi |
Both variants share the same sensing core, so the measured values mean the same thing. The ranges, the commands, and the reporting details differ, and every value in this article is marked with the variant it belongs to.
The sleep radar module is the bare sensing core for integrators who embed it in their own product; its output is described under Over UART. The sleep radar is the finished unit that joins your network; its output is described under Over Wi-Fi and MQTT.
The sleep radar is a 60 GHz millimeter wave sensor in a housing of approximately 80 × 80 × 51.8 mm. It is designed for fixed installation at a bed: either side-wall mounted or mounted above the bed head and tilted downward.
The sleep radar module is the same sensing core without the housing and without the Wi-Fi section. It exposes a UART interface and is intended to be built into another product.
Both measure, through a blanket and in complete darkness:
Neither measures who the person is, and neither records images, video, or audio. The sleep radar publishes numbers over Wi-Fi; the sleep radar module publishes them over a serial line.
The radar transmits a 60 GHz FMCW signal and analyses the echo. Breathing moves the chest wall by less than one millimeter, and the 60 GHz band resolves displacements of that scale. A blanket is a non-metallic material, so the signal passes through it and reflects off the chest underneath.
The beam covers a horizontal angle of 40° and a vertical angle of 40°, so the radar must be aimed at the chest area rather than at the whole room. A full explanation of the FMCW principle is in the companion article How mmWave Radar Works.
Every value below is reported either when the state changes or at a fixed interval. The exact property names for Wi-Fi and UART are given in the section Getting the Data Out.
| State | Meaning |
|---|---|
| 0 | Out of bed |
| 1 | In bed |
The radar reports a person within 0.5 s of detection. It takes about 40 s of confirmed absence before it reports unoccupied, because the radar checks for micro-movement and breathing before declaring the area empty.
The in-bed state is entered as soon as the energy condition is met. The out-of-bed state is output about 30 s after the person leaves.
| Value | Meaning |
|---|---|
| 0 | No movement |
| 1 | Still (static) |
| 2 | Active |
State changes are reported within 0.5 s.
A single value from 0 to 100, reported every 1 s. The ranges have fixed meanings:
| Value | Meaning |
|---|---|
| 0 % | No person in range |
| 1 % | Still: breathing only, no limb movement |
| 2 %–30 % | Micro movement: small head or limb motion |
| 31 %–60 % | Walking or fast limb movement |
| 61 %–100 % | Running or large close-range movement |
This is the most useful value for tuning an installation. A correctly aimed radar reports values around 1 % while a person lies still.
Reported every 3 s. The range is 0–45 breaths per minute on the sleep radar module and 0–30 on the sleep radar.
The breathing state is reported separately when it changes:
| State | Meaning |
|---|---|
| Normal | 10 to 25 breaths per minute |
| High | Above 25 breaths per minute |
| Low | Below 10 breaths per minute |
| None | No person detected (default state) |
The breathing waveform is available but switched off by default. When enabled, it reports 5 values every second, each in the range 0–255. Each value is the real measurement plus 128, which keeps the curve centred on the display axis.
Reported every 3 s. The range is 50–120 bpm on the sleep radar module and 60–120 bpm on the sleep radar, which is the corrected range.
The heart rate state is reported separately: normal, high, low, or detecting. The heart rate waveform follows the same rule as the breathing waveform: 5 values per second, 0–255, real value plus 128, off by default.
Both are reported every 2 s. Distance is in centimetres, 0–65535. Position is given as x, y, and z coordinates.
Both are marked as non-critical functions with limited accuracy in the sleep radar module documentation. They are useful for debugging an installation, but they should not be used as the basis of a product feature.
Reported every 10 minutes while the person is in bed.
| Value | Meaning |
|---|---|
| 0 | Deep sleep |
| 1 | Light sleep |
| 2 | Awake |
| 3 | None (out of bed) |
The stage is evaluated once per 10-minute window, so the value changes in steps rather than continuously. Note that some older versions of the documentation list these values in a different order; the order above is the one used by the sleep radar module protocol.
Three separate values, in minutes: awake duration, light sleep duration, and deep sleep duration. Each ranges from 0 to 65535 and is updated together with the 10-minute sleep stage report.
The sleep score is reported when the sleep session ends, as a value from 0 to 100.
A valid score is only produced when the sleep duration is between 4 and 12 hours. Outside that range the session is treated as an anomaly and no meaningful score is output.
The radar also reports a rating derived from the score:
| Score | Rating |
|---|---|
| 1–60 | Poor |
| 61–75 | Fair |
| 76–100 | Good |
At the end of a sleep session the radar publishes a report of 11 fields. This is the main output most integrations use.
| Field | Range |
|---|---|
| Sleep score | 0–100 |
| Total sleep duration | 0–65535 minutes |
| Awake percentage | 0–100 |
| Light sleep percentage | 0–100 |
| Deep sleep percentage | 0–100 |
| Time out of bed | 0–255 |
| Number of times out of bed | 0–255 |
| Turn count | 0–255 |
| Average breathing rate | 0–25 |
| Average heart rate | 0–100 |
| Breathing pauses | 0–10 |
Breathing pauses are counted as a raw sensor output. The radar counts pauses in the breathing waveform; it does not interpret them, and no medical meaning should be attached to the number.
A second, shorter report published every 10 minutes while the person is in bed, with 8 fields:
| Field | Range |
|---|---|
| Presence | 1 = present, 0 = absent |
| Sleep stage | 3 = out of bed, 2 = awake, 1 = light, 0 = deep |
| Average breathing rate | 10-minute average |
| Average heart rate | 10-minute average |
| Turn count | Turns during light or deep sleep |
| Large movement proportion | 0–100 |
| Small movement proportion | 0–100 |
| Breathing pauses | Count within 10 minutes |
This report is the practical choice for a live dashboard, because it arrives every 10 minutes whether or not the stage changes.
Reported when the state changes:
| Value | Meaning |
|---|---|
| 0 | Sleep duration shorter than 4 hours |
| 1 | Sleep duration longer than 12 hours |
| 2 | No presence detected for 30 minutes while in a sleep state |
| 3 | None |
The 30-minute rule is the one most useful in care settings: if the radar is in a sleep state and detects nobody for half an hour, it raises the anomaly.
Two further functions are available on the sleep radar module protocol. Both are switches that must be enabled before they report anything.
A single table of every value and when it arrives:
| Data Point | Range | Reported |
|---|---|---|
| Presence in bed | 0 / 1 | On change |
| Motion status | 0 / 1 / 2 | On change |
| Body movement | 0–100 | Every 1 s |
| Human distance | 0–65535 cm | Every 2 s |
| Human position | x, y, z | Every 2 s |
| Breathing rate | 0–45 | Every 3 s |
| Breathing state | Normal / high / low / none | On change |
| Heart rate | 50–120 bpm | Every 3 s |
| Heart rate state | Normal / high / low / detecting | On change |
| Breathing waveform | 5 values, 0–255 | Every 1 s, off by default |
| Heart rate waveform | 5 values, 0–255 | Every 1 s, off by default |
| Sleep stage | 0–3 | Every 10 min while in bed |
| Stage durations | 0–65535 min | With the 10-minute report |
| Sleep score | 0–100 | On sleep end |
| Sleep rating | Poor / fair / good | On change |
| Sleep report | 11 fields | On sleep end |
| Sleep comprehensive status | 8 fields | Every 10 min |
| Sleep anomaly | 0–3 | On change |
Side-wall mounting (sleep radar). Mount the radar on the wall at the side of the bed, at a height of 1.8–2.2 m, pointing at the bed. This is the standard method for the finished sleep radar and needs no tilt adjustment.
Tilted mounting above the bed head (sleep radar module). Mount the radar above the bed head, tilted downward at 30°–45°, with 45° recommended, and 0.8–1 m above the bed surface. This is the method described in the sleep radar module documentation and gives the strongest breathing signal, because the beam hits the chest directly instead of at an angle.
Use the tilted method whenever the physical layout allows it.
| Signal | Maximum Distance |
|---|---|
| Breathing rate | ~1.5 m |
| Sleep detection | ~2.5 m |
| Human presence | ~2.5 m |
If the bed is large, or the radar ends up further away than these distances, the breathing signal degrades first and disappears before the presence detection does.
Avoid installing the radar where the beam reaches:
Do not aim the radar directly at an air conditioner, and do not install it facing the same direction as the air flow.
The signal is not blocked by:
Four tests, taken from the sleep radar module documentation:
If the breathing waveform is flat or missing during test 4, the radar is not aimed at the chest. Adjust the angle or the height before looking at anything else.
Understanding this sequence explains most of the odd-looking data.
Two consequences worth knowing:
Two topics are used, with the model prefix for the sleep radar being Radar60SP:
/Radar60SP/{DeviceID}/sys/property/post/Radar60SP/{DeviceID}/sys/property/setData is JSON. A typical report looks like:
{"version": "1.0", "method": "post", "params": {"sleepStatus": "0"}}
The properties you will use most:
| Property | Meaning | Access |
|---|---|---|
sleepSwitch |
Sleep function on / off | get, set |
sleepStatus |
Sleep stage | post, get |
getIntoBed |
In bed / out of bed | post, get |
awakeDuration |
Awake minutes | post, get |
lightSleepDuration |
Light sleep minutes | post, get |
deepSleepDuration |
Deep sleep minutes | post, get |
sleepScore |
Sleep score | post, get |
sleepComprehensiveStatus |
8-field status report | post, get |
sleepQualityAnalysis |
11-field sleep report | post, get |
abnormalSleep |
Sleep anomaly | post, get |
breathSwitch |
Breathing function on / off | get, set |
breathValue |
Breathing rate | post |
breathInform |
Breathing state | post, get |
heartRateSwitch |
Heart rate function on / off | get, set |
heartRateValue |
Heart rate | post |
heartRateInform |
Heart rate state | post, get |
someoneExists |
Presence | post, get |
motionStatus |
Motion status | post, get |
movementSigns |
Body movement level | post, get |
reportMode |
1 = sleep mode, 0 = real-time mode | get, set |
Values are reported as strings. Most properties support a query with "method": "get" and a setting with "method": "set"; the device answers on the report topic.
The sleep radar module exposes a UART interface at 115200 bps, 8 data bits, 1 stop bit, no parity, 3.3 V TTL level.
The frame structure is:
Header Control Command Length Data Checksum Tail
0x53 0x59 1 Byte 1 Byte 2 Bytes n Bytes 1 Byte 0x54 0x43
The checksum is the sum of the header, control byte, command byte, length bytes, and data, taking the low 8 bits.
Control byte 0x84 covers sleep monitoring. Within it, command 0x0C returns the comprehensive status, 0x0D returns the sleep report, 0x0E returns the sleep anomaly, and 0x10 returns the rating. Query commands are the same values with the high bit set, for example 0x8D to query the comprehensive status.
Because the radar publishes standard MQTT, it can be added to Home Assistant as an MQTT sensor. The practical approach is to subscribe to the report topic and map the fields you need. The comprehensive status report, arriving every 10 minutes, is usually enough for a dashboard; the full sleep report is best stored for history.
Home sleep tracking. One radar above the bed gives a nightly record of stages, durations, and score with nothing to wear and nothing to charge. This is the most common individual use.
Care facilities and nursing homes. A room without a camera still needs to know whether the occupant is in bed, how long they were out of bed, and whether the night was unusually short or long. The anomaly report covers the last case directly.
Hotels and long-stay apartments. Presence-based control of lighting and climate, with the sleep report available as an optional guest feature.
Solution integrators. The radar plus a broker plus a dashboard is a complete bed-side monitoring unit. The UART interface allows the same sensor to be embedded in a product without Wi-Fi.
This section matters as much as the features.
| Symptom | Possible Cause | Solution |
|---|---|---|
| No breathing value | Beam missing the chest | Adjust the angle or height; run the breathing test |
| Metal object in the beam path | Remove or relocate the radar | |
| Person too far away | Move within 1.5 m for breathing detection | |
| Breathing value unstable | Interference source in the beam | Remove fans, curtains, or pets from the area |
| Always reports out of bed | Radar too high or too far | Lower to 0.8–1 m above the bed, or use side-wall mounting at 1.8–2.2 m |
| Sleep stage never changes | Person not still for 10 minutes | Wait a full 10-minute window |
| Radar in real-time mode | Set reportMode to 1 (sleep mode) |
|
| No sleep score | Session shorter than 4 h or longer than 12 h | Check the anomaly report instead |
| Waveform empty | Waveform reporting is off by default | Enable the waveform switch |
| Data cleared unexpectedly | Mode was switched | Do not switch modes during a session |
| False presence at night | Moving object in the beam | Remove the interference source |
| Parameter | Value |
|---|---|
| Radar frequency | 60 GHz |
| Beam angle | 40° horizontal, 40° vertical |
| Housing size | 80 × 80 × 51.8 mm |
| Supply voltage | 4.5–5.5 V |
| Operating current | 200 mA minimum |
| Power consumption | 0.8 W minimum |
| Wireless | 2.4 GHz Wi-Fi |
| Data output | MQTT over Wi-Fi (JSON), UART |
| UART | 115200 bps, 8N1, 3.3 V TTL |
| Side-wall mounting height | 1.8–2.2 m |
| Tilted mounting | 30°–45° downward, 0.8–1 m above the bed |
| Breathing detection range | ~1.5 m |
| Sleep and presence range | ~2.5 m |
| Sleep stage interval | 10 minutes |
| Sleep score range | 0–100 |
The sleep monitoring radar reports presence in bed, breathing rate and state, heart rate, body movement, sleep stage, stage durations, and a sleep score, at fixed intervals from every second to every 10 minutes, with the full report published when the session ends.
Mount it above the bed head tilted 30°–45° at 0.8–1 m above the bed surface, or side-wall mounted at 1.8–2.2 m. Keep it within 1.5 m for breathing and 2.5 m for sleep and presence. Keep fans, air conditioners, moving curtains, metal, and pets out of the beam.
It is a consumer wellness device that records what happens at the bed side. It does not diagnose anything, and the quality of its data depends almost entirely on where and how it is installed.
tags: sleep radar - 60ghz - breathing - heart rate - sleep stages - installation - mqtt