Wirelessly controlled Sunbeam® heated mattress pads with a Raspberry Pi.
Snuggletronics project allows you to take control of your Sunbeam heated mattress pad so that you bed is toast warm exactly when you want it to be. Snuggletronics also lets you remote control your mattress pad from your phone, tablet, or computer.
You need only add a $4 radio module connected to a Raspberry Pi to take advantage of this application. In addition to the easy web interface, Snuggletronics presents a REST API which will allow you to control your mattress heat however you like!
Most notably missing data analysis, which means control is restricted to 10 averaged power settings (no zone heating). In the near future, after further data analysis full granularity of control will be provided
see docs/TODO.md for tasks not yet done
- bower to install angular and bootstrap (defined by .bowerrc and bower.json)
- python 3.3+ (to run flask)
- python modules: flask-restful, wiringPi2
- Raspberry Pi
- 418MHZ ASK/OOK transmitter module
This circuit an program have been built and test on Rasberry Pi 2, with 418MHZ ASK/OOK transmitter module STPA-418H–B.
The STPA-418H–B is available from Circuit Specialist (no affiliation) http://www.circuitspecialists.com/stpa-418h-b.html. The
Raspberry Pi is commonly available but I encourage you to keep our maker/hacker ecosystem fertile and support vendors that create original open source hardware adafruit or sparkfun
The circuit is quite elementary, simply connect VCC to GPIO +5v, GND to GPIO GND, and Data to GPIO 17 as illustrate here:
Install npm and bower if you have not yet had a chance to do so.
sudo apt-get install nodejs npm
# note: the following command fixes a common ubuntu npm issue, this may not be necessary in the near future
sudo ln -s /usr/bin/nodejs /usr/bin/node
sudo npm install -g bower
bower is used to install javascript and css components of angular, bootstrap, and jquery, these dependencies are configured via bower.json and the target directory is set via .bowerrc
# make sure you are in the directry where this README.md is located
cd snuggletronics
# install dependencies
bower install
GPIO requires escalated privileges, so the easiest manner to install and run this software is to us pip3 to manually install all modules used:
pip3 install flask-restful
WiringPi2 needs to be built manuallly. Find canonical directions at https://github.com/Gadgetoid/WiringPi2-Python
Because GPIO requires escalated privileges, simply start using sudo
sudo python3 runserver.py
Normal start up example:
pi@raspberrypi:~/snuggletronics $ sudo python3 runserver.py
* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
* Restarting with stat
* Debugger is active!
* Debugger pin code: 280-224-703
You may, of course, also wrap with an service execution script and run as daemon, if you do so please send a merge request :)
Viewed through browser
Resource URL: /api/v1/mattress
Actions: HTTP GET Retrieve last state set. Arguments: none. Response: Mattress State DTO representing last set state
Note that because the mattress pad does not transmit state back (it only receives commands), GET method will only return state of last sent command, and not current state of mattress. Common scenarios for mattress state being different than last sent state include original remote being used in tandem with this application, heater becoming unplugged, or failure to receive transmission.
# Example
$ curl http://127.0.0.1:5000/api/v1/mattress
{
"left_foot_power": 0,
"left_head_power": 0,
"left_middle_power": 0,
"right_foot_power": 0,
"right_head_power": 0,
"right_middle_power": 0
}
HTTP PUT Send power state to mattress. Arguments: Mattress State DTO as data Response: Mattress State DTO representing last set state
Sends command to mattress heater, upon receipt of valid Mattress State DTO data element. Will turn off mattress if all six required power fields are set to zero OR if power_on element is set to false (regardless of presence of non-zero power fields).
# Example
$ curl -H "Content-Type: application/json" -X PUT -d '{"left_foot_power":3,"left_head_power":0,"left_middle_power":0,"right_foot_power":0,"right_head_power":0,"right_middle_power":3,"hour":5,"minute":3}' http://127.0.0.1:5000/api/v1/mattress
{
"left_foot_power": 1,
"left_head_power": 1,
"left_middle_power": 1,
"right_foot_power": 1,
"right_head_power": 1,
"right_middle_power": 1
}
Resource URL: /api/v1/mattress/jobs A simple daily mattress heater job scheduler.
Because mattress thermal change rate is so slow, jobs may be scheduled to the minute of the day. Three actions allow you to list, delete, or create/update mattress heater jobs. As a consequence of mattress jobs being unique by hour and minute of the day, there is no need for id tokens that you might expect of a 'normal' rest interface (use hour and minute instead).
HTTP GET Retrieve list of mattress heater jobs Arguments: None Response: Mattress State JOB List DTO all scheduled jobs, ordered by hour/minute ascending
Example
$ curl http://127.0.0.1:5000/api/v1/mattress/jobs
[
{
"hour": 20,
"left_foot_power": 10,
"left_head_power": 10,
"left_middle_power": 10,
"minute": 15,
"right_foot_power": 10,
"right_head_power": 10,
"right_middle_power": 10
},
{
"hour": 22,
"left_foot_power": 3,
"left_head_power": 0,
"left_middle_power": 0,
"minute": 0,
"right_foot_power": 3,
"right_head_power": 0,
"right_middle_power": 0
},
{
"hour": 7,
"left_foot_power": 0,
"left_head_power": 0,
"left_middle_power": 0,
"minute": 0,
"right_foot_power": 0,
"right_head_power": 0,
"right_middle_power": 0
}
]
HTTP DELETE Deletes Mattress Heater Job Arguments: Daily Job DTO as data Response: HTTP 204
Deletes job corresponding to hour and minute specified if it exists. If no corresponding job exists, no change is made 204 is returned in either case.
Example
$ curl -H "Content-Type: application/json" -X DELETE -d '{"hour":22,"minute":0}' http://127.0.0.1:5000/api/v1/mattress/jobs
HTTP POST Creates or Updates Mattress Heater Job Arguments: Mattress State Daily Jobs DTO as data Response: HTTP 200
Example
curl -H "Content-Type: application/json" -X POST -d '{"left_foot_power":3,"left_head_power":0,"left_middle_power":0,"right_foot_power":0,"right_head_power":0,"right_middle_power":3,"hour":5,"minute":3}' http://127.0.0.1:5000/api/v1/mattress/jobs
JSON object containing the following pair members
- left_foot_power: integer 0 through 10, required
- left_head_power: integer 0 through 10, required
- left_middle_power: integer 0 through 10, required
- right_foot_power: integer 0 through 10, required
- right_head_power: integer 0 through 10, required
- right_middle_power: integer 0 through 10, required
- power_on: boolean, optional (default true)
Example:
{
"left_foot_power": 3,
"left_head_power": 0,
"left_middle_power": 0,
"right_foot_power": 3,
"right_head_power": 0,
"right_middle_power": 0
}
Only used for deleting jobs.
- hour: integer 0 through 24, required
- minute: integer 0 through 59, required
Example:
{
"hour": 20,
"minute": 15,
}
All of Mattress State DTO object with the addition of the the two pair members (hour & minute) of Daily Job DTO.
Example:
{
"left_foot_power": 10,
"left_head_power": 10,
"left_middle_power": 10,
"right_foot_power": 10,
"right_head_power": 10,
"right_middle_power": 10,
"hour": 20,
"minute": 15,
}
A list containing Mattress State Jobs
Example:
[
{
"hour": 20,
"left_foot_power": 10,
"left_head_power": 10,
"left_middle_power": 10,
"minute": 15,
"right_foot_power": 10,
"right_head_power": 10,
"right_middle_power": 10
},
{
"hour": 22,
"left_foot_power": 3,
"left_head_power": 0,
"left_middle_power": 0,
"minute": 0,
"right_foot_power": 3,
"right_head_power": 0,
"right_middle_power": 0
},
{
"hour": 7,
"left_foot_power": 0,
"left_head_power": 0,
"left_middle_power": 0,
"minute": 0,
"right_foot_power": 0,
"right_head_power": 0,
"right_middle_power": 0
}
]
Snuggletronics Readme and Instructions
by Jeremy Franklin-Ross is licensed under a Creative Commons Attribution 4.0 International License .
Based on a work at https://github.com/majikthys/snuggletronics/.
Application and software is licensed in MIT License: https://github.com/majikthys/snuggletronics/blob/master/LICENSE