Turning Garmin Sleep Data Into a BedJet Climate Automation
The useful version is not live body-temperature magic. It is a practical real-time controller, plus Garmin sleep data for tuning the thresholds over time.
I built a small sleep-climate automation because I kept running into the same problem: I would wake up hot, especially on nights when the room warmed up after the thermostat stopped running.
The first idea sounded simple: use my Garmin Fenix 7 to watch body temperature overnight, then turn on the BedJet when I was getting too warm.
That is not quite how Garmin works.
Garmin Connect is useful, but it is not a dependable live body-temperature stream. The data that comes back from Garmin is much better as an after-the-fact sleep summary. Depending on the watch and account data, you can get things like sleep duration, awake time, HRV, stress, and sometimes skin temperature deviation. On my current setup, Garmin is giving me useful sleep and stress signals, but not a skin-temperature field.
So the system became more practical:
- Home Assistant handles the real-time overnight decision.
- BedJet provides the local cooling action.
- Garmin Connect provides the sleep-data feedback loop after the watch syncs.
- Nest can become a better room-temperature and thermostat-state source once it is connected in Home Assistant.
What is running now
Home Assistant has a sleep climate package that watches a nighttime temperature signal and runs BedJet cooling in short pulses.
Right now, there is no Nest entity registered in this Home Assistant instance, so the automation falls back to the BedJet’s own reported current temperature as a near-bed temperature signal. That is not as good as a dedicated bedroom sensor, but it is good enough to get a working first version.
The starting rule is intentionally boring:
If it is between 10 PM and 8 AM, I am marked as in bed, and the near-bed temperature is above 72F, Home Assistant runs a BedJet cooling pulse.
The first cooling pulse is conservative:
- BedJet cool mode
- 72F target
- 35 percent fan
- 25 minutes
Then it shuts the BedJet off again. That matters because I do not want the automation to turn a slightly warm room into a too-cold wake-up two hours later.
There is also a manual “hot wake” toggle in Home Assistant. If I wake up hot and tap it, Home Assistant records the time and starts the same cooling pulse. That gives me an easy way to tag the nights where the threshold was not aggressive enough.
The Garmin part
The Garmin side is a command-line sensor in Home Assistant. It logs into Garmin Connect, pulls yesterday’s sleep summary, and writes a compact history file.
The snapshot currently includes:
- total sleep seconds
- awake seconds
- awake count
- deep, light, and REM sleep seconds
- HRV average
- average and max stress
- body battery if available
- skin temperature deviation if available
- a simple hot-sleep risk score
For the latest snapshot, Garmin returned sleep duration, awake time, awake count, HRV, and stress. It did not return skin temperature.
That means Garmin is not the trigger for cooling in the middle of the night. It is the learning layer. After a week or two, I can compare the Garmin history against the nights I remember waking up hot and tune the automation:
- lower the temperature threshold if I am still waking hot
- increase the fan or pulse length if the BedJet response is too weak
- shorten the pulse if it overshoots and wakes me cold
- look for patterns in awake time, stress, and restlessness
This is probably the right split of responsibility. Real-time control should use local sensors. Wearable data should tune the rules.
Why not just use body temperature?
Because “body temperature” from a watch is usually not the real-time control signal people imagine.
Some wearables expose skin temperature deviation during sleep, but it is usually calculated after a sleep window and compared to a personal baseline. That is useful for trends. It is not the same thing as a thermostat reading on my body every minute with an API that Home Assistant can query.
For this project, the more reliable path is:
- Detect when the bed or room is getting warm.
- Cool the bed gently.
- Use sleep data afterward to decide whether the rule actually helped.
The Nest gap
The thing I still want to add is the Nest thermostat.
The failure mode that started this is not just “I am hot.” It is often “the thermostat stopped cooling, the room warmed up, and I woke up.” Once Nest is connected to Home Assistant, the automation can watch both room temperature and thermostat state.
The useful rule will be:
If the room is warm and Nest is idle or off during sleep hours, run a BedJet cooling pulse.
That gives me a local response even if the central HVAC is not doing anything. It does not need to fight the thermostat. It just protects sleep with a small bed-level cooling action.
What I like about this setup
It avoids pretending the wearable can do something it cannot do reliably.
The BedJet is local and immediate. Home Assistant is good at simple threshold logic. Garmin is good at sleep summaries. Nest, once added, will be good at telling me whether the room and thermostat are drifting in the wrong direction.
The whole thing is less glamorous than “AI controls my sleep temperature,” but it is also much closer to something that should work every night:
Small local automation first. Data-driven tuning second.
That is usually the better smart-home pattern.