Delete log file in delete(), new algorithm for weighted average over time
parent
99f79878c9
commit
fdab17a6be
|
|
@ -1,10 +1,15 @@
|
||||||
{
|
{
|
||||||
var filename = "smartbattdata.json";
|
var dataFile = "smartbattdata.json";
|
||||||
var interval;
|
var interval;
|
||||||
var storage=require("Storage");
|
var storage=require("Storage");
|
||||||
|
var settings = Object.assign({
|
||||||
|
//Record Interval stored in ms
|
||||||
|
doLogging:false
|
||||||
|
}, require('Storage').readJSON("smartbatt.settings.json", true) || {});
|
||||||
|
|
||||||
var logFile = "smartbattlog.json";
|
var logFile = "smartbattlog.json";
|
||||||
var doLogging=true;
|
var doLogging=true;
|
||||||
|
|
||||||
function logBatterySample(entry) {
|
function logBatterySample(entry) {
|
||||||
let log = storage.readJSON(logFile, 1) || [];
|
let log = storage.readJSON(logFile, 1) || [];
|
||||||
|
|
||||||
|
|
@ -40,31 +45,27 @@
|
||||||
data.battLastRecorded = batt;
|
data.battLastRecorded = batt;
|
||||||
}
|
}
|
||||||
|
|
||||||
storage.writeJSON(filename, data);
|
storage.writeJSON(dataFile, data);
|
||||||
} else if (deltaHours <= 0 || !isFinite(deltaHours)) {
|
} else if (deltaHours <= 0 || !isFinite(deltaHours)) {
|
||||||
reason = "Skipped: invalid time delta";
|
reason = "Skipped: invalid time delta";
|
||||||
data.timeLastRecorded = now;
|
data.timeLastRecorded = now;
|
||||||
data.battLastRecorded = batt;
|
data.battLastRecorded = batt;
|
||||||
storage.writeJSON(filename, data);
|
storage.writeJSON(dataFile, data);
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
let currentDrainage = battChange / deltaHours;
|
let currentDrainage = battChange / deltaHours;
|
||||||
// Calculate new average
|
|
||||||
let alpha = 0.3; // how "fast" to react (0.1 = slow, 0.5 = fast)
|
|
||||||
|
|
||||||
// Weight alpha by how much time the new reading represents
|
let newAvg = weightedAverage(data.avgBattDrainage, data.totalHours, currentDrainage, deltaHours);
|
||||||
let weight = deltaHours / (deltaHours + 1);
|
data.avgBattDrainage=newAvg;
|
||||||
let effectiveAlpha = alpha * weight;
|
|
||||||
data.avgBattDrainage = (effectiveAlpha * currentDrainage) + (1 - effectiveAlpha) * data.avgBattDrainage;
|
|
||||||
data.timeLastRecorded = now;
|
data.timeLastRecorded = now;
|
||||||
data.totalCycles += 1;
|
data.totalCycles += 1;
|
||||||
data.totalHours+=deltaHours;
|
data.totalHours+=deltaHours;
|
||||||
data.battLastRecorded = batt;
|
data.battLastRecorded = batt;
|
||||||
storage.writeJSON(filename, data);
|
storage.writeJSON(dataFile, data);
|
||||||
|
|
||||||
reason = "Drainage recorded: " + currentDrainage.toFixed(3) + "%/hr";
|
reason = "Drainage recorded: " + currentDrainage.toFixed(3) + "%/hr";
|
||||||
}
|
}
|
||||||
if(doLogging){
|
if(settings.doLogging){
|
||||||
// Always log the sample
|
// Always log the sample
|
||||||
logBatterySample({
|
logBatterySample({
|
||||||
time: now,
|
time: now,
|
||||||
|
|
@ -78,10 +79,14 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function weightedAverage(oldValue, oldWeight, newValue, newWeight) {
|
||||||
|
return (oldValue * oldWeight + newValue * newWeight) / (oldWeight + newWeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function getData() {
|
function getData() {
|
||||||
return storage.readJSON(filename, 1) || {
|
return storage.readJSON(dataFile, 1) || {
|
||||||
avgBattDrainage: 0,
|
avgBattDrainage: 0,
|
||||||
battLastRecorded: E.getBattery(),
|
battLastRecorded: E.getBattery(),
|
||||||
timeLastRecorded: Date.now(),
|
timeLastRecorded: Date.now(),
|
||||||
|
|
@ -104,7 +109,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function deleteData(){
|
function deleteData(){
|
||||||
storage.erase(filename);
|
storage.erase(dataFile);
|
||||||
|
storage.erase(logFile);
|
||||||
}
|
}
|
||||||
// Expose public API
|
// Expose public API
|
||||||
exports.record = recordBattery;
|
exports.record = recordBattery;
|
||||||
|
|
@ -113,7 +119,7 @@
|
||||||
exports.changeInterval = function(newInterval) {
|
exports.changeInterval = function(newInterval) {
|
||||||
clearInterval(interval);
|
clearInterval(interval);
|
||||||
interval=setInterval(recordBattery, newInterval);
|
interval=setInterval(recordBattery, newInterval);
|
||||||
}
|
};
|
||||||
// Start recording every 5 minutes
|
// Start recording every 5 minutes
|
||||||
interval=setInterval(recordBattery, 600000);
|
interval=setInterval(recordBattery, 600000);
|
||||||
recordBattery(); // Log immediately
|
recordBattery(); // Log immediately
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue