I opened up a Pokémon GO Plus +, wired its button to an ESP32, and added a vibration motor. The device now starts and stops sleep tracking on a schedule and produces whatever Dozing/Snoozing/Slumbering ratio I set. This post covers how the button was automated and how the vibration pattern controls the result.
A while ago I built this:
It's a Pokémon GO Plus + that I took apart so I could start and stop sleep tracking from my phone.
Since then I've added a vibration motor that shakes the GO Plus +, so the device can produce whatever sleep data I aim for, no matter how I actually sleep.

Result of running it overnight with Dozing, Snoozing, and Slumbering set to 33%, 33%, and 34% (the app is in Japanese)
Here's how I built it.
Note: This is a personal project, not a recommended way to play. If you want to open up the device or generate sleep data this way, check the terms of service first and do it at your own risk.
What is Pokémon Sleep?
Pokémon Sleep is a game where you track your sleep every night and collect the sleep styles of Pokémon. You place your phone by your pillow before bed, and when you wake up and end tracking, Pokémon gather around Snorlax.

Source: Pokémon Sleep official site
Each night's sleep is classified into one of three types based on the tracked data: Dozing, Snoozing, and Slumbering. Roughly speaking, a night with a long stretch of deep sleep becomes Slumbering, and a night of light sleep becomes Dozing.
Under the hood, sleep depth is judged from body movement like rolling over. Moving a lot means light sleep; barely moving means deep sleep.
The sleep type determines which Pokémon appear. For example, Charmander appears on Snoozing nights and Squirtle on Slumbering nights.

The Pokémon that appear depend on the sleep type
Source: Pokémon Sleep official site
The sleep data also produces a Sleep Score. It's based on how long you slept, and 8.5 hours gets you a perfect 100. The higher the score, the more Pokémon show up and the better your chances of seeing rarer sleep styles.
Tracking is normally done with a phone, but you can also use the official Pokémon GO Plus +, the Poké Ball-shaped device in the post above. I'll call it the GO Plus + from here on.
What I wanted
I've played since launch and have tracked my sleep almost every day for three years. Along the way, I wanted two things:
- Track at the same time every day and get a Sleep Score of 100
- Record the sleep data I aim for
Getting a Sleep Score of 100
To keep getting a perfect score, you need to sleep 8.5 hours or more every night. Can you actually do that?
I certainly can't. Some nights it's 4 hours, some nights 8.

You don't get a perfect score unless you sleep 8.5 hours
Source: Pokémon Sleep official site
So I use a small trick: I start the GO Plus + before I go to bed.
The GO Plus + only looks at movement, so as long as it sits still, it counts that time as sleep. Start tracking early, and your recorded sleep gets longer by that much.
But I often forgot to start it, so I wanted it to start and stop automatically at fixed times.
Recording the sleep data I aim for
As mentioned above, the Pokémon that appear depend on the sleep type.
So if a night doesn't match a Pokémon's sleep type, that Pokémon can't appear at all that day.
Hitting a specific sleep type is hard. If you played early on, you probably wanted Snoozing-type Charmander or Cyndaquil and got nothing but Dozing nights.
Flip that around: if you could control the sleep type (and the sleep data behind it), collecting sleep styles would get far more efficient.
Taking apart the GO Plus + to track at fixed times
First, I needed a way to start tracking at the same time every day. Doing it by hand defeats the purpose, so it had to be automatic.
On the GO Plus +, a long press of the center button starts tracking, and another long press ends it. So all I needed was a way to press that button automatically.
I asked an AI, and it suggested opening the GO Plus +, finding the two points connected to the button, and shorting them. A button only connects two internal points while it's pressed, so shorting those points with a wire from outside does the same thing as pressing it with a finger.
I wasn't sure it would work, but there were several teardown videos on YouTube, so I gave it a try.

The two points that start it, narrowed down by measuring voltages
I measured voltages to narrow down the candidate points, then tried shorting them, and the GO Plus + actually started! That was a really satisfying moment.
After that, my device just needed to short those two points and release them. Shorting them for 2 seconds is the same as a long press, so the device does this automatically at 11 PM and 8 AM every day.
The video in the X post at the top shows the same thing triggered from a phone.
Note: I confirmed the contact locations on the one unit I have. Other units may differ.
Controlling the sleep data
With start and stop automated, the next step was producing the sleep data I wanted. The real question was: how do you fake the movements of a sleeping person?
As mentioned, Pokémon Sleep judges sleep depth from body movement like rolling over. It also seems to care about how often you move, not how hard.
I found prior work and based my approach on it. The method uses a vibration motor to shake the device.

Vibration motor: a small motor that vibrates when current flows, like the one in a phone.
Source: Akizuki Denshi
I attached the motor to the GO Plus +. During tracking, it vibrates at these fixed intervals, which I based on the values in that project:
- Dozing: every 2 minutes
- Snoozing: every 10 minutes
- Slumbering: no vibration
Each vibration lasts 3 seconds. I started with 1.5 seconds like the prior work, but the app didn't register Dozing and Snoozing reliably, so I made it longer.
After that, it's just a matter of splitting the night into Dozing, Snoozing, and Slumbering blocks by the target ratio and vibrating at each block's interval. That should produce the sleep data I want.
The finished device
Here's what I ended up with. The device has four parts:
- Microcontroller (ESP32): the black board on the left in the photo below. It keeps track of the time, presses the button, and runs the motor
- Electronic switch: the small black part above the microcontroller, just left of the green part. It shorts and releases the two button points on the GO Plus +
- Vibration motor: the round part at the top right. It shakes the GO Plus +
- Control page: a web page I open in my phone's browser. It sets the ratio and tracking times, and can start or stop tracking manually at any time

Before assembly. The thin wires from the GO Plus + go through the green part to the electronic switch.
Results from one night
I set a target of Dozing 33%, Snoozing 33%, and Slumbering 34%, and ran it from 11 PM to 8 AM. The GO Plus + sat on my desk attached to the device the whole time, so my own sleep had nothing to do with it.
Here's the result the next morning.

Left: target ratio set on the control page / Right: result screen the next morning
Every share landed within 1 percentage point of the target. The sleep data came out almost exactly as planned!
The graph is so clean it looks inhuman, which I find pretty funny. Normal tracking gives a much more uneven, jagged graph.

A night tracked normally without the device. Compare it with the device's graph above to see how artificial that one looks.
Sleep time was 8 hours 55 minutes, and the Sleep Score was 100, also as planned.
One catch: that night's sleep type was actually Dozing. Slumbering had the largest share at 35%, but the sleep type isn't decided by the largest share. It's decided by how the ratio compares to your own recent average. Hitting the exact type you want will take one more step.
Wrapping up
I took apart a GO Plus +, automated starting and stopping tracking, and built a device that controls sleep data with a vibration motor.
Tracking now happens at the same time every day, and I got a Sleep Score of 100. The sleep data also comes out at the ratio I set.
What it can't do yet is produce the sleep type I want automatically. The sleep type depends on how the night compares to my usual average, so the ratio has to be chosen with that in mind.
Right now I enter the ratio myself. Next, I want to just pick the type I want and have the device choose the ratio from past results. More improvements to come.


Top comments (0)