Commit b76690c2 authored by Leandro Lanzieri's avatar Leandro Lanzieri

Se cambia la comunicacion serie de la Rasp para usar buffer. Se agrega un ACK...

Se cambia la comunicacion serie de la Rasp para usar buffer. Se agrega un ACK en el nodo central para la comunicacion serie. Se implementa el motor de reglas. Se agrega la clase de nodos y como se cargan.
parent 9103cc23
......@@ -10,5 +10,6 @@
"LUCES_DISMINUIR": 28,
"PING": 25,
"FREC_ONOFF": 120,
"FREC_LUCES": 102
"FREC_LUCES": 102,
"ACK": 65
}
\ No newline at end of file
......@@ -2,17 +2,11 @@
"servidor": "ws://probandosockets.herokuapp.com",
"nodos": [
{
"id": 2,
"nombre": "Luces living",
"id": 1,
"nombre": "Temperatura living",
"frecuencia": 102,
"tipo": "luz",
"conectado": false
},
{
"id": 3,
"nombre": "Enchufe cocina",
"frecuencia": 120,
"tipo": "onOff",
"tipo": "temperatura",
"estado": false,
"conectado": false
}
]
......
......@@ -29,11 +29,23 @@
* You should have received a copy of the GNU General Public License
* along with Proyecto Domotica. If not, see <http://www.gnu.org/licenses/>.
*******************************************************************************/
/*******************************************************************************
*******************************************************************************/
var WebSocket = require('ws');
var configuracion = require('./configuracion.json');
var com = require('serialport');
var comunicacion = require('./comunicacion.json');
/* Los bytes para transmitir deben escribirse en este
* buffer y seran enviados por uart en cada ocurrencia
* del intervalo.
*/
var bufferTransmision = new Buffer([]);
/* Es el byte que se transmite en cada ocurrencia
* del intervalo.
*/
var data = [];
var ws = new WebSocket('ws://probandosockets.herokuapp.com');
var serialPort = new com.SerialPort("/dev/ttyAMA0", {
baudrate: 9600,
stopBits: 1,
......@@ -41,25 +53,23 @@ var serialPort = new com.SerialPort("/dev/ttyAMA0", {
parser: com.parsers.raw
});
var retransmitir = 0;
/* Intervalo para la transmision serie. Si hay
* bytes en el buffer se escribe el de la
* posicion 0.
*/
var intervalo = setInterval(function() {
if(retransmitir) {
serialPort.write(data);
console.log("Retransmitiendo...\n"); // Debug
if(bufferTransmision.length != 0) {
data[0] = bufferTransmision[0];
console.log("\nTransmitiendo" + data);
serialPort.write(data);
}
}, 200);
var data = new Buffer("DA", "hex");
}, 20);
var ws = new WebSocket(configuracion.servidor);
serialPort.on('open', function() {
serialPort.on('open', function() {
console.log("Puerto Serie Abierto");
serialPort.write(data, function() {
retransmitir = 1;
});
ws.on('open', function() {
ws.send(JSON.stringify({comando: "identificar", dato: "raspberry"}));
var ping = setInterval(function () {
......@@ -70,20 +80,25 @@ var ws = new WebSocket(configuracion.servidor);
ws.on('message', function(message) {
var mensaje = JSON.parse(message);
console.log("Comando recibido: " + mensaje.comando + " con el dato: " + mensaje.dato);
if(mensaje.comando == "rasptoggle")
serialPort.write(data, function() {
retransmitir = 1;
});
if(mensaje.comando == "rasptoggle") {
comandos = new Buffer([218, 218, 218]); // Comandos a transmitir
bufferTransmision = Buffer.concat([bufferTransmision, comandos]); // Se concatenan ak buffer de transmision
}
});
ws.on('close', function () {
setInterval(function () {
console.log("Intentando reconexion...TBD");
conectar();
console.log("Intentando reconexion...");
}, 5000);
});
});
serialPort.on('data', function(mensaje) {
console.log("Recibido: " + mensaje);
retransmitir = 0;
});
\ No newline at end of file
serialPort.on('data', function(mensaje) {
console.log("\nSe recibe: " + mensaje);
if(mensaje == comunicacion.ack) {
bufferTransmision = bufferTransmision.slice(1,bufferTransmision.length);
if(bufferTransmision.length == 0) {
console.log("\nSe vacio el buffer de transmision...");
}
}
});
});
\ No newline at end of file
var WebSocket = require('ws');
var RuleEngine = require('node-rules');
var reglas = require('./reglas.json');
var NodoOnOff = require("./nodo-onoff");
var configuracion = require('./configuracion');
/* Conexion al servidor websocket */
var ws = new WebSocket(configuracion.servidor);
/* Referencia de fecha */
var fecha = new Date();
/* Instancia del motor de reglas */
var R = new RuleEngine();
R.fromJSON(reglas); // Se registran las reglas guardadas
/* El fact que es inyectado al rules-engine */
var hecho = {
"tiempo": {
"hora": fecha.getHours().toString() + ":" + fecha.getMinutes().toString(),
"diaMes": fecha.getDate(),
"mes": fecha.getMonth(),
"diaSemana": fecha.getDay()
},
"nodos": []
}
/* Llena el fact con los nodos guardados en la configuracion */
for(i in configuracion.nodos) {
hecho.nodos.push(new NodoOnOff(configuracion.nodos[i]));
// TODO Hacer ping para ver si esta en la red
}
/* Si hay nodos registrados se establece la conexion serie */
if(hecho.nodos.length != 0) {
hecho.nodos[0].conectarSerie();
}
/* Este intervalo actualiza el tiempo del hecho global frente
* a los cambios de hora.
*/
var actualizarTiempoHecho = setInterval(function () {
var fecha = new Date();
/* Se actualizan las fechas */
hecho.tiempo.hora = fecha.getHours().toString() + ":" + fecha.getMinutes().toString();
hecho.tiempo.diaMes = fecha.getDate();
hecho.tiempo.mes = fecha.getMonth();
hecho.tiempo.diaSemana = fecha.getDay();
console.log(hecho.tiempo);
/* Se evalua el hecho nuevo */
R.execute(hecho, function(result){
console.log("\nSe evaluaron las reglas y el resultado es: ");
console.log(result);
});
}, 1000);
\ No newline at end of file
......@@ -47,6 +47,7 @@ function Nodo (nodo) {
this.nombre = nodo.nombre;
this.frecuencia = nodo.frecuencia;
this.tipo = nodo.tipo;
this.estado = nodo.estado;
this.conectado = nodo.conectado;
}
......
......@@ -25,7 +25,8 @@
"homepage": "https://gitlab.com/leandrolanzieri/proyecto-digitales#README",
"dependencies": {
"node-pre-gyp": "^0.6.17",
"ws": "^0.8.1",
"serialport": "^2.0.5"
"node-rules": "^3.0.3",
"serialport": "^2.0.5",
"ws": "^0.8.1"
}
}
[
{
"condition": "function (R) { R.when((this.tiempo.hora < '21:00') && (this.nodos.filter(function( obj ) { return obj.nombre == 'Temperatura living';})[0].estado == false)); }",
"consequence":"function (R) { this.nodos.filter(function( obj ) { return obj.nombre == 'Temperatura living';})[0].estado = true; console.log('Temperatura living.estado = true porque son menos de las 21:00 y esta en false'); R.next(); }",
"on":true
}
]
var NodoOnOff = require("./nodo-onoff");
var configuracion = require('./configuracion')
// Vector de nodos
var nodos = [];
// Se llena el vector con los nodos guardados
for(i in configuracion.nodos) {
nodos.push(new NodoOnOff(configuracion.nodos[i]));
}
// Se imprimen las propiedades de cada nodo
// y se les hace ping
for(i in nodos) {
nodos[i].propiedades();
nodos[i].ping();
}
/*
nodo.on("conectado-serie", function() {
console.log("\nSe conecto al puerto serie.");
})
*/
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment