mirror of https://github.com/espruino/BangleApps
commit
5c96471940
|
@ -0,0 +1 @@
|
||||||
|
0.01: New App!
|
|
@ -0,0 +1,33 @@
|
||||||
|
# USGS Data reporting
|
||||||
|
|
||||||
|
More information on making apps:
|
||||||
|
|
||||||
|
* http://www.espruino.com/Bangle.js+First+App
|
||||||
|
* http://www.espruino.com/Bangle.js+App+Loader
|
||||||
|
|
||||||
|
Simple app that pulls data from internet API regarding water/stream/river conditions. Useful for fishing or other water sports.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
API information can be found here:
|
||||||
|
https://labs.waterdata.usgs.gov/docs/sensorthings/index.html
|
||||||
|
|
||||||
|
Location can be found via map here:
|
||||||
|
https://maps.waterdata.usgs.gov/mapper/
|
||||||
|
Find the site you're looking for and note the "site number". This will be the "location" setting.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Keyboard is required to change location setting.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
Simple interface will display most current data for the specified location when the app is opened. Settings can change the location, or which data is displayed.
|
||||||
|
|
||||||
|
## Controls
|
||||||
|
|
||||||
|
No controls currently
|
||||||
|
|
||||||
|
## Creator
|
||||||
|
|
||||||
|
inhof009
|
|
@ -0,0 +1 @@
|
||||||
|
require("heatshrink").decompress(atob("mEwwhC/AHeIAAIYYDKkIDAeADFYXDJRECGC0iGCtEkAXPGAkEolAPJ4wEogXMJBIXBSKhGBC6RgCLxoXJLxwXCwc4C4oWMR4UzC65HFIyAXCBAUiAQMCFxheCC40gRpguCC4ouNLwwsCC5QWCIwYXCgQXBIxIuDC6bqDOwwXBIxIuDOw4XDggXICgTtCC4VAC4KQBbI4sEI4oXDggXIdQYXFokCkUgIw4vFAAYXDGANEC6CnBokiC4UBO5JECGAgXBkUkoERC5BgDGAgXEiBIKGAR5DklCC4NBC5AwDCgI0EF4QXJGAbaDDAgXBCxAwCSQgYDwUkOw4wFAAh+EkIXKGAQAJYwIYWfAQA/AHA"))
|
|
@ -0,0 +1,67 @@
|
||||||
|
var dataStreams = {}; // Will hold directions to Datastreams and units, with above keys
|
||||||
|
var FILE = "usgs.json";
|
||||||
|
// Load settings
|
||||||
|
var settings = Object.assign({
|
||||||
|
loc: '03272100',
|
||||||
|
keys: {'Gage height': true, 'Discharge': true, 'Temperature, water': true},
|
||||||
|
shortenedName: {"Gage height":"Ga","Discharge":"Dis","Temperature, water":"Temp"},
|
||||||
|
tempUnitF: true,
|
||||||
|
}, require('Storage').readJSON(FILE, true) || {});
|
||||||
|
function fetchStartup() {
|
||||||
|
uri = "https://labs.waterdata.usgs.gov/sta/v1.1/Things('USGS-" +
|
||||||
|
settings.loc +
|
||||||
|
"')/Datastreams?$expand=Observations($orderby=phenomenonTime%20desc;$top=1;$select=result)&$select=unitOfMeasurement,description";
|
||||||
|
if (Bangle.http) {
|
||||||
|
Bangle.http(uri, {timeout:10000}).then(d => handleStartup(JSON.parse(d.resp).value));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function handleStartup(data) {
|
||||||
|
for (var key1 in data) {
|
||||||
|
desc = data[key1].description.split(" / ")[0];
|
||||||
|
if (settings.keys[desc]) {
|
||||||
|
if (data[key1].unitOfMeasurement.symbol === "degC" && settings.tempUnitF) {
|
||||||
|
symbol = "F";
|
||||||
|
result = (data[key1].Observations[0].result * 9 / 5) + 32;
|
||||||
|
} else {
|
||||||
|
symbol = data[key1].unitOfMeasurement.symbol;
|
||||||
|
result = data[key1].Observations[0].result;
|
||||||
|
}
|
||||||
|
dataStreams[desc] = JSON.parse(
|
||||||
|
'{"unit":"' +
|
||||||
|
symbol +
|
||||||
|
'","value":"' +
|
||||||
|
result +
|
||||||
|
'"}'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
displayData(dataStreams);
|
||||||
|
}
|
||||||
|
|
||||||
|
function displayData(dataStreams) {
|
||||||
|
g.clear();
|
||||||
|
g.setFont("Vector",20);
|
||||||
|
g.setFontAlign(0,0);
|
||||||
|
string = "";
|
||||||
|
for (var key in dataStreams) {
|
||||||
|
unit = dataStreams[key].unit;
|
||||||
|
value = dataStreams[key].value;
|
||||||
|
if (settings.shortenedName[key]) {
|
||||||
|
name = settings.shortenedName[key];
|
||||||
|
} else {
|
||||||
|
name = key;
|
||||||
|
}
|
||||||
|
string += name+": "+value+" "+unit+"\n";
|
||||||
|
}
|
||||||
|
var date = new Date();
|
||||||
|
var hours = date.getHours();
|
||||||
|
var minutes = date.getMinutes();
|
||||||
|
var seconds = date.getSeconds();
|
||||||
|
// Format the time as a string
|
||||||
|
var timeString = hours.toString().padStart(2, "0") + ":" +
|
||||||
|
minutes.toString().padStart(2, "0") + ":" +
|
||||||
|
seconds.toString().padStart(2,"0");
|
||||||
|
E.showMessage(string,timeString);
|
||||||
|
}
|
||||||
|
|
||||||
|
fetchStartup();
|
Binary file not shown.
After Width: | Height: | Size: 1.9 KiB |
|
@ -0,0 +1,16 @@
|
||||||
|
{ "id": "usgs",
|
||||||
|
"name": "USGS Data fetching app",
|
||||||
|
"shortName":"USGS",
|
||||||
|
"version":"0.01",
|
||||||
|
"description": "App that fetches USGS data from configurable location",
|
||||||
|
"icon": "app.png",
|
||||||
|
"tags": "",
|
||||||
|
"supports" : ["BANGLEJS2"],
|
||||||
|
"readme": "README.md",
|
||||||
|
"storage": [
|
||||||
|
{"name":"usgs.app.js","url":"app.js"},
|
||||||
|
{"name":"usgs.settings.js","url":"settings.js"},
|
||||||
|
{"name":"usgs.img","url":"app-icon.js","evaluate":true}
|
||||||
|
],
|
||||||
|
"data": [{"name":"myapp.json"}]
|
||||||
|
}
|
|
@ -0,0 +1,73 @@
|
||||||
|
(function(back) {
|
||||||
|
var submenu = {
|
||||||
|
"" : {
|
||||||
|
"title" : "-- DataStreams --"
|
||||||
|
},
|
||||||
|
"< Back" : function() { E.showMenu(menu); },
|
||||||
|
};
|
||||||
|
|
||||||
|
function writeSettings() {
|
||||||
|
require('Storage').writeJSON(FILE, settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
function popSubMenu() {
|
||||||
|
data = getDataStreams();
|
||||||
|
}
|
||||||
|
function popSubMenuData(data) {
|
||||||
|
console.log(data);
|
||||||
|
Object.keys(data).forEach(function(k){
|
||||||
|
var name = data[k].description.split(" / ")[0];
|
||||||
|
console.log(name);
|
||||||
|
if (!settings.keys[name]) {
|
||||||
|
// Setting doesn't exist, so we assume it's false
|
||||||
|
settings.keys[name] = false;
|
||||||
|
}
|
||||||
|
submenu[name]= {value:settings.keys[name], onchange: v => {
|
||||||
|
settings.keys[name] = v;
|
||||||
|
writeSettings();
|
||||||
|
}};
|
||||||
|
});
|
||||||
|
E.showMenu(submenu);
|
||||||
|
}
|
||||||
|
var menu = {
|
||||||
|
"" : { "title" : "App Name" },
|
||||||
|
"< Back" : () => back(),
|
||||||
|
'Temp unit': {
|
||||||
|
value: !!settings.tempUnitF, // !! converts undefined to false
|
||||||
|
format: v => v?"F":"C",
|
||||||
|
onchange: v => {
|
||||||
|
settings.tempUnitF = v;
|
||||||
|
writeSettings();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'Location': {
|
||||||
|
value: settings.loc,
|
||||||
|
onchange: () => {
|
||||||
|
setTimeout(() => {
|
||||||
|
keyboard.input({text:settings.loc}).then(result => {
|
||||||
|
settings.loc = result;
|
||||||
|
writeSettings();
|
||||||
|
});
|
||||||
|
}, 100);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"Submenu" : function() { popSubMenu();},
|
||||||
|
};
|
||||||
|
|
||||||
|
var keyboard = "textinput";
|
||||||
|
try {keyboard = require(keyboard);} catch(e) {keyboard = null;}
|
||||||
|
if (!keyboard) delete menu.Location;
|
||||||
|
|
||||||
|
|
||||||
|
function getDataStreams() {
|
||||||
|
uri = "https://labs.waterdata.usgs.gov/sta/v1.1/Things('USGS-" +
|
||||||
|
settings.loc +
|
||||||
|
"')/Datastreams?$select=description";
|
||||||
|
if (Bangle.http) {
|
||||||
|
Bangle.http(uri, {timeout:10000}).then(d => {popSubMenuData(JSON.parse(d.resp).value);});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show the menu
|
||||||
|
E.showMenu(menu);
|
||||||
|
});
|
Loading…
Reference in New Issue