source now in separate modules;
Implemented MQTT coms. Using Tasmota for ESP8266; IR working reliably
This commit is contained in:
69
src/db/database.js
Normal file
69
src/db/database.js
Normal file
@@ -0,0 +1,69 @@
|
||||
|
||||
const Sequelize = require("sequelize")
|
||||
const mongoose = require('mongoose');
|
||||
const Schema = mongoose.Schema;
|
||||
|
||||
let DeviceMessageSchema = new Schema({
|
||||
_id: {type: Number, required: true},
|
||||
device_id: {type: String, required: true, max: 100}
|
||||
});
|
||||
|
||||
let DevicesSchema = new Schema({
|
||||
id: {type: Number, required: true},
|
||||
url: {type: String, required: true, max: 100}
|
||||
});
|
||||
|
||||
|
||||
var sqlz = new Sequelize('iot', 'iot', '!iot_popovi',{dialect: 'mysql'})
|
||||
var Device = sqlz.define('device', {
|
||||
id: { type: Sequelize.INTEGER, autoIncrement: true, primaryKey: true },
|
||||
name: Sequelize.STRING,
|
||||
baseurl: Sequelize.TEXT,
|
||||
apikey: Sequelize.TEXT,
|
||||
//config: Sequelize.JSON,
|
||||
lastseen: Sequelize.DATE
|
||||
});
|
||||
|
||||
var DeviceMessage = sqlz.define('devicemessage', {
|
||||
id: { type: Sequelize.INTEGER, autoIncrement: true, primaryKey: true },
|
||||
device_id: { type: Sequelize.INTEGER, allowNull: false},
|
||||
//id,"device_id","field_name","field_value","timestamp"
|
||||
field_name: { type: Sequelize.STRING(120), allowNull: false},
|
||||
field_value: { type: Sequelize.TEXT, allowNull: false},
|
||||
timestamp: { type: Sequelize.DATE, allowNull: false},
|
||||
});
|
||||
|
||||
var DeviceCommand = sqlz.define("command", {
|
||||
device: { type: Sequelize.STRING},
|
||||
command: {type: Sequelize.TEXT},
|
||||
info: {type: Sequelize.STRING},
|
||||
ac_power: Sequelize.BOOLEAN,
|
||||
ac_mode: Sequelize.ENUM('Auto', 'Heat', 'Cool', "Fan"),
|
||||
ac_fan: Sequelize.ENUM('Auto', 'Low', 'Med', "Hi"),
|
||||
ac_temp: Sequelize.FLOAT,
|
||||
ac_turbo: Sequelize.BOOLEAN,
|
||||
ac_swing: Sequelize.BOOLEAN,
|
||||
ac_display: Sequelize.BOOLEAN,
|
||||
ac_econo: Sequelize.BOOLEAN,
|
||||
ac_health: Sequelize.BOOLEAN,
|
||||
|
||||
});
|
||||
|
||||
sqlz.sync(
|
||||
//{ force: true }
|
||||
)
|
||||
.then(() => {
|
||||
console.log(`Database & tables created!`)
|
||||
})
|
||||
|
||||
module.exports = {
|
||||
init: function() {
|
||||
//console.log(DeviceCommand.rawAttributes.states.values);
|
||||
sqlz.sync();
|
||||
},
|
||||
sqlz,
|
||||
Device,
|
||||
DeviceCommand,
|
||||
DeviceMessage
|
||||
//etc
|
||||
}
|
||||
56
src/db/devicemessages.js
Normal file
56
src/db/devicemessages.js
Normal file
@@ -0,0 +1,56 @@
|
||||
//devicemessages
|
||||
var mysql = require('mysql');
|
||||
var con = mysql.createConnection({
|
||||
host : 'localhost',
|
||||
user : 'iot',
|
||||
password : '!iot_popovi',
|
||||
database : 'iot'
|
||||
});
|
||||
|
||||
const got = require('got');
|
||||
|
||||
exports.findByName = function(fieldName, cb) {
|
||||
process.nextTick(function() {
|
||||
con.query("SELECT * FROM devicemessages WHERE field_name=? OR ? IS NULL",
|
||||
[fieldName, fieldName], (err, data) => {
|
||||
if (!err) {
|
||||
cb(null, data);
|
||||
} else {
|
||||
cb(new Error('SQL Error: ' + err));
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
exports.insert = function(device_id, field_name, value, cb){
|
||||
var params = [device_id, field_name,value];
|
||||
let sql = `INSERT INTO devicemessages(device_id,field_name,field_value,timestamp)
|
||||
VALUES (?,?,?,NOW());`;
|
||||
con.query(sql,params,(err, r) => {
|
||||
//if(!cb) {return;}
|
||||
if (err) {
|
||||
console.log("error: ", err);
|
||||
cb && cb(new Error('SQL Error: ' + err));
|
||||
}else{
|
||||
console.log("inserted record: ", { id: r.insertId});
|
||||
cb && cb(null, { id: r.insertId, ...params });
|
||||
}
|
||||
});
|
||||
}
|
||||
exports.getFromDht = function(url, cb)
|
||||
{
|
||||
(async () => {
|
||||
try {
|
||||
const dht = await got('http://192.168.1.126/json')
|
||||
var j = JSON.parse(body);
|
||||
if(j.dht && j.dht.hum <= 100 && j.dht.hum >= 0){
|
||||
exports.insert(0, "A23_DHT", dht.body, cb);
|
||||
}else {
|
||||
console.log("Skip! Got invalid data from DHT: " + dht);
|
||||
}
|
||||
} catch (ex) {
|
||||
console.log("DHT exception:" + ex);
|
||||
cb && cb(new Error('SQL Error: ' + ex));
|
||||
}
|
||||
})();
|
||||
}
|
||||
23
src/db/index.js
Normal file
23
src/db/index.js
Normal file
@@ -0,0 +1,23 @@
|
||||
|
||||
|
||||
|
||||
// //!database
|
||||
var data = require('./database.js');
|
||||
data.init();
|
||||
|
||||
// var device = data.Device.build({
|
||||
// name: 'A23',
|
||||
// url: "http://192.168.1.126/"
|
||||
// });
|
||||
|
||||
// device.save().then().catch(
|
||||
// err => {console.log(err);}
|
||||
// )
|
||||
//.success(function(savedTask) {
|
||||
// console.log('device saved with id' + savedTask.id);
|
||||
// });
|
||||
|
||||
|
||||
|
||||
exports.devicemessages = require('./devicemessages');
|
||||
exports.users = require('./users');
|
||||
28
src/db/users.js
Normal file
28
src/db/users.js
Normal file
@@ -0,0 +1,28 @@
|
||||
var records = [
|
||||
{ id: 1, username: 'me', password: 'A23', displayName: 'admin', emails: [ { value: 'jack@example.com' } ] }
|
||||
, { id: 2, username: 'db', password: 'doby', displayName: 'DB', emails: [ { value: 'jill@example.com' } ] }
|
||||
, { id: 3, username: 'popov', password: 'Zelenakrav@', displayName: 'Doby', emails: [ { value: 'db@example.com' } ] }
|
||||
];
|
||||
|
||||
exports.findById = function(id, cb) {
|
||||
process.nextTick(function() {
|
||||
var idx = id - 1;
|
||||
if (records[idx]) {
|
||||
cb(null, records[idx]);
|
||||
} else {
|
||||
cb(new Error('User ' + id + ' does not exist'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
exports.findByUsername = function(username, cb) {
|
||||
process.nextTick(function() {
|
||||
for (var i = 0, len = records.length; i < len; i++) {
|
||||
var record = records[i];
|
||||
if (record.username === username) {
|
||||
return cb(null, record);
|
||||
}
|
||||
}
|
||||
return cb(null, null);
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user