Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .build_scripts/deploy.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -e # halt script on error

# If this is the publish branch, push it up to gh-pages
if [ $TRAVIS_PULL_REQUEST = "false" ] && [ $TRAVIS_BRANCH = "master" ]; then
echo "Get ready, we're publishing!"
npm install -g aglio
mkdir -p dist
aglio -t slate -i docs/docs.md -o dist/output.html
cd dist
echo ".DS_Store" > .gitignore
git init
git config user.name "Travis-CI"
git config user.email "travis@somewhere.com"
git add .
git commit -m "CI deploy to gh-pages"
git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages
rm -rf .git/
else
echo "Not a publishable branch so we're all done here"
fi
18 changes: 18 additions & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
language: python
python:
- '2.7'

branches:
only:
- master

env:
global:
- GH_REF=github.com/developmentseed/dustduino-server.git
- secure: IcLbFaMe4sIwFdwlWG7ZFiSdVIK0UzYrPPltIcKOMT6p3qw37KOjL7+WtuW3OkG3tAtl1tB2OLkQaHjPa+C2tZT6pprkA+3W+0fs5vECRCJW+Kq4CFTp32s323AxR1bUAwyw8/F4f2UfmnhrCYlcR/P8IqTkUI2lUSpbMwd+Jn8=

before_install:
- chmod +x ./.build_scripts/deploy.sh

after_success:
- "./.build_scripts/deploy.sh"
162 changes: 162 additions & 0 deletions docs/docs.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
FORMAT: 1A
HOST: https://brazil-sensor.herokuapp.com

# A REST API for Sensor Data

[This REST API](https://brazil-sensor.herokuapp.com/api/v1/) collects data from dustDuino air sensors and allow users to query them.

# The API Root [/api/v1]

This resource does not have any attributes. Instead it offers the initial
API affordances in the form of the links in the JSON body.

It is recommend to follow the “url” link values,
[Link](https://tools.ietf.org/html/rfc5988) or Location headers where
applicable to retrieve resources. Instead of constructing your own URLs,
to keep your client decoupled from implementation details.

## Retrieve the Entry Point [GET]

+ Response 200 (application/json)

{
"readings": "http://brazil-sensor.herokuapp.com/api/v1/readings/",
"sensors": "http://brazil-sensor.herokuapp.com/api/v1/sensors/"
}

## Readings [/api/v1/readings/{?sensor_id,email,start,end}]

### List readings

Returns all readings from sensors. Please note that the readings are returned per hour. Each fields is the average value of readings during the hour.

A reading object has the following attributes:

+ `pm10` - Particulate matter smaller than about 10 micrometers
+ `pm25` - Particulate matter smaller than about 25 micrometers
+ `pm10count` - Particulate matter counter for paricles smaller than about 10 micrometers
+ `pm25count` - Particulate matter counter for paricles smaller than about 25 micrometers
+ `sensor` - Sensor ID
+ `hour_code` - The hour in which the reading average is calculated | format: YYYYMMDDHH

### Retrieve Readings List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... ID for a particular sensor
+ email (optional, string, `email@example.com`) ... email address with which the sensor is registered
+ start (optional, date, `2014-12-31`) ... The start date for readings | format: YYYY-MM-DD
+ end (optional, date, `2015-12-31`) ... The end date for readings | format: YYYY-MM-DD

+ Response 200 (application/json)

{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"pm25count": 0.0,
"pm10": 1.0,
"pm10count": 3.0,
"hour_code": "2015042818",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 7.0,
"pm10": 6.0,
"pm10count": 3.0,
"hour_code": "2015042819",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 100.0,
"pm10": 1.0,
"pm10count": 300.0,
"hour_code": "2015042820",
"sensor": 4,
"pm25": 45.0
}
]
}

### Create a New Reading [POST]

+ Parameters
+ pm10 (optional, number, `1`) ... Particulate matter smaller than about 10 micrometers
+ pm25 (optional, number, `1`) ... Particulate matter smaller than about 25 micrometers
+ pm10count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 10 micrometers
+ pm25count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 25 micrometers

+ Request

+ Header

Authorization: Token yourtoken

+ Response 200 (application/json)

{
"id": 1,
"created": "2015-04-28T19:43:20.141296Z",
"hour_code": "2015042819",
"pm10": 12,
"pm25": 0,
"pm10count": 100,
"pm25count": 130,
"sensor": 3
}


## Sensors [/api/v1/sensors/{sensor_id}]

Returns the list of active sensors.

A sensor object has the following attributes:

+ `id` - unique sensor ID
+ `sensor_name` - sensor's name
+ `lat` - sensor's latitude
+ `lon` - sensor's longitude
+ `address` - sensor's address
+ `serial` - sensor's serial number
+ `description` - sensor's description
+ `account` - user account associated with the sensor
+ `last_reading` - the latest reading object

### View Sensors List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... sensor unique ID


+ Response 200 (application/json)

{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"sensor_name": "jumpy-bronze-mongrel",
"lat": -23.55187083133668,
"lon": -46.65361404418945,
"address": null,
"serial": null,
"description": "Enter a description of your device",
"account": 7,
"last_reading": {
"sensor_id": 2,
"pm25count": 12,
"pm10": 10,
"created": "2015-04-28T19:52:17.836Z",
"pm10count": 3,
"hour_code": "2015042819",
"id": 3,
"pm25": 2
}
}
]
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
update master by scisco · Pull Request #17 · developmentseed/dustduino-server · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .build_scripts/deploy.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -e # halt script on error

# If this is the publish branch, push it up to gh-pages
if [ $TRAVIS_PULL_REQUEST = "false" ] && [ $TRAVIS_BRANCH = "master" ]; then
echo "Get ready, we're publishing!"
npm install -g aglio
mkdir -p dist
aglio -t slate -i docs/docs.md -o dist/output.html
cd dist
echo ".DS_Store" > .gitignore
git init
git config user.name "Travis-CI"
git config user.email "travis@somewhere.com"
git add .
git commit -m "CI deploy to gh-pages"
git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages
rm -rf .git/
else
echo "Not a publishable branch so we're all done here"
fi
18 changes: 18 additions & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
language: python
python:
- '2.7'

branches:
only:
- master

env:
global:
- GH_REF=github.com/developmentseed/dustduino-server.git
- secure: IcLbFaMe4sIwFdwlWG7ZFiSdVIK0UzYrPPltIcKOMT6p3qw37KOjL7+WtuW3OkG3tAtl1tB2OLkQaHjPa+C2tZT6pprkA+3W+0fs5vECRCJW+Kq4CFTp32s323AxR1bUAwyw8/F4f2UfmnhrCYlcR/P8IqTkUI2lUSpbMwd+Jn8=

before_install:
- chmod +x ./.build_scripts/deploy.sh

after_success:
- "./.build_scripts/deploy.sh"
162 changes: 162 additions & 0 deletions docs/docs.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
FORMAT: 1A
HOST: https://brazil-sensor.herokuapp.com

# A REST API for Sensor Data

[This REST API](https://brazil-sensor.herokuapp.com/api/v1/) collects data from dustDuino air sensors and allow users to query them.

# The API Root [/api/v1]

This resource does not have any attributes. Instead it offers the initial
API affordances in the form of the links in the JSON body.

It is recommend to follow the “url” link values,
[Link](https://tools.ietf.org/html/rfc5988) or Location headers where
applicable to retrieve resources. Instead of constructing your own URLs,
to keep your client decoupled from implementation details.

## Retrieve the Entry Point [GET]

+ Response 200 (application/json)

{
"readings": "http://brazil-sensor.herokuapp.com/api/v1/readings/",
"sensors": "http://brazil-sensor.herokuapp.com/api/v1/sensors/"
}

## Readings [/api/v1/readings/{?sensor_id,email,start,end}]

### List readings

Returns all readings from sensors. Please note that the readings are returned per hour. Each fields is the average value of readings during the hour.

A reading object has the following attributes:

+ `pm10` - Particulate matter smaller than about 10 micrometers
+ `pm25` - Particulate matter smaller than about 25 micrometers
+ `pm10count` - Particulate matter counter for paricles smaller than about 10 micrometers
+ `pm25count` - Particulate matter counter for paricles smaller than about 25 micrometers
+ `sensor` - Sensor ID
+ `hour_code` - The hour in which the reading average is calculated | format: YYYYMMDDHH

### Retrieve Readings List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... ID for a particular sensor
+ email (optional, string, `email@example.com`) ... email address with which the sensor is registered
+ start (optional, date, `2014-12-31`) ... The start date for readings | format: YYYY-MM-DD
+ end (optional, date, `2015-12-31`) ... The end date for readings | format: YYYY-MM-DD

+ Response 200 (application/json)

{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"pm25count": 0.0,
"pm10": 1.0,
"pm10count": 3.0,
"hour_code": "2015042818",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 7.0,
"pm10": 6.0,
"pm10count": 3.0,
"hour_code": "2015042819",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 100.0,
"pm10": 1.0,
"pm10count": 300.0,
"hour_code": "2015042820",
"sensor": 4,
"pm25": 45.0
}
]
}

### Create a New Reading [POST]

+ Parameters
+ pm10 (optional, number, `1`) ... Particulate matter smaller than about 10 micrometers
+ pm25 (optional, number, `1`) ... Particulate matter smaller than about 25 micrometers
+ pm10count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 10 micrometers
+ pm25count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 25 micrometers

+ Request

+ Header

Authorization: Token yourtoken

+ Response 200 (application/json)

{
"id": 1,
"created": "2015-04-28T19:43:20.141296Z",
"hour_code": "2015042819",
"pm10": 12,
"pm25": 0,
"pm10count": 100,
"pm25count": 130,
"sensor": 3
}


## Sensors [/api/v1/sensors/{sensor_id}]

Returns the list of active sensors.

A sensor object has the following attributes:

+ `id` - unique sensor ID
+ `sensor_name` - sensor's name
+ `lat` - sensor's latitude
+ `lon` - sensor's longitude
+ `address` - sensor's address
+ `serial` - sensor's serial number
+ `description` - sensor's description
+ `account` - user account associated with the sensor
+ `last_reading` - the latest reading object

### View Sensors List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... sensor unique ID


+ Response 200 (application/json)

{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"sensor_name": "jumpy-bronze-mongrel",
"lat": -23.55187083133668,
"lon": -46.65361404418945,
"address": null,
"serial": null,
"description": "Enter a description of your device",
"account": 7,
"last_reading": {
"sensor_id": 2,
"pm25count": 12,
"pm10": 10,
"created": "2015-04-28T19:52:17.836Z",
"pm10count": 3,
"hour_code": "2015042819",
"id": 3,
"pm25": 2
}
}
]
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' update master by scisco · Pull Request #17 · developmentseed/dustduino-server · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .build_scripts/deploy.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -e # halt script on error

# If this is the publish branch, push it up to gh-pages
if [ $TRAVIS_PULL_REQUEST = "false" ] && [ $TRAVIS_BRANCH = "master" ]; then
echo "Get ready, we're publishing!"
npm install -g aglio
mkdir -p dist
aglio -t slate -i docs/docs.md -o dist/output.html
cd dist
echo ".DS_Store" > .gitignore
git init
git config user.name "Travis-CI"
git config user.email "travis@somewhere.com"
git add .
git commit -m "CI deploy to gh-pages"
git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages
rm -rf .git/
else
echo "Not a publishable branch so we're all done here"
fi
18 changes: 18 additions & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
language: python
python:
- '2.7'

branches:
only:
- master

env:
global:
- GH_REF=github.com/developmentseed/dustduino-server.git
- secure: IcLbFaMe4sIwFdwlWG7ZFiSdVIK0UzYrPPltIcKOMT6p3qw37KOjL7+WtuW3OkG3tAtl1tB2OLkQaHjPa+C2tZT6pprkA+3W+0fs5vECRCJW+Kq4CFTp32s323AxR1bUAwyw8/F4f2UfmnhrCYlcR/P8IqTkUI2lUSpbMwd+Jn8=

before_install:
- chmod +x ./.build_scripts/deploy.sh

after_success:
- "./.build_scripts/deploy.sh"
162 changes: 162 additions & 0 deletions docs/docs.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
FORMAT: 1A
HOST: https://brazil-sensor.herokuapp.com

# A REST API for Sensor Data

[This REST API](https://brazil-sensor.herokuapp.com/api/v1/) collects data from dustDuino air sensors and allow users to query them.

# The API Root [/api/v1]

This resource does not have any attributes. Instead it offers the initial
API affordances in the form of the links in the JSON body.

It is recommend to follow the “url” link values,
[Link](https://tools.ietf.org/html/rfc5988) or Location headers where
applicable to retrieve resources. Instead of constructing your own URLs,
to keep your client decoupled from implementation details.

## Retrieve the Entry Point [GET]

+ Response 200 (application/json)

{
"readings": "http://brazil-sensor.herokuapp.com/api/v1/readings/",
"sensors": "http://brazil-sensor.herokuapp.com/api/v1/sensors/"
}

## Readings [/api/v1/readings/{?sensor_id,email,start,end}]

### List readings

Returns all readings from sensors. Please note that the readings are returned per hour. Each fields is the average value of readings during the hour.

A reading object has the following attributes:

+ `pm10` - Particulate matter smaller than about 10 micrometers
+ `pm25` - Particulate matter smaller than about 25 micrometers
+ `pm10count` - Particulate matter counter for paricles smaller than about 10 micrometers
+ `pm25count` - Particulate matter counter for paricles smaller than about 25 micrometers
+ `sensor` - Sensor ID
+ `hour_code` - The hour in which the reading average is calculated | format: YYYYMMDDHH

### Retrieve Readings List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... ID for a particular sensor
+ email (optional, string, `email@example.com`) ... email address with which the sensor is registered
+ start (optional, date, `2014-12-31`) ... The start date for readings | format: YYYY-MM-DD
+ end (optional, date, `2015-12-31`) ... The end date for readings | format: YYYY-MM-DD

+ Response 200 (application/json)

{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"pm25count": 0.0,
"pm10": 1.0,
"pm10count": 3.0,
"hour_code": "2015042818",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 7.0,
"pm10": 6.0,
"pm10count": 3.0,
"hour_code": "2015042819",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 100.0,
"pm10": 1.0,
"pm10count": 300.0,
"hour_code": "2015042820",
"sensor": 4,
"pm25": 45.0
}
]
}

### Create a New Reading [POST]

+ Parameters
+ pm10 (optional, number, `1`) ... Particulate matter smaller than about 10 micrometers
+ pm25 (optional, number, `1`) ... Particulate matter smaller than about 25 micrometers
+ pm10count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 10 micrometers
+ pm25count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 25 micrometers

+ Request

+ Header

Authorization: Token yourtoken

+ Response 200 (application/json)

{
"id": 1,
"created": "2015-04-28T19:43:20.141296Z",
"hour_code": "2015042819",
"pm10": 12,
"pm25": 0,
"pm10count": 100,
"pm25count": 130,
"sensor": 3
}


## Sensors [/api/v1/sensors/{sensor_id}]

Returns the list of active sensors.

A sensor object has the following attributes:

+ `id` - unique sensor ID
+ `sensor_name` - sensor's name
+ `lat` - sensor's latitude
+ `lon` - sensor's longitude
+ `address` - sensor's address
+ `serial` - sensor's serial number
+ `description` - sensor's description
+ `account` - user account associated with the sensor
+ `last_reading` - the latest reading object

### View Sensors List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... sensor unique ID


+ Response 200 (application/json)

{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"sensor_name": "jumpy-bronze-mongrel",
"lat": -23.55187083133668,
"lon": -46.65361404418945,
"address": null,
"serial": null,
"description": "Enter a description of your device",
"account": 7,
"last_reading": {
"sensor_id": 2,
"pm25count": 12,
"pm10": 10,
"created": "2015-04-28T19:52:17.836Z",
"pm10count": 3,
"hour_code": "2015042819",
"id": 3,
"pm25": 2
}
}
]
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' update master by scisco · Pull Request #17 · developmentseed/dustduino-server · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .build_scripts/deploy.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -e # halt script on error

# If this is the publish branch, push it up to gh-pages
if [ $TRAVIS_PULL_REQUEST = "false" ] && [ $TRAVIS_BRANCH = "master" ]; then
echo "Get ready, we're publishing!"
npm install -g aglio
mkdir -p dist
aglio -t slate -i docs/docs.md -o dist/output.html
cd dist
echo ".DS_Store" > .gitignore
git init
git config user.name "Travis-CI"
git config user.email "travis@somewhere.com"
git add .
git commit -m "CI deploy to gh-pages"
git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages
rm -rf .git/
else
echo "Not a publishable branch so we're all done here"
fi
18 changes: 18 additions & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
language: python
python:
- '2.7'

branches:
only:
- master

env:
global:
- GH_REF=github.com/developmentseed/dustduino-server.git
- secure: IcLbFaMe4sIwFdwlWG7ZFiSdVIK0UzYrPPltIcKOMT6p3qw37KOjL7+WtuW3OkG3tAtl1tB2OLkQaHjPa+C2tZT6pprkA+3W+0fs5vECRCJW+Kq4CFTp32s323AxR1bUAwyw8/F4f2UfmnhrCYlcR/P8IqTkUI2lUSpbMwd+Jn8=

before_install:
- chmod +x ./.build_scripts/deploy.sh

after_success:
- "./.build_scripts/deploy.sh"
162 changes: 162 additions & 0 deletions docs/docs.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
FORMAT: 1A
HOST: https://brazil-sensor.herokuapp.com

# A REST API for Sensor Data

[This REST API](https://brazil-sensor.herokuapp.com/api/v1/) collects data from dustDuino air sensors and allow users to query them.

# The API Root [/api/v1]

This resource does not have any attributes. Instead it offers the initial
API affordances in the form of the links in the JSON body.

It is recommend to follow the “url” link values,
[Link](https://tools.ietf.org/html/rfc5988) or Location headers where
applicable to retrieve resources. Instead of constructing your own URLs,
to keep your client decoupled from implementation details.

## Retrieve the Entry Point [GET]

+ Response 200 (application/json)

{
"readings": "http://brazil-sensor.herokuapp.com/api/v1/readings/",
"sensors": "http://brazil-sensor.herokuapp.com/api/v1/sensors/"
}

## Readings [/api/v1/readings/{?sensor_id,email,start,end}]

### List readings

Returns all readings from sensors. Please note that the readings are returned per hour. Each fields is the average value of readings during the hour.

A reading object has the following attributes:

+ `pm10` - Particulate matter smaller than about 10 micrometers
+ `pm25` - Particulate matter smaller than about 25 micrometers
+ `pm10count` - Particulate matter counter for paricles smaller than about 10 micrometers
+ `pm25count` - Particulate matter counter for paricles smaller than about 25 micrometers
+ `sensor` - Sensor ID
+ `hour_code` - The hour in which the reading average is calculated | format: YYYYMMDDHH

### Retrieve Readings List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... ID for a particular sensor
+ email (optional, string, `email@example.com`) ... email address with which the sensor is registered
+ start (optional, date, `2014-12-31`) ... The start date for readings | format: YYYY-MM-DD
+ end (optional, date, `2015-12-31`) ... The end date for readings | format: YYYY-MM-DD

+ Response 200 (application/json)

{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"pm25count": 0.0,
"pm10": 1.0,
"pm10count": 3.0,
"hour_code": "2015042818",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 7.0,
"pm10": 6.0,
"pm10count": 3.0,
"hour_code": "2015042819",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 100.0,
"pm10": 1.0,
"pm10count": 300.0,
"hour_code": "2015042820",
"sensor": 4,
"pm25": 45.0
}
]
}

### Create a New Reading [POST]

+ Parameters
+ pm10 (optional, number, `1`) ... Particulate matter smaller than about 10 micrometers
+ pm25 (optional, number, `1`) ... Particulate matter smaller than about 25 micrometers
+ pm10count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 10 micrometers
+ pm25count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 25 micrometers

+ Request

+ Header

Authorization: Token yourtoken

+ Response 200 (application/json)

{
"id": 1,
"created": "2015-04-28T19:43:20.141296Z",
"hour_code": "2015042819",
"pm10": 12,
"pm25": 0,
"pm10count": 100,
"pm25count": 130,
"sensor": 3
}


## Sensors [/api/v1/sensors/{sensor_id}]

Returns the list of active sensors.

A sensor object has the following attributes:

+ `id` - unique sensor ID
+ `sensor_name` - sensor's name
+ `lat` - sensor's latitude
+ `lon` - sensor's longitude
+ `address` - sensor's address
+ `serial` - sensor's serial number
+ `description` - sensor's description
+ `account` - user account associated with the sensor
+ `last_reading` - the latest reading object

### View Sensors List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... sensor unique ID


+ Response 200 (application/json)

{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"sensor_name": "jumpy-bronze-mongrel",
"lat": -23.55187083133668,
"lon": -46.65361404418945,
"address": null,
"serial": null,
"description": "Enter a description of your device",
"account": 7,
"last_reading": {
"sensor_id": 2,
"pm25count": 12,
"pm10": 10,
"created": "2015-04-28T19:52:17.836Z",
"pm10count": 3,
"hour_code": "2015042819",
"id": 3,
"pm25": 2
}
}
]
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' update master by scisco · Pull Request #17 · developmentseed/dustduino-server · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .build_scripts/deploy.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -e # halt script on error

# If this is the publish branch, push it up to gh-pages
if [ $TRAVIS_PULL_REQUEST = "false" ] && [ $TRAVIS_BRANCH = "master" ]; then
echo "Get ready, we're publishing!"
npm install -g aglio
mkdir -p dist
aglio -t slate -i docs/docs.md -o dist/output.html
cd dist
echo ".DS_Store" > .gitignore
git init
git config user.name "Travis-CI"
git config user.email "travis@somewhere.com"
git add .
git commit -m "CI deploy to gh-pages"
git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages
rm -rf .git/
else
echo "Not a publishable branch so we're all done here"
fi
18 changes: 18 additions & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
language: python
python:
- '2.7'

branches:
only:
- master

env:
global:
- GH_REF=github.com/developmentseed/dustduino-server.git
- secure: IcLbFaMe4sIwFdwlWG7ZFiSdVIK0UzYrPPltIcKOMT6p3qw37KOjL7+WtuW3OkG3tAtl1tB2OLkQaHjPa+C2tZT6pprkA+3W+0fs5vECRCJW+Kq4CFTp32s323AxR1bUAwyw8/F4f2UfmnhrCYlcR/P8IqTkUI2lUSpbMwd+Jn8=

before_install:
- chmod +x ./.build_scripts/deploy.sh

after_success:
- "./.build_scripts/deploy.sh"
162 changes: 162 additions & 0 deletions docs/docs.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
FORMAT: 1A
HOST: https://brazil-sensor.herokuapp.com

# A REST API for Sensor Data

[This REST API](https://brazil-sensor.herokuapp.com/api/v1/) collects data from dustDuino air sensors and allow users to query them.

# The API Root [/api/v1]

This resource does not have any attributes. Instead it offers the initial
API affordances in the form of the links in the JSON body.

It is recommend to follow the “url” link values,
[Link](https://tools.ietf.org/html/rfc5988) or Location headers where
applicable to retrieve resources. Instead of constructing your own URLs,
to keep your client decoupled from implementation details.

## Retrieve the Entry Point [GET]

+ Response 200 (application/json)

{
"readings": "http://brazil-sensor.herokuapp.com/api/v1/readings/",
"sensors": "http://brazil-sensor.herokuapp.com/api/v1/sensors/"
}

## Readings [/api/v1/readings/{?sensor_id,email,start,end}]

### List readings

Returns all readings from sensors. Please note that the readings are returned per hour. Each fields is the average value of readings during the hour.

A reading object has the following attributes:

+ `pm10` - Particulate matter smaller than about 10 micrometers
+ `pm25` - Particulate matter smaller than about 25 micrometers
+ `pm10count` - Particulate matter counter for paricles smaller than about 10 micrometers
+ `pm25count` - Particulate matter counter for paricles smaller than about 25 micrometers
+ `sensor` - Sensor ID
+ `hour_code` - The hour in which the reading average is calculated | format: YYYYMMDDHH

### Retrieve Readings List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... ID for a particular sensor
+ email (optional, string, `email@example.com`) ... email address with which the sensor is registered
+ start (optional, date, `2014-12-31`) ... The start date for readings | format: YYYY-MM-DD
+ end (optional, date, `2015-12-31`) ... The end date for readings | format: YYYY-MM-DD

+ Response 200 (application/json)

{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"pm25count": 0.0,
"pm10": 1.0,
"pm10count": 3.0,
"hour_code": "2015042818",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 7.0,
"pm10": 6.0,
"pm10count": 3.0,
"hour_code": "2015042819",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 100.0,
"pm10": 1.0,
"pm10count": 300.0,
"hour_code": "2015042820",
"sensor": 4,
"pm25": 45.0
}
]
}

### Create a New Reading [POST]

+ Parameters
+ pm10 (optional, number, `1`) ... Particulate matter smaller than about 10 micrometers
+ pm25 (optional, number, `1`) ... Particulate matter smaller than about 25 micrometers
+ pm10count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 10 micrometers
+ pm25count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 25 micrometers

+ Request

+ Header

Authorization: Token yourtoken

+ Response 200 (application/json)

{
"id": 1,
"created": "2015-04-28T19:43:20.141296Z",
"hour_code": "2015042819",
"pm10": 12,
"pm25": 0,
"pm10count": 100,
"pm25count": 130,
"sensor": 3
}


## Sensors [/api/v1/sensors/{sensor_id}]

Returns the list of active sensors.

A sensor object has the following attributes:

+ `id` - unique sensor ID
+ `sensor_name` - sensor's name
+ `lat` - sensor's latitude
+ `lon` - sensor's longitude
+ `address` - sensor's address
+ `serial` - sensor's serial number
+ `description` - sensor's description
+ `account` - user account associated with the sensor
+ `last_reading` - the latest reading object

### View Sensors List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... sensor unique ID


+ Response 200 (application/json)

{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"sensor_name": "jumpy-bronze-mongrel",
"lat": -23.55187083133668,
"lon": -46.65361404418945,
"address": null,
"serial": null,
"description": "Enter a description of your device",
"account": 7,
"last_reading": {
"sensor_id": 2,
"pm25count": 12,
"pm10": 10,
"created": "2015-04-28T19:52:17.836Z",
"pm10count": 3,
"hour_code": "2015042819",
"id": 3,
"pm25": 2
}
}
]
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' update master by scisco · Pull Request #17 · developmentseed/dustduino-server · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .build_scripts/deploy.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -e # halt script on error

# If this is the publish branch, push it up to gh-pages
if [ $TRAVIS_PULL_REQUEST = "false" ] && [ $TRAVIS_BRANCH = "master" ]; then
echo "Get ready, we're publishing!"
npm install -g aglio
mkdir -p dist
aglio -t slate -i docs/docs.md -o dist/output.html
cd dist
echo ".DS_Store" > .gitignore
git init
git config user.name "Travis-CI"
git config user.email "travis@somewhere.com"
git add .
git commit -m "CI deploy to gh-pages"
git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages
rm -rf .git/
else
echo "Not a publishable branch so we're all done here"
fi
18 changes: 18 additions & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
language: python
python:
- '2.7'

branches:
only:
- master

env:
global:
- GH_REF=github.com/developmentseed/dustduino-server.git
- secure: IcLbFaMe4sIwFdwlWG7ZFiSdVIK0UzYrPPltIcKOMT6p3qw37KOjL7+WtuW3OkG3tAtl1tB2OLkQaHjPa+C2tZT6pprkA+3W+0fs5vECRCJW+Kq4CFTp32s323AxR1bUAwyw8/F4f2UfmnhrCYlcR/P8IqTkUI2lUSpbMwd+Jn8=

before_install:
- chmod +x ./.build_scripts/deploy.sh

after_success:
- "./.build_scripts/deploy.sh"
162 changes: 162 additions & 0 deletions docs/docs.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
FORMAT: 1A
HOST: https://brazil-sensor.herokuapp.com

# A REST API for Sensor Data

[This REST API](https://brazil-sensor.herokuapp.com/api/v1/) collects data from dustDuino air sensors and allow users to query them.

# The API Root [/api/v1]

This resource does not have any attributes. Instead it offers the initial
API affordances in the form of the links in the JSON body.

It is recommend to follow the “url” link values,
[Link](https://tools.ietf.org/html/rfc5988) or Location headers where
applicable to retrieve resources. Instead of constructing your own URLs,
to keep your client decoupled from implementation details.

## Retrieve the Entry Point [GET]

+ Response 200 (application/json)

{
"readings": "http://brazil-sensor.herokuapp.com/api/v1/readings/",
"sensors": "http://brazil-sensor.herokuapp.com/api/v1/sensors/"
}

## Readings [/api/v1/readings/{?sensor_id,email,start,end}]

### List readings

Returns all readings from sensors. Please note that the readings are returned per hour. Each fields is the average value of readings during the hour.

A reading object has the following attributes:

+ `pm10` - Particulate matter smaller than about 10 micrometers
+ `pm25` - Particulate matter smaller than about 25 micrometers
+ `pm10count` - Particulate matter counter for paricles smaller than about 10 micrometers
+ `pm25count` - Particulate matter counter for paricles smaller than about 25 micrometers
+ `sensor` - Sensor ID
+ `hour_code` - The hour in which the reading average is calculated | format: YYYYMMDDHH

### Retrieve Readings List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... ID for a particular sensor
+ email (optional, string, `email@example.com`) ... email address with which the sensor is registered
+ start (optional, date, `2014-12-31`) ... The start date for readings | format: YYYY-MM-DD
+ end (optional, date, `2015-12-31`) ... The end date for readings | format: YYYY-MM-DD

+ Response 200 (application/json)

{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"pm25count": 0.0,
"pm10": 1.0,
"pm10count": 3.0,
"hour_code": "2015042818",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 7.0,
"pm10": 6.0,
"pm10count": 3.0,
"hour_code": "2015042819",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 100.0,
"pm10": 1.0,
"pm10count": 300.0,
"hour_code": "2015042820",
"sensor": 4,
"pm25": 45.0
}
]
}

### Create a New Reading [POST]

+ Parameters
+ pm10 (optional, number, `1`) ... Particulate matter smaller than about 10 micrometers
+ pm25 (optional, number, `1`) ... Particulate matter smaller than about 25 micrometers
+ pm10count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 10 micrometers
+ pm25count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 25 micrometers

+ Request

+ Header

Authorization: Token yourtoken

+ Response 200 (application/json)

{
"id": 1,
"created": "2015-04-28T19:43:20.141296Z",
"hour_code": "2015042819",
"pm10": 12,
"pm25": 0,
"pm10count": 100,
"pm25count": 130,
"sensor": 3
}


## Sensors [/api/v1/sensors/{sensor_id}]

Returns the list of active sensors.

A sensor object has the following attributes:

+ `id` - unique sensor ID
+ `sensor_name` - sensor's name
+ `lat` - sensor's latitude
+ `lon` - sensor's longitude
+ `address` - sensor's address
+ `serial` - sensor's serial number
+ `description` - sensor's description
+ `account` - user account associated with the sensor
+ `last_reading` - the latest reading object

### View Sensors List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... sensor unique ID


+ Response 200 (application/json)

{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"sensor_name": "jumpy-bronze-mongrel",
"lat": -23.55187083133668,
"lon": -46.65361404418945,
"address": null,
"serial": null,
"description": "Enter a description of your device",
"account": 7,
"last_reading": {
"sensor_id": 2,
"pm25count": 12,
"pm10": 10,
"created": "2015-04-28T19:52:17.836Z",
"pm10count": 3,
"hour_code": "2015042819",
"id": 3,
"pm25": 2
}
}
]
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' update master by scisco · Pull Request #17 · developmentseed/dustduino-server · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .build_scripts/deploy.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -e # halt script on error

# If this is the publish branch, push it up to gh-pages
if [ $TRAVIS_PULL_REQUEST = "false" ] && [ $TRAVIS_BRANCH = "master" ]; then
echo "Get ready, we're publishing!"
npm install -g aglio
mkdir -p dist
aglio -t slate -i docs/docs.md -o dist/output.html
cd dist
echo ".DS_Store" > .gitignore
git init
git config user.name "Travis-CI"
git config user.email "travis@somewhere.com"
git add .
git commit -m "CI deploy to gh-pages"
git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages
rm -rf .git/
else
echo "Not a publishable branch so we're all done here"
fi
18 changes: 18 additions & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
language: python
python:
- '2.7'

branches:
only:
- master

env:
global:
- GH_REF=github.com/developmentseed/dustduino-server.git
- secure: IcLbFaMe4sIwFdwlWG7ZFiSdVIK0UzYrPPltIcKOMT6p3qw37KOjL7+WtuW3OkG3tAtl1tB2OLkQaHjPa+C2tZT6pprkA+3W+0fs5vECRCJW+Kq4CFTp32s323AxR1bUAwyw8/F4f2UfmnhrCYlcR/P8IqTkUI2lUSpbMwd+Jn8=

before_install:
- chmod +x ./.build_scripts/deploy.sh

after_success:
- "./.build_scripts/deploy.sh"
162 changes: 162 additions & 0 deletions docs/docs.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
FORMAT: 1A
HOST: https://brazil-sensor.herokuapp.com

# A REST API for Sensor Data

[This REST API](https://brazil-sensor.herokuapp.com/api/v1/) collects data from dustDuino air sensors and allow users to query them.

# The API Root [/api/v1]

This resource does not have any attributes. Instead it offers the initial
API affordances in the form of the links in the JSON body.

It is recommend to follow the “url” link values,
[Link](https://tools.ietf.org/html/rfc5988) or Location headers where
applicable to retrieve resources. Instead of constructing your own URLs,
to keep your client decoupled from implementation details.

## Retrieve the Entry Point [GET]

+ Response 200 (application/json)

{
"readings": "http://brazil-sensor.herokuapp.com/api/v1/readings/",
"sensors": "http://brazil-sensor.herokuapp.com/api/v1/sensors/"
}

## Readings [/api/v1/readings/{?sensor_id,email,start,end}]

### List readings

Returns all readings from sensors. Please note that the readings are returned per hour. Each fields is the average value of readings during the hour.

A reading object has the following attributes:

+ `pm10` - Particulate matter smaller than about 10 micrometers
+ `pm25` - Particulate matter smaller than about 25 micrometers
+ `pm10count` - Particulate matter counter for paricles smaller than about 10 micrometers
+ `pm25count` - Particulate matter counter for paricles smaller than about 25 micrometers
+ `sensor` - Sensor ID
+ `hour_code` - The hour in which the reading average is calculated | format: YYYYMMDDHH

### Retrieve Readings List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... ID for a particular sensor
+ email (optional, string, `email@example.com`) ... email address with which the sensor is registered
+ start (optional, date, `2014-12-31`) ... The start date for readings | format: YYYY-MM-DD
+ end (optional, date, `2015-12-31`) ... The end date for readings | format: YYYY-MM-DD

+ Response 200 (application/json)

{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"pm25count": 0.0,
"pm10": 1.0,
"pm10count": 3.0,
"hour_code": "2015042818",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 7.0,
"pm10": 6.0,
"pm10count": 3.0,
"hour_code": "2015042819",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 100.0,
"pm10": 1.0,
"pm10count": 300.0,
"hour_code": "2015042820",
"sensor": 4,
"pm25": 45.0
}
]
}

### Create a New Reading [POST]

+ Parameters
+ pm10 (optional, number, `1`) ... Particulate matter smaller than about 10 micrometers
+ pm25 (optional, number, `1`) ... Particulate matter smaller than about 25 micrometers
+ pm10count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 10 micrometers
+ pm25count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 25 micrometers

+ Request

+ Header

Authorization: Token yourtoken

+ Response 200 (application/json)

{
"id": 1,
"created": "2015-04-28T19:43:20.141296Z",
"hour_code": "2015042819",
"pm10": 12,
"pm25": 0,
"pm10count": 100,
"pm25count": 130,
"sensor": 3
}


## Sensors [/api/v1/sensors/{sensor_id}]

Returns the list of active sensors.

A sensor object has the following attributes:

+ `id` - unique sensor ID
+ `sensor_name` - sensor's name
+ `lat` - sensor's latitude
+ `lon` - sensor's longitude
+ `address` - sensor's address
+ `serial` - sensor's serial number
+ `description` - sensor's description
+ `account` - user account associated with the sensor
+ `last_reading` - the latest reading object

### View Sensors List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... sensor unique ID


+ Response 200 (application/json)

{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"sensor_name": "jumpy-bronze-mongrel",
"lat": -23.55187083133668,
"lon": -46.65361404418945,
"address": null,
"serial": null,
"description": "Enter a description of your device",
"account": 7,
"last_reading": {
"sensor_id": 2,
"pm25count": 12,
"pm10": 10,
"created": "2015-04-28T19:52:17.836Z",
"pm10count": 3,
"hour_code": "2015042819",
"id": 3,
"pm25": 2
}
}
]
}
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); update master by scisco · Pull Request #17 · developmentseed/dustduino-server · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions .build_scripts/deploy.sh
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
#!/usr/bin/env bash
set -e # halt script on error

# If this is the publish branch, push it up to gh-pages
if [ $TRAVIS_PULL_REQUEST = "false" ] && [ $TRAVIS_BRANCH = "master" ]; then
echo "Get ready, we're publishing!"
npm install -g aglio
mkdir -p dist
aglio -t slate -i docs/docs.md -o dist/output.html
cd dist
echo ".DS_Store" > .gitignore
git init
git config user.name "Travis-CI"
git config user.email "travis@somewhere.com"
git add .
git commit -m "CI deploy to gh-pages"
git push --force --quiet "https://${GH_TOKEN}@${GH_REF}" master:gh-pages
rm -rf .git/
else
echo "Not a publishable branch so we're all done here"
fi
18 changes: 18 additions & 0 deletions .travis.yml
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
language: python
python:
- '2.7'

branches:
only:
- master

env:
global:
- GH_REF=github.com/developmentseed/dustduino-server.git
- secure: IcLbFaMe4sIwFdwlWG7ZFiSdVIK0UzYrPPltIcKOMT6p3qw37KOjL7+WtuW3OkG3tAtl1tB2OLkQaHjPa+C2tZT6pprkA+3W+0fs5vECRCJW+Kq4CFTp32s323AxR1bUAwyw8/F4f2UfmnhrCYlcR/P8IqTkUI2lUSpbMwd+Jn8=

before_install:
- chmod +x ./.build_scripts/deploy.sh

after_success:
- "./.build_scripts/deploy.sh"
162 changes: 162 additions & 0 deletions docs/docs.md
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
FORMAT: 1A
HOST: https://brazil-sensor.herokuapp.com

# A REST API for Sensor Data

[This REST API](https://brazil-sensor.herokuapp.com/api/v1/) collects data from dustDuino air sensors and allow users to query them.

# The API Root [/api/v1]

This resource does not have any attributes. Instead it offers the initial
API affordances in the form of the links in the JSON body.

It is recommend to follow the “url” link values,
[Link](https://tools.ietf.org/html/rfc5988) or Location headers where
applicable to retrieve resources. Instead of constructing your own URLs,
to keep your client decoupled from implementation details.

## Retrieve the Entry Point [GET]

+ Response 200 (application/json)

{
"readings": "http://brazil-sensor.herokuapp.com/api/v1/readings/",
"sensors": "http://brazil-sensor.herokuapp.com/api/v1/sensors/"
}

## Readings [/api/v1/readings/{?sensor_id,email,start,end}]

### List readings

Returns all readings from sensors. Please note that the readings are returned per hour. Each fields is the average value of readings during the hour.

A reading object has the following attributes:

+ `pm10` - Particulate matter smaller than about 10 micrometers
+ `pm25` - Particulate matter smaller than about 25 micrometers
+ `pm10count` - Particulate matter counter for paricles smaller than about 10 micrometers
+ `pm25count` - Particulate matter counter for paricles smaller than about 25 micrometers
+ `sensor` - Sensor ID
+ `hour_code` - The hour in which the reading average is calculated | format: YYYYMMDDHH

### Retrieve Readings List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... ID for a particular sensor
+ email (optional, string, `email@example.com`) ... email address with which the sensor is registered
+ start (optional, date, `2014-12-31`) ... The start date for readings | format: YYYY-MM-DD
+ end (optional, date, `2015-12-31`) ... The end date for readings | format: YYYY-MM-DD

+ Response 200 (application/json)

{
"count": 3,
"next": null,
"previous": null,
"results": [
{
"pm25count": 0.0,
"pm10": 1.0,
"pm10count": 3.0,
"hour_code": "2015042818",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 7.0,
"pm10": 6.0,
"pm10count": 3.0,
"hour_code": "2015042819",
"sensor": 2,
"pm25": 2.0
},
{
"pm25count": 100.0,
"pm10": 1.0,
"pm10count": 300.0,
"hour_code": "2015042820",
"sensor": 4,
"pm25": 45.0
}
]
}

### Create a New Reading [POST]

+ Parameters
+ pm10 (optional, number, `1`) ... Particulate matter smaller than about 10 micrometers
+ pm25 (optional, number, `1`) ... Particulate matter smaller than about 25 micrometers
+ pm10count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 10 micrometers
+ pm25count (optional, number, `1`) ... Particulate matter counter for paricles smaller than about 25 micrometers

+ Request

+ Header

Authorization: Token yourtoken

+ Response 200 (application/json)

{
"id": 1,
"created": "2015-04-28T19:43:20.141296Z",
"hour_code": "2015042819",
"pm10": 12,
"pm25": 0,
"pm10count": 100,
"pm25count": 130,
"sensor": 3
}


## Sensors [/api/v1/sensors/{sensor_id}]

Returns the list of active sensors.

A sensor object has the following attributes:

+ `id` - unique sensor ID
+ `sensor_name` - sensor's name
+ `lat` - sensor's latitude
+ `lon` - sensor's longitude
+ `address` - sensor's address
+ `serial` - sensor's serial number
+ `description` - sensor's description
+ `account` - user account associated with the sensor
+ `last_reading` - the latest reading object

### View Sensors List [GET]

+ Parameters
+ sensor_id (optional, number, `1`) ... sensor unique ID


+ Response 200 (application/json)

{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 2,
"sensor_name": "jumpy-bronze-mongrel",
"lat": -23.55187083133668,
"lon": -46.65361404418945,
"address": null,
"serial": null,
"description": "Enter a description of your device",
"account": 7,
"last_reading": {
"sensor_id": 2,
"pm25count": 12,
"pm10": 10,
"created": "2015-04-28T19:52:17.836Z",
"pm10count": 3,
"hour_code": "2015042819",
"id": 3,
"pm25": 2
}
}
]
}