Added EspEasy (garden) handlers.
Added garden chart; GetDevice messages has days filter; Fixed charts & newchart data added.
This commit is contained in:
99
dht.js
99
dht.js
@@ -98,6 +98,7 @@ function(req, res){
|
|||||||
function(req, res){
|
function(req, res){
|
||||||
res.render('chart', { user: req.user });
|
res.render('chart', { user: req.user });
|
||||||
});
|
});
|
||||||
|
app.get('/garden', function(req, res){ res.render('chartGarden'); });
|
||||||
|
|
||||||
//Authentication --
|
//Authentication --
|
||||||
|
|
||||||
@@ -119,8 +120,8 @@ function BroadcastWS(msg){
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
app.get("/device/:field_name", function (req, res) {
|
app.get("/device/:field_name/:days?", function (req, res) {
|
||||||
db.devicemessages.findByName(req.params.field_name, function (err, data) {
|
db.devicemessages.findByName(req.params.field_name, req.params.days, function (err, data) {
|
||||||
if (!err) { res.send(data); }
|
if (!err) { res.send(data); }
|
||||||
else { console.log("error: ", err); }
|
else { console.log("error: ", err); }
|
||||||
});
|
});
|
||||||
@@ -155,20 +156,20 @@ else
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
// # ┌────────────── second (optional)
|
// // # ┌────────────── second (optional)
|
||||||
// # │ ┌──────────── minute
|
// // # │ ┌──────────── minute
|
||||||
// # │ │ ┌────────── hour
|
// // # │ │ ┌────────── hour
|
||||||
// # │ │ │ ┌──────── day of month
|
// // # │ │ │ ┌──────── day of month
|
||||||
// # │ │ │ │ ┌────── month
|
// // # │ │ │ │ ┌────── month
|
||||||
// # │ │ │ │ │ ┌──── day of week
|
// // # │ │ │ │ │ ┌──── day of week
|
||||||
// # │ │ │ │ │ │
|
// // # │ │ │ │ │ │
|
||||||
// # │ │ │ │ │ │
|
// // # │ │ │ │ │ │
|
||||||
// # * * * * * *
|
// // # * * * * * *
|
||||||
cron.schedule(' */30 * * * *', () => {//cron.schedule('*/5 * * * * *', () => {
|
// cron.schedule(' */30 * * * *', () => {//cron.schedule('*/5 * * * * *', () => {
|
||||||
console.log(new Date().toISOString() + ' running a task every 30 minutes');
|
// console.log(new Date().toISOString() + ' running a task every 30 minutes');
|
||||||
//StoreSensorReadings();
|
// //StoreSensorReadings();
|
||||||
db.devicemessages.getFromDht('http://192.168.1.126/json');
|
// db.devicemessages.getFromDht('http://192.168.1.126/json');
|
||||||
}).start();
|
// }).start();
|
||||||
|
|
||||||
//db.devicemessages.getFromDht('http://192.168.1.126/json');
|
//db.devicemessages.getFromDht('http://192.168.1.126/json');
|
||||||
|
|
||||||
@@ -204,23 +205,28 @@ mqtt_client.on('connect', function () {
|
|||||||
mqtt_client.subscribe('tele/tasmota/STATE');
|
mqtt_client.subscribe('tele/tasmota/STATE');
|
||||||
mqtt_client.subscribe('tele/tasmota/RESULT');//IR
|
mqtt_client.subscribe('tele/tasmota/RESULT');//IR
|
||||||
mqtt_client.subscribe('tele/tasmota/INFO2');
|
mqtt_client.subscribe('tele/tasmota/INFO2');
|
||||||
mqtt_client.subscribe('tele/tasmota/SENSOR');//DHT
|
// mqtt_client.subscribe('tele/tasmota/SENSOR');//DHT
|
||||||
|
mqtt_client.subscribe('tele/+/SENSOR');//DHT
|
||||||
mqtt_client.subscribe('tasmota_3FD92D');
|
mqtt_client.subscribe('tasmota_3FD92D');
|
||||||
mqtt_client.subscribe('tele');
|
// mqtt_client.subscribe('tele');
|
||||||
mqtt_client.subscribe('dht');
|
// mqtt_client.subscribe('dht');
|
||||||
mqtt_client.subscribe('ir');
|
// mqtt_client.subscribe('ir');
|
||||||
mqtt_client.publish('tasmota', 'controller')
|
|
||||||
|
mqtt_client.subscribe('ESP_Easy/+/+');
|
||||||
|
mqtt_client.publish('tasmota', 'controller connected')
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var dht = {};
|
||||||
// https://github.com/pauloromeira/Sonoff-Tasmota/wiki/Commands
|
// https://github.com/pauloromeira/Sonoff-Tasmota/wiki/Commands
|
||||||
//https://stevessmarthomeguide.com/setting-up-the-sonoff-tasmota-mqtt-switch/
|
//https://stevessmarthomeguide.com/setting-up-the-sonoff-tasmota-mqtt-switch/
|
||||||
mqtt_client.on('message', function (topic, message) {
|
mqtt_client.on('message', function (topic, message) {
|
||||||
var context = message.toString();
|
var context = message.toString();
|
||||||
console.log("MMQT> " + topic + " : " + context);
|
console.log("MMQT> " + topic + " : " + context);
|
||||||
|
var handled = false;
|
||||||
if(topic === "tele/tasmota/SENSOR")
|
if(topic === "tele/tasmota/SENSOR")
|
||||||
{
|
{
|
||||||
var j = JSON.parse(message);
|
var j = JSON.parse(message);
|
||||||
console.log("JSON> " + util.inspect(j));
|
//console.log("JSON> " + util.inspect(j));
|
||||||
if(j.DHT11 && j.DHT11.Humidity !== null)
|
if(j.DHT11 && j.DHT11.Humidity !== null)
|
||||||
{
|
{
|
||||||
var msg = {
|
var msg = {
|
||||||
@@ -238,5 +244,52 @@ mqtt_client.on('message', function (topic, message) {
|
|||||||
}else {
|
}else {
|
||||||
console.log("got wrong DHT data: " + message );
|
console.log("got wrong DHT data: " + message );
|
||||||
}
|
}
|
||||||
|
handled = true;
|
||||||
|
}
|
||||||
|
if(topic === "ESP_Easy/Water/Moisture")
|
||||||
|
{
|
||||||
|
console.log("MANGO> " + message + "% moisture");
|
||||||
|
dht.Soil = message.toString();
|
||||||
|
SaveDhtIf();
|
||||||
|
// db.devicemessages.insert(1, "A23_Garden_Humidity", message, function (err, data) {
|
||||||
|
// if (!err) { console.log("success: "+ data);}
|
||||||
|
// else { console.log("error: " + err); }
|
||||||
|
// });
|
||||||
|
handled = true;
|
||||||
|
}
|
||||||
|
if(topic === "ESP_Easy/bmp/Temperature")
|
||||||
|
{
|
||||||
|
console.log("Garden > air " + message + "C");
|
||||||
|
dht.Temp = message.toString();
|
||||||
|
SaveDhtIf();
|
||||||
|
handled = true;
|
||||||
|
}
|
||||||
|
if(topic === "ESP_Easy/bmp/Humidity")
|
||||||
|
{
|
||||||
|
console.log("Garden > air " + message + "% RH");
|
||||||
|
dht.Hum = message.toString();
|
||||||
|
SaveDhtIf();
|
||||||
|
handled = true;
|
||||||
|
}
|
||||||
|
if(topic === "ESP_Easy/bmp/Pressure")
|
||||||
|
{
|
||||||
|
console.log("Garden > air " + message + " hPa");
|
||||||
|
dht.Pres = message.toString();
|
||||||
|
SaveDhtIf();
|
||||||
|
handled = true;
|
||||||
|
}
|
||||||
|
if(!handled){
|
||||||
|
console.log(topic + " > " + message );
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
function SaveDhtIf(){
|
||||||
|
if(dht.Temp && dht.Hum && dht.Pres && dht.Soil)
|
||||||
|
{
|
||||||
|
console.log("Writing to DB > " + JSON.stringify(dht));
|
||||||
|
db.devicemessages.insert(1, "A23_Garden_dht", JSON.stringify(dht), function (err, data) {
|
||||||
|
if (!err) { console.log("success: "+ data);}
|
||||||
|
else { console.log("error: " + err); }
|
||||||
|
});
|
||||||
|
dht = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -33,6 +33,32 @@ var DeviceMessage = sqlz.define('devicemessage', {
|
|||||||
timestamp: { type: Sequelize.DATE, allowNull: false},
|
timestamp: { type: Sequelize.DATE, allowNull: false},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
DeviceMessage.GetByName = function (name, days)
|
||||||
|
{
|
||||||
|
var User = sqlz.User;
|
||||||
|
User.find({
|
||||||
|
where: {
|
||||||
|
field_name: name,
|
||||||
|
timestamp: {$gte: new Date()}
|
||||||
|
}
|
||||||
|
}).then(function(user)
|
||||||
|
{
|
||||||
|
if(!user)
|
||||||
|
{
|
||||||
|
error.status = 500; error.message = "ERROR_INVALID_USER"; error.code = 301;
|
||||||
|
return next(error);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build the profile from the user object
|
||||||
|
profile = {
|
||||||
|
"firstName": user.firstName,
|
||||||
|
"lastName": user.lastName,
|
||||||
|
"emailAddress": user.emailAddress
|
||||||
|
}
|
||||||
|
response.status(200).send(profile);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
var DeviceCommand = sqlz.define("command", {
|
var DeviceCommand = sqlz.define("command", {
|
||||||
device: { type: Sequelize.STRING},
|
device: { type: Sequelize.STRING},
|
||||||
command: {type: Sequelize.TEXT},
|
command: {type: Sequelize.TEXT},
|
||||||
|
|||||||
@@ -9,10 +9,13 @@ var con = mysql.createConnection({
|
|||||||
|
|
||||||
const got = require('got');
|
const got = require('got');
|
||||||
|
|
||||||
exports.findByName = function(fieldName, cb) {
|
exports.findByName = function(fieldName, days, cb) {
|
||||||
process.nextTick(function() {
|
process.nextTick(function() {
|
||||||
con.query("SELECT * FROM devicemessages WHERE field_name=? OR ? IS NULL",
|
// console.log("findByName(" +fieldName + ",?" + days +")" );
|
||||||
[fieldName, fieldName], (err, data) => {
|
// days = days|365;
|
||||||
|
console.log("findByName(" +fieldName + "," + days +")" );
|
||||||
|
con.query("SELECT * FROM devicemessages WHERE (field_name=? OR ? IS NULL) AND (timestamp >= ( CURDATE() - INTERVAL ? DAY ))",
|
||||||
|
[fieldName, fieldName, days], (err, data) => {
|
||||||
if (!err) {
|
if (!err) {
|
||||||
cb(null, data);
|
cb(null, data);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -21,3 +21,4 @@ data.init();
|
|||||||
|
|
||||||
exports.devicemessages = require('./devicemessages');
|
exports.devicemessages = require('./devicemessages');
|
||||||
exports.users = require('./users');
|
exports.users = require('./users');
|
||||||
|
exports.orm = require('./database');
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ INFO:
|
|||||||
window.onload = function () {
|
window.onload = function () {
|
||||||
$.getJSON("/n/dht?e=now", function(data){
|
$.getJSON("/n/dht?e=now", function(data){
|
||||||
if(data && data.dht){
|
if(data && data.dht){
|
||||||
$('#current').text( "A23 Currently is " + data.dht.temp + "°C, " + data.dht.hum +"% RH. Dew Point at:" + data.dht.dew );
|
$('#current').text( "A23 Currently is " + data.dht.temp + "°C, " + data.dht.hum +"% RH. Dew point : " + data.dht.dew + "°C" );
|
||||||
}else {
|
}else {
|
||||||
//chart.title.set("text", "A23 conditions");
|
//chart.title.set("text", "A23 conditions");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
window.onload = function () {
|
window.onload = function () {
|
||||||
var dataPoints1 = [];
|
var dataPoints1 = [];
|
||||||
var dataPoints2 = [];
|
var dataPoints2 = [];
|
||||||
|
var dataPoints3 = [];
|
||||||
/*{ x: new Date(2017, 0, 3), y: 650 },
|
/*{ x: new Date(2017, 0, 3), y: 650 },
|
||||||
{ x: new Date(2017, 0, 4), y: 700 },
|
{ x: new Date(2017, 0, 4), y: 700 },
|
||||||
*/
|
*/
|
||||||
@@ -25,6 +26,16 @@
|
|||||||
text: "X Axis scale is Logarithmic",
|
text: "X Axis scale is Logarithmic",
|
||||||
fontSize: 14
|
fontSize: 14
|
||||||
}],*/
|
}],*/
|
||||||
|
toolTip:{
|
||||||
|
shared:true
|
||||||
|
},
|
||||||
|
legend:{
|
||||||
|
cursor:"pointer",
|
||||||
|
verticalAlign: "bottom",
|
||||||
|
horizontalAlign: "left",
|
||||||
|
dockInsidePlotArea: true,
|
||||||
|
itemclick: toogleDataSeries
|
||||||
|
},
|
||||||
axisX:{
|
axisX:{
|
||||||
valueFormatString: "HH:mm DD MMM",
|
valueFormatString: "HH:mm DD MMM",
|
||||||
crosshair: {
|
crosshair: {
|
||||||
@@ -39,13 +50,25 @@
|
|||||||
labelFontColor: "#C24642",
|
labelFontColor: "#C24642",
|
||||||
crosshair: {
|
crosshair: {
|
||||||
enabled: true
|
enabled: true
|
||||||
}
|
},
|
||||||
|
minimum:0,
|
||||||
|
maximum: 50,
|
||||||
},
|
},
|
||||||
axisY2: [
|
axisY2: [
|
||||||
{
|
{
|
||||||
title: "Relative hum %",
|
title: "Air RH %",
|
||||||
titleFontColor: "#51CDA0",
|
titleFontColor: "#51CDA0",
|
||||||
labelFontColor: "#51CDA0"
|
labelFontColor: "#51CDA0",
|
||||||
|
minimum:0,
|
||||||
|
maximum: 100,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: "Soil RH %",
|
||||||
|
lineColor: "#99D9EA",
|
||||||
|
titleFontColor: "#99D9EA",
|
||||||
|
labelFontColor: "#99D9EA",
|
||||||
|
minimum:0,
|
||||||
|
maximum: 100,
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
//{title: "Temperature",
|
//{title: "Temperature",
|
||||||
@@ -53,19 +76,9 @@
|
|||||||
//titleFontColor: "#C0504E",
|
//titleFontColor: "#C0504E",
|
||||||
//labelFontColor: "#C0504E"
|
//labelFontColor: "#C0504E"
|
||||||
//},
|
//},
|
||||||
toolTip:{
|
|
||||||
shared:true
|
|
||||||
},
|
|
||||||
legend:{
|
|
||||||
cursor:"pointer",
|
|
||||||
verticalAlign: "bottom",
|
|
||||||
horizontalAlign: "left",
|
|
||||||
dockInsidePlotArea: true,
|
|
||||||
itemclick: toogleDataSeries
|
|
||||||
},
|
|
||||||
data: [{
|
data: [{
|
||||||
name: "Temperature",
|
name: "Temperature",
|
||||||
type: "spline",//line
|
type: "line",//line
|
||||||
showInLegend: true,
|
showInLegend: true,
|
||||||
markerType: "square",
|
markerType: "square",
|
||||||
xValueFormatString: "HH:mm on DD MMM, YYYY",
|
xValueFormatString: "HH:mm on DD MMM, YYYY",
|
||||||
@@ -73,13 +86,23 @@
|
|||||||
dataPoints: dataPoints2
|
dataPoints: dataPoints2
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: "Humidiry",
|
axisYType: "secondary",//at right
|
||||||
|
//axisYIndex: 1,
|
||||||
|
name: "RH Air",
|
||||||
type: "spline",
|
type: "spline",
|
||||||
axisYType: "secondary",
|
|
||||||
axisYIndex: 1,
|
|
||||||
showInLegend: true,
|
showInLegend: true,
|
||||||
lineDashType: "dash",
|
lineDashType: "dash",
|
||||||
dataPoints: dataPoints1
|
dataPoints: dataPoints1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
axisYType: "secondary",
|
||||||
|
//axisYIndex: 1,
|
||||||
|
name: "RH Soil",
|
||||||
|
type: "spline",
|
||||||
|
showInLegend: true,
|
||||||
|
lineDashType: "dash",
|
||||||
|
color: "#99D9EA",
|
||||||
|
dataPoints: dataPoints3
|
||||||
}]
|
}]
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -95,9 +118,10 @@
|
|||||||
|
|
||||||
function addData(data) {
|
function addData(data) {
|
||||||
for (var i = 0; i < data.length; i++) {
|
for (var i = 0; i < data.length; i++) {
|
||||||
|
var date = new Date(data[i]["timestamp"]);
|
||||||
if(data[i].field_name == "A23_DHT"){
|
if(data[i].field_name == "A23_DHT"){
|
||||||
|
//console.log("Got DHT:" + date);
|
||||||
var dht = JSON.parse(data[i].field_value).dht;
|
var dht = JSON.parse(data[i].field_value).dht;
|
||||||
var date = new Date(data[i]["timestamp"]);
|
|
||||||
if(dht && dht.hum <= 100){
|
if(dht && dht.hum <= 100){
|
||||||
dataPoints1.push({
|
dataPoints1.push({
|
||||||
x: date,
|
x: date,
|
||||||
@@ -109,6 +133,15 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(data[i].field_name === "A23_Garden_Humidity")
|
||||||
|
{
|
||||||
|
//console.log("Got Soil:" + date);
|
||||||
|
var soil = parseFloat( data[i].field_value);
|
||||||
|
dataPoints3.push({
|
||||||
|
x: date,
|
||||||
|
y: soil
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
chart.render();
|
chart.render();
|
||||||
|
|
||||||
@@ -121,7 +154,8 @@
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$.getJSON("/n/device/A23_DHT", addData);
|
$.getJSON("/n/device/A23_DHT/7", addData);
|
||||||
|
$.getJSON("/n/device/A23_Garden_Humidity/7", addData);
|
||||||
|
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
180
views/chartGarden.ejs
Normal file
180
views/chartGarden.ejs
Normal file
@@ -0,0 +1,180 @@
|
|||||||
|
<div id="chartContainer" style="height: 370px; width: 100%;"></div>
|
||||||
|
<script src="https://canvasjs.com/assets/script/canvasjs.min.js"></script>
|
||||||
|
|
||||||
|
<%- contentFor('head') %>
|
||||||
|
<script>
|
||||||
|
var current;
|
||||||
|
window.onload = function () {
|
||||||
|
var temp = {in:[], out:[]};
|
||||||
|
var hum = {in:[], out:[],outSoil:[]};
|
||||||
|
var press = {out:[]};
|
||||||
|
/*{ x: new Date(2017, 0, 3), y: 650 },
|
||||||
|
{ x: new Date(2017, 0, 4), y: 700 },
|
||||||
|
*/
|
||||||
|
|
||||||
|
var chart = new CanvasJS.Chart("chartContainer", {
|
||||||
|
animationEnabled: true,
|
||||||
|
theme: "light2",
|
||||||
|
zoomEnabled: true,
|
||||||
|
zoomType: "x",
|
||||||
|
exportEnabled: true,
|
||||||
|
title: {
|
||||||
|
text: "Weather conditions in the lasts 7 days"
|
||||||
|
},
|
||||||
|
/* subtitles:[{
|
||||||
|
text: "X Axis scale is Logarithmic",
|
||||||
|
fontSize: 14
|
||||||
|
}],*/
|
||||||
|
toolTip: {
|
||||||
|
shared: true
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
cursor: "pointer",
|
||||||
|
verticalAlign: "bottom",
|
||||||
|
horizontalAlign: "left",
|
||||||
|
dockInsidePlotArea: true,
|
||||||
|
itemclick: toogleDataSeries
|
||||||
|
},
|
||||||
|
axisX: {
|
||||||
|
valueFormatString: "HH:mm DD MMM",
|
||||||
|
crosshair: {
|
||||||
|
enabled: true,
|
||||||
|
snapToDataPoint: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
axisY: [
|
||||||
|
{
|
||||||
|
title: "Air Temperature",
|
||||||
|
lineColor: "#C24642",
|
||||||
|
titleFontColor: "#C24642",
|
||||||
|
labelFontColor: "#C24642",
|
||||||
|
suffix: " °C",
|
||||||
|
minimum: -10,
|
||||||
|
// maximum: 40,
|
||||||
|
} , {
|
||||||
|
title: "ATM Pressure",
|
||||||
|
lineColor: "#A477C6",
|
||||||
|
titleFontColor: "#A477C6",
|
||||||
|
labelFontColor: "#A477C6",
|
||||||
|
suffix: "hPa",
|
||||||
|
minimum: 990,
|
||||||
|
//maximum: 1080,
|
||||||
|
},
|
||||||
|
],
|
||||||
|
axisY2: [
|
||||||
|
{
|
||||||
|
title: "Relative Humidity",
|
||||||
|
titleFontColor: "#51CDA0",
|
||||||
|
labelFontColor: "#51CDA0",
|
||||||
|
minimum: 0,
|
||||||
|
maximum: 100,
|
||||||
|
suffix: "%",
|
||||||
|
}
|
||||||
|
],
|
||||||
|
data: [{
|
||||||
|
name: "Out Temperature",
|
||||||
|
type: "line",//line
|
||||||
|
showInLegend: true,
|
||||||
|
markerType: "square",
|
||||||
|
xValueFormatString: "HH:mm on DD MMM, YYYY",
|
||||||
|
color: "#F08080",
|
||||||
|
dataPoints: temp.out
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "In Temperature",
|
||||||
|
type: "line",//line
|
||||||
|
showInLegend: true,
|
||||||
|
//markerType: "square",
|
||||||
|
//xValueFormatString: "HH:mm on DD MMM, YYYY",
|
||||||
|
color: "#92D050",
|
||||||
|
dataPoints: temp.in
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "ATM Pressure",
|
||||||
|
axisYIndex: 1,
|
||||||
|
type: "line",
|
||||||
|
showInLegend: true,
|
||||||
|
lineDashType: "dash",
|
||||||
|
color: "#A477C6",
|
||||||
|
dataPoints: press.out
|
||||||
|
},
|
||||||
|
//----- sright axies -----
|
||||||
|
{
|
||||||
|
name: "Air RH",
|
||||||
|
axisYType: "secondary",//at right
|
||||||
|
//axisYIndex: 1,
|
||||||
|
type: "spline",
|
||||||
|
showInLegend: true,
|
||||||
|
lineDashType: "dash",
|
||||||
|
dataPoints: hum.out
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Soil RH",
|
||||||
|
axisYType: "secondary",
|
||||||
|
axisYIndex: 1,
|
||||||
|
type: "spline",
|
||||||
|
showInLegend: true,
|
||||||
|
lineDashType: "dash",
|
||||||
|
color: "#99D9EA",
|
||||||
|
dataPoints: hum.outSoil
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function toogleDataSeries(e) {
|
||||||
|
if (typeof (e.dataSeries.visible) === "undefined" || e.dataSeries.visible) {
|
||||||
|
e.dataSeries.visible = false;
|
||||||
|
} else {
|
||||||
|
e.dataSeries.visible = true;
|
||||||
|
}
|
||||||
|
chart.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
function addData(data) {
|
||||||
|
for (var i = 0; i < data.length; i++) {
|
||||||
|
var date = new Date(data[i]["timestamp"]);
|
||||||
|
if (data[i].field_name == "A23_Garden_dht") {
|
||||||
|
var dht = JSON.parse(data[i].field_value);
|
||||||
|
hum.out.push({ x: date, y: parseFloat(dht.Hum) });
|
||||||
|
temp.out.push({ x: date, y: parseFloat(dht.Temp) });
|
||||||
|
press.out.push({ x: date, y: parseFloat(dht.Pres)});
|
||||||
|
if (dht.Soil) {
|
||||||
|
hum.outSoil.push({ x: date, y: parseFloat(dht.Soil) });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var date = new Date(data[i]["timestamp"]);
|
||||||
|
if(data[i].field_name == "A23_DHT"){
|
||||||
|
//console.log("Got DHT:" + date);
|
||||||
|
var dht = JSON.parse(data[i].field_value).dht;
|
||||||
|
if(dht && dht.hum <= 100){
|
||||||
|
hum.in.push({
|
||||||
|
x: date,
|
||||||
|
y: dht.hum
|
||||||
|
});
|
||||||
|
temp.in.push({
|
||||||
|
x: date,
|
||||||
|
y: dht.temp
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
chart.render();
|
||||||
|
|
||||||
|
/*
|
||||||
|
$.getJSON("/n/dht?e=now", function(data){
|
||||||
|
if(data && data.dht){
|
||||||
|
chart.title.set("text", "Currently " + data.temp + "°C, " + data.hum +"% RH, ATM:" + data.press + "hPa");
|
||||||
|
}else {
|
||||||
|
chart.title.set("text", "Weather conditions");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
$.getJSON("/n/device/A23_DHT/1", addData);
|
||||||
|
$.getJSON("/n/device/A23_Garden_dht/1", addData);
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -1,4 +1,6 @@
|
|||||||
|
|
||||||
|
|
||||||
<a href="/n/accontrol" >control</a>
|
<a href="/n/accontrol" >control</a>
|
||||||
<a href="/n/logout" >log out</a>
|
<a href="/n/logout" >log out</a>
|
||||||
<a href="/n/chart"> chart</a>
|
<a href="/n/chart"> chart</a>
|
||||||
|
<a href="/n/garden"> garden</a>
|
||||||
Reference in New Issue
Block a user