Send reboot msg after message retrieval to deal with sensors going to sleep
minimal adjustment to the dallas temperature sensor as an example added scripts to drop the database and to set a reboot manually for debugging purposes
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,69 @@
|
||||
// Example sketch showing how to send in OneWire temperature readings
|
||||
#include <MySensor.h>
|
||||
#include <SPI.h>
|
||||
#include <DallasTemperature.h>
|
||||
#include <OneWire.h>
|
||||
|
||||
#define ONE_WIRE_BUS 3 // Pin where dallase sensor is connected
|
||||
#define MAX_ATTACHED_DS18B20 16
|
||||
unsigned long WAIT_TIME = 30000; // Wait for feedback from controller after sending and before going to sleep (in milliseconds)
|
||||
unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
|
||||
OneWire oneWire(ONE_WIRE_BUS);
|
||||
DallasTemperature sensors(&oneWire);
|
||||
MySensor gw;
|
||||
float lastTemperature[MAX_ATTACHED_DS18B20];
|
||||
int numSensors=0;
|
||||
boolean receivedConfig = false;
|
||||
boolean metric = true;
|
||||
// Initialize temperature message
|
||||
MyMessage msg(0,V_TEMP);
|
||||
|
||||
void setup()
|
||||
{
|
||||
// Startup OneWire
|
||||
sensors.begin();
|
||||
|
||||
// Startup and initialize MySensors library. Set callback for incoming messages.
|
||||
gw.begin();
|
||||
|
||||
// Send the sketch version information to the gateway and Controller
|
||||
gw.sendSketchInfo("Temperature Sensor", "1.0");
|
||||
|
||||
// Fetch the number of attached temperature sensors
|
||||
numSensors = sensors.getDeviceCount();
|
||||
|
||||
// Present all sensors to controller
|
||||
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
|
||||
gw.present(i, S_TEMP);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void loop()
|
||||
{
|
||||
// Process incoming messages (like config from server)
|
||||
gw.process();
|
||||
|
||||
// Fetch temperatures from Dallas sensors
|
||||
sensors.requestTemperatures();
|
||||
|
||||
// Read temperatures and send them to controller
|
||||
for (int i=0; i<numSensors && i<MAX_ATTACHED_DS18B20; i++) {
|
||||
|
||||
// Fetch and round temperature to one decimal
|
||||
float temperature = static_cast<float>(static_cast<int>((gw.getConfig().isMetric?sensors.getTempCByIndex(i):sensors.getTempFByIndex(i)) * 10.)) / 10.;
|
||||
|
||||
// Only send data if temperature has changed and no error
|
||||
if (lastTemperature[i] != temperature && temperature != -127.00) {
|
||||
|
||||
// Send in the new temperature
|
||||
gw.send(msg.setSensor(i).set(temperature,1));
|
||||
lastTemperature[i]=temperature;
|
||||
}
|
||||
}
|
||||
delay(WAIT_TIME);
|
||||
gw.process();
|
||||
gw.sleep(SLEEP_TIME);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
const dbAddress = '127.0.0.1';
|
||||
const dbPort = 27017;
|
||||
const dbName = 'MySensorsDb';
|
||||
|
||||
var dbc = require('mongodb').MongoClient;
|
||||
dbc.connect('mongodb://' + dbAddress + ':' + dbPort + '/' + dbName, function(err, db) {
|
||||
if (err) {
|
||||
console.log('Error connecting to database at mongodb://' + dbAddress + ':' + dbPort + '/' + dbName);
|
||||
} else {
|
||||
db.dropDatabase(function(err, result) {
|
||||
if (err)
|
||||
console.log('Error dropping database at mongodb://' + dbAddress + ':' + dbPort + '/' + dbName);
|
||||
else
|
||||
console.log('Successfully dropped database at mongodb://' + dbAddress + ':' + dbPort + '/' + dbName);
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -264,6 +264,21 @@ function saveProtocol(sender, payload, db) {
|
||||
});
|
||||
}
|
||||
|
||||
function saveSensor(sender, sensor, type, db) {
|
||||
db.collection('node', function(err, c) {
|
||||
c.update({
|
||||
'id': sender
|
||||
}, {
|
||||
$addToSet: {
|
||||
sensor: type
|
||||
}
|
||||
}, function(err, result) {
|
||||
if (err)
|
||||
console.log("Error writing sensor to database");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function saveValue(sender, sensor, type, payload, db) {
|
||||
var cn = "Value-" + sender.toString() + "-" + sensor.toString();
|
||||
db.createCollection(cn, function(err, c) {
|
||||
@@ -389,7 +404,8 @@ function sendFirmwareConfigResponse(destination, fwtype, fwversion, db, gw) {
|
||||
}, {
|
||||
$set: {
|
||||
'type': fwtype,
|
||||
'version': fwversion
|
||||
'version': fwversion,
|
||||
'reboot': 0
|
||||
}
|
||||
}, {
|
||||
upsert: true
|
||||
@@ -416,20 +432,22 @@ function sendFirmwareConfigResponse(destination, fwtype, fwversion, db, gw) {
|
||||
}, function(err, result) {
|
||||
if (err)
|
||||
console.log('Error finding firmware for type ' + fwtype);
|
||||
if (!result)
|
||||
else if (!result)
|
||||
console.log('No firmware found for type ' + fwtype);
|
||||
var payload = [];
|
||||
pushWord(payload, result.type);
|
||||
pushWord(payload, result.version);
|
||||
pushWord(payload, result.blocks);
|
||||
pushWord(payload, result.crc);
|
||||
var sensor = NODE_SENSOR_ID;
|
||||
var command = C_STREAM;
|
||||
var acknowledge = 0; // no ack
|
||||
var type = 1; // I_FIRMWARE_CONFIG_RESPONSE
|
||||
var td = encode(destination, sensor, command, acknowledge, type, payload);
|
||||
console.log('-> ' + td.toString());
|
||||
gw.write(td);
|
||||
else {
|
||||
var payload = [];
|
||||
pushWord(payload, result.type);
|
||||
pushWord(payload, result.version);
|
||||
pushWord(payload, result.blocks);
|
||||
pushWord(payload, result.crc);
|
||||
var sensor = NODE_SENSOR_ID;
|
||||
var command = C_STREAM;
|
||||
var acknowledge = 0; // no ack
|
||||
var type = ST_FIRMWARE_CONFIG_RESPONSE;
|
||||
var td = encode(destination, sensor, command, acknowledge, type, payload);
|
||||
console.log('-> ' + td.toString());
|
||||
gw.write(td);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
@@ -459,15 +477,43 @@ function sendFirmwareResponse(destination, fwtype, fwversion, fwblock, db, gw) {
|
||||
});
|
||||
}
|
||||
|
||||
function rebootNode(destination, gw) {
|
||||
function saveRebootRequest(destination, db) {
|
||||
db.collection('node', function(err, c) {
|
||||
c.update({
|
||||
'id': destination
|
||||
}, {
|
||||
$set: {
|
||||
'reboot': 1
|
||||
}
|
||||
}, function(err, result) {
|
||||
if (err)
|
||||
console.log("Error writing reboot request to database");
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function checkRebootRequest(destination, db, gw) {
|
||||
db.collection('node', function(err, c) {
|
||||
c.find({
|
||||
'id': destination
|
||||
}, function(err, item) {
|
||||
if (err)
|
||||
console.log('Error checking reboot request');
|
||||
else if (item.reboot == 1)
|
||||
sendRebootMessage(destination, gw);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function sendRebootMessage(destination, gw) {
|
||||
var sensor = NODE_SENSOR_ID;
|
||||
var command = C_INTERNAL;
|
||||
var acknowledge = 0; // no ack
|
||||
var type = I_REBOOT;
|
||||
var payload = "";
|
||||
var td = encode(destination, sensor, command, acknowledge, type, payload);
|
||||
console.log('-> ' + td.toString());
|
||||
gw.write(td);
|
||||
var command = C_INTERNAL;
|
||||
var acknowledge = 0; // no ack
|
||||
var type = I_REBOOT;
|
||||
var payload = "";
|
||||
var td = encode(destination, sensor, command, acknowledge, type, payload);
|
||||
console.log('-> ' + td.toString());
|
||||
gw.write(td);
|
||||
}
|
||||
|
||||
function rfReceived(data, db, gw) {
|
||||
@@ -481,7 +527,7 @@ function rfReceived(data, db, gw) {
|
||||
var type = +datas[3];
|
||||
var rawpayload = datas[4].trim();
|
||||
var payload;
|
||||
if (command == 4) {
|
||||
if (command == C_STREAM) {
|
||||
payload = [];
|
||||
for (var i = 0; i < rawpayload.length; i+=2)
|
||||
payload.push(parseInt(rawpayload.substring(i, i + 2), 16));
|
||||
@@ -491,7 +537,9 @@ function rfReceived(data, db, gw) {
|
||||
// decision on appropriate response
|
||||
switch (command) {
|
||||
case C_PRESENTATION:
|
||||
saveProtocol(sender, payload, db);
|
||||
if (sensor == NODE_SENSOR_ID)
|
||||
saveProtocol(sender, payload, db);
|
||||
saveSensor(sender, sensor, type, db);
|
||||
break;
|
||||
case C_SET:
|
||||
saveValue(sender, sensor, type, payload, db);
|
||||
@@ -560,6 +608,7 @@ function rfReceived(data, db, gw) {
|
||||
}
|
||||
break;
|
||||
}
|
||||
checkRebootRequest(sender, db, gw);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -574,8 +623,8 @@ dbc.connect('mongodb://' + dbAddress + ':' + dbPort + '/' + dbName, function(err
|
||||
db.createCollection('firmware', function(err, collection) { });
|
||||
|
||||
// ToDo : check for new hex files / only load if new / get type and version from filename
|
||||
for (var i = 0; i < hexFiles.length; i++)
|
||||
loadFirmware(i, 1, hexFiles[i], db);
|
||||
for (var i = 0; i < fwHexFiles.length; i++)
|
||||
loadFirmware(i, 1, fwHexFiles[i], db);
|
||||
|
||||
var gw;
|
||||
if (gwType == 'Ethernet') {
|
||||
|
||||
+23
-40
@@ -1,45 +1,28 @@
|
||||
var NodeIdToReboot = 1;
|
||||
|
||||
var gwType = 'Ethernet';
|
||||
var gwAddress = '10.0.1.99';
|
||||
var gwPort = 9999;
|
||||
const dbAddress = '127.0.0.1';
|
||||
const dbPort = 27017;
|
||||
const dbName = 'MySensorsDb';
|
||||
|
||||
var BROADCAST_ADDRESS = 255;
|
||||
var NODE_SENSOR_ID = 255;
|
||||
|
||||
function encode(destination, sensor, command, acknowledge, type, payload, binary) {
|
||||
var msg = destination.toString(10) + ";" + sensor.toString(10) + ";" + command.toString(10) + ";" + acknowledge.toString(10) + ";" + type.toString(10) + ";";
|
||||
if (binary) {
|
||||
for (var i = 0; i < payload.length; i++) {
|
||||
if (payload[i] < 16)
|
||||
msg += "0";
|
||||
msg += payload[i].toString(16);
|
||||
}
|
||||
} else {
|
||||
msg += payload;
|
||||
var dbc = require('mongodb').MongoClient;
|
||||
dbc.connect('mongodb://' + dbAddress + ':' + dbPort + '/' + dbName, function(err, db) {
|
||||
if (err) {
|
||||
console.log('Error connecting to database at mongodb://' + dbAddress + ':' + dbPort + '/' + dbName);
|
||||
} else {
|
||||
db.collection('node', function(err, c) {
|
||||
c.update({
|
||||
'id': NodeIdToReboot
|
||||
}, {
|
||||
$set: {
|
||||
'reboot': 1
|
||||
}
|
||||
}, function(err, result) {
|
||||
if (err)
|
||||
console.log("Error writing reboot request to database");
|
||||
else
|
||||
console.log("Reboot request saved to database");
|
||||
});
|
||||
});
|
||||
}
|
||||
msg += '\n';
|
||||
return msg.toString();
|
||||
}
|
||||
|
||||
function rebootNode(destination, gw) {
|
||||
var sensor = NODE_SENSOR_ID;
|
||||
var command = 3; // C_INTERNAL
|
||||
var acknowledge = 0; // no ack
|
||||
var type = 13; // I_REBOOT
|
||||
var payload = "";
|
||||
var td = encode(destination, sensor, command, acknowledge, type, payload, false);
|
||||
console.log('-> ' + td.toString());
|
||||
gw.write(td);
|
||||
}
|
||||
|
||||
var gw = require('net').Socket();
|
||||
gw.connect(gwPort, gwAddress);
|
||||
gw.setEncoding('ascii');
|
||||
gw.on('connect', function() {
|
||||
console.log('connected to ethernet gateway at ' + gwAddress + ":" + gwPort);
|
||||
rebootNode(NodeIdToReboot, gw);
|
||||
console.log('reboot request submitted for ' + NodeIdToReboot);
|
||||
}).on('end', function() {
|
||||
console.log('disconnected from gateway');
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user