solar-scores
Version:
Compute scores for solar decathlon competition - Cali 2015
309 lines (290 loc) • 7.64 kB
JavaScript
;
const DAYS_OFFSET = process.env.SCORES_DAY_OFFSET || 0;
var periods = {};
var points = require('./points');
const moment = require('moment');
let allTime = [
{
begin: '2015-12-05 12:00:00',
end: '2015-12-06 00:00:00'
},
{
begin: '2015-12-06 00:00:00',
end: '2015-12-07 00:00:00'
},
{
begin: '2015-12-07 00:00:00',
end: '2015-12-08 00:00:00'
},
{
begin: '2015-12-08 00:00:00',
end: '2015-12-09 00:00:00'
},
{
begin: '2015-12-09 00:00:00',
end: '2015-12-10 00:00:00'
},
{
begin: '2015-12-10 00:00:00',
end: '2015-12-11 00:00:00'
},
{
begin: '2015-12-11 00:00:00',
end: '2015-12-12 00:00:00'
},
{
begin: '2015-12-12 00:00:00',
end: '2015-12-13 00:00:00'
},
{
begin: '2015-12-13 00:00:00',
end: '2015-12-14 00:00:00'
},
{
begin: '2015-12-14 00:00:00',
end: '2015-12-14 12:00:00'
}
];
periods.Temperature = [
{
begin: '2015-12-05 19:30:00',
end: '2015-12-06 00:00:00',
factor:0.5474860335
},
{
begin: '2015-12-06 00:00:00',
end: '2015-12-06 6:00:00',
factor:0.5474860335
},
{
begin: '2015-12-06 6:00:00',
end: '2015-12-06 10:00:00',
factor:1.826530612
},
{
begin: '2015-12-06 19:30:00',
end: '2015-12-07 00:00:00',
factor:0.5474860335
},
{
begin: '2015-12-07 00:00:00',
end: '2015-12-07 06:00:00',
factor:0.5474860335
},
{
begin: '2015-12-07 06:00:00',
end: '2015-12-07 09:30:00',
factor:1.826530612
},
{
begin: '2015-12-07 13:00:00',
end: '2015-12-07 17:00:00',
factor:1.826530612
},
{
begin: '2015-12-07 20:30:00',
end: '2015-12-08 00:00:00',
factor:0.5474860335
},
{
begin: '2015-12-08 00:00:00',
end: '2015-12-08 06:00:00',
factor:0.5474860335
},
{
begin: '2015-12-08 06:00:00',
end: '2015-12-08 09:30:00',
factor:1.826530612
},
{
begin: '2015-12-08 20:30:00',
end: '2015-12-09 00:00:00',
factor:0.5474860335
},
{
begin: '2015-12-09 00:00:00',
end: '2015-12-09 06:00:00',
factor:0.5474860335
},
{
begin: '2015-12-09 06:00:00',
end: '2015-12-09 09:30:00',
factor:1.826530612
},
{
begin: '2015-12-09 13:00:00',
end: '2015-12-09 17:00:00',
factor:1.826530612
},
{
begin: '2015-12-09 20:30:00',
end: '2015-12-10 00:00:00',
factor:0.5474860335
},
{
begin: '2015-12-10 00:00:00',
end: '2015-12-10 06:00:00',
factor:0.5474860335
},
{
begin: '2015-12-10 06:00:00',
end: '2015-12-10 09:30:00',
factor:1.826530612
},
{
begin: '2015-12-10 13:00:00',
end: '2015-12-10 17:00:00',
factor:1.826530612
},
{
begin: '2015-12-10 20:30:00',
end: '2015-12-11 00:00:00',
factor:0.5474860335
},
{
begin: '2015-12-11 00:00:00',
end: '2015-12-11 06:00:00',
factor:0.5474860335
},
{
begin: '2015-12-11 06:00:00',
end: '2015-12-11 09:30:00',
factor:1.826530612
},
{
begin: '2015-12-11 13:00:00',
end: '2015-12-11 17:00:00',
factor:1.826530612
},
{
begin: '2015-12-11 20:30:00',
end: '2015-12-12 00:00:00',
factor:0.5474860335
},
{
begin: '2015-12-12 00:00:00',
end: '2015-12-12 06:00:00',
factor:0.5474860335
},
{
begin: '2015-12-12 06:00:00',
end: '2015-12-12 09:30:00',
factor:1.826530612
},
{
begin: '2015-12-12 19:30:00',
end: '2015-12-13 00:00:00',
factor:0.5474860335
},
{
begin: '2015-12-13 00:00:00',
end: '2015-12-13 06:00:00',
factor:0.5474860335
},
{
begin: '2015-12-13 06:00:00',
end: '2015-12-13 10:00:00',
factor:1.826530612
},
{
begin: '2015-12-13 19:30:00',
end: '2015-12-14 00:00:00',
factor:0.5474860335
},
{
begin: '2015-12-14 00:00:00',
end: '2015-12-14 06:00:00',
factor:0.5474860335
},
{
begin: '2015-12-14 06:00:00',
end: '2015-12-14 10:00:00',
factor:1.826530612
}
];
periods.Humidity = periods.Temperature;
periods.Luminosity = eachDay('06:00:00', '18:00:00');
periods.Luminosity[0] = {
begin: '2015-12-05 12:00:00',
end: '2015-12-05 18:30:00'
};
periods.Refrigeration = periods.Freezing = periods.PowerPeaks
= periods.EglEl = periods.EnergyBalance = periods.EnergyConsumption
= periods.Water = allTime;
for(let key in periods) {
periods[key] = periods[key].map(function(period) {
if(period.factor){
return {
begin: moment(new Date(period.begin + ' GMT-0500')).add(DAYS_OFFSET, 'days').toDate(),
end: moment(new Date(period.end + ' GMT-0500')).add(DAYS_OFFSET, 'days').toDate(),
factor:period.factor
}
}
else{
return {
begin: moment(new Date(period.begin + ' GMT-0500')).add(DAYS_OFFSET, 'days').toDate(),
end: moment(new Date(period.end + ' GMT-0500')).add(DAYS_OFFSET, 'days').toDate()
}
}
});
}
for(let key in periods) {
let duration = doDuration(periods[key]);
for(let i=0; i<periods[key].length ; i++) {
let interval = periods[key][i];
if(!interval.factor)
interval.points = getIntervalFraction(interval, duration) * points[key];
else{
interval.points = getIntervalFraction(interval, duration) * points[key]*interval.factor;
}
}
periods[key].totalDuration = duration * 3600;
}
function doDuration(period) {
let duration = moment.duration(0);
for(let i=0; i<period.length; i++) {
let begin = new Date(period[i].begin);
let end = new Date(period[i].end);
var dur = moment.duration(moment(end).diff(begin));
period[i].duration = dur.asSeconds();
duration.add(dur);
}
return duration.as('hours');
}
function getIntervalFraction(interval, totalDuration) {
var duration = moment.duration(moment(interval.end).diff(interval.begin)).asHours();
return duration / totalDuration;
}
function eachDay(timeBegin, timeEnd) {
let days = ['2015-12-05', '2015-12-06', '2015-12-07', '2015-12-08', '2015-12-09', '2015-12-10', '2015-12-11', '2015-12-12', '2015-12-13'];
return days.map(function(day) {
return {
begin: day + ' ' + timeBegin,
end: day + ' ' + timeEnd
};
});
}
function byDay(periods) {
var p = {};
for(let key in periods) {
p[key] = oneByDay(periods[key]);
}
return p;
}
function oneByDay(period) {
let days = new Map();
for(let i=0; i<period.length; i++) {
let day = moment(period[i].begin).format('YYYY-MM-DD');
let el = days.get(day);
if(!el) {
days.set(day, {day: day, periods: []});
el = days.get(day);
}
el.periods.push(period[i]);
}
return Array.from(days.values());
}
module.exports = {};
module.exports.all = periods;
module.exports.byDay = byDay(periods);
module.exports.oneByDay = oneByDay;