To deploy your own Raspberry Pi IO server first create a Heroku account and install the Heroku Command Line utility. This link has info about how to do that: https://devcenter.heroku.com/articles/getting-started-with-nodejs#set-up. Once installed, follow these steps:
- Clone this repo:
git clone git@github.com:exitcodezero/raspberry-pi-io-api.git - Create a new Heroku app using the command line inside the cloned directory:
heroku create whatever-you-name-it - Log into the Heroku Dashboard, click on the named app you just created and go to the Settings section. Find the Congif Variables area, click Edit and add the following variables.
JWT_EXPIRES: The number of minutes for an authentication token to remain valid.JWT_SECRET: Any random string of characters. This is used to encrypt the authentication tokens.MONGO_URL: The connection URL for a MongoDB. You can create a free MongoDB at MongoLab that will work with this API.NODE_ENV: Set this toproduction.RABBIT_URL: The connection URL for a RabbitMQ server. You can create a free RabbitMQ server at CloudAMQP that will support up to 3 concurrent connections. That's enough for one connection from the controller application and two Raspberry Pi devices.SYSTEM_API_KEY: Any random string of characters. This will be the value used in theSYSTEM-API-KEYheader (see below).- Deploy:
git push heroku master
- All routes, with the exception of
/pin-configrequire an API key be passed in the headerSYSTEM-API-KEY - All routes, with the exception of
/pin-config,/register,/authenticaterequire an auth token be passed in theAuthorizationheader. The header value should be formattedBearer <token>. A token can be obtained using the/registeror/authenticateroutes. - The
/pin-configroute requires special authentication using three headers.io-user-emailis the email address of a registered user.io-device-idis the ID of a registered device and must also belong to the email inio-user-email.io-user-keyis a secret key generated for a user on the/user/keyroute.
POST: /register
Body:
{
"email": "something@something.com",
"password": "$ecR3tP@ssw0rd"
}Response:
{
"token": "somesuperlongauthtokenstring"
}Status Codes:
201if successful400if incorrect data provided409if email already in use
POST: /authenticate
Body:
{
"email": "something@something.com",
"password": "$ecR3tP@ssw0rd"
}Response:
{
"token": "somesuperlongauthtokenstring"
}Status Codes:
200if successful400if incorrect data provided401if incorrect credentials provided
GET: /user
Response:
{
"email": "something@something.com"
}Status Codes:
200if successful401if not authenticated403ifSYSTEM-API-KEYis missing
DELETE: /user
Response: None
Status Codes:
204if successful401if not authenticated403ifSYSTEM-API-KEYis missing
POST: /user/key
Body: None
Response:
{
"key": "some-secret-user-key"
}Status Codes:
201if successful401if not authenticated403ifSYSTEM-API-KEYis missing
POST: /user/device
Body:
{
"type": "rpiA"
}Response:
{
"_id": "device_id",
"userEmail": "something@something.com",
"type": "rpiA",
"pinConfig": []
}Status Codes:
201if successful400if incorrect data provided401if not authenticated403ifSYSTEM-API-KEYis missing
Accepted type values:
rpiArpiBrpiAPlusrpiBPlusrpi2B
GET: /user/device
Response:
[
{
"_id": "device_id",
"userEmail": "something@something.com",
"type": "rpiA",
"pinConfig": []
}
]Status Codes:
200if successful401if not authenticated403ifSYSTEM-API-KEYis missing
GET: /user/device/:deviceId
Response:
{
"_id": "device_id",
"userEmail": "something@something.com",
"type": "rpiA",
"pinConfig": []
}Status Codes:
200if successful401if not authenticated403ifSYSTEM-API-KEYis missing404if deviceId does not exist
DELETE: /user/device/:deviceId
Response: None
Status Codes:
204if successful401if not authenticated403ifSYSTEM-API-KEYis missing404if deviceId does not exist
POST: /user/device/:deviceId/pin
Body:
{
"pin": 18,
"name": "Red LED",
"mode": "OUT"
}Response:
{
"pin": 18,
"name": "Red LED",
"mode": "OUT",
"initial": "LOW"
}Required Body Properties:
pin- Pin number (integer)name- Custom text label for the pinmode-INorOUT
Optional Body Properties:
resistor-PUD_UPorPUD_DOWNinitial-HIGHorLOWpinEvent-RISING,FALLING,BOTHbounce- Number of milliseconds (integer)
Status Codes:
201if successful400if invalid data401if not authenticated403ifSYSTEM-API-KEYis missing409ifpinis not available fordevice.type
GET: /user/device/:deviceId/pin
Response:
[
{
"pin": 18,
"name": "Red LED",
"mode": "OUT",
"initial": "LOW"
}
]Status Codes:
200if successful401if not authenticated403ifSYSTEM-API-KEYis missing404if deviceId does not exist
GET: /user/device/:deviceId/pin/:pinId
Response:
{
"pin": 18,
"name": "Red LED",
"mode": "OUT",
"initial": "LOW"
}Status Codes:
200if successful401if not authenticated403ifSYSTEM-API-KEYis missing404if deviceId or pinId does not exist
DELETE: /user/device/:deviceId/pin/:pinId
Response: None
Status Codes:
204if successful401if not authenticated403ifSYSTEM-API-KEYis missing404if deviceId or pinId does not exist