use c3 for stacked spline
This commit is contained in:
@@ -17,6 +17,7 @@ var EnergyDatum = DB.sequelize.define(NAME, {
|
||||
day: {
|
||||
type: DB.Sequelize.INTEGER,
|
||||
},
|
||||
irradiance: DB.Sequelize.FLOAT,
|
||||
production: DB.Sequelize.FLOAT,
|
||||
consumption: DB.Sequelize.FLOAT
|
||||
}, {
|
||||
@@ -34,8 +35,6 @@ var EnergyDatum = DB.sequelize.define(NAME, {
|
||||
exposeForHouseAtDates: (house_id, dates)=>{
|
||||
var params = {house_id: house_id};
|
||||
extend(params, ApiHelper.datesParamToSequelize(dates, 'day'));
|
||||
console.log('EnergyDatum#exposeForHouseAtDates')
|
||||
console.log(params, dates)
|
||||
return EnergyDatum.findAll({
|
||||
where: params,
|
||||
attributes: ['id', 'production', 'consumption', 'day']
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import moment from 'moment-timezone';
|
||||
import DB from "./../config/database";
|
||||
import DataHelper from './../lib/data_helper';
|
||||
|
||||
const NAME = 'House';
|
||||
|
||||
@@ -15,6 +16,7 @@ var House = DB.sequelize.define(NAME, {
|
||||
},
|
||||
timezone: DB.Sequelize.STRING,
|
||||
name: DB.Sequelize.STRING,
|
||||
production_multiplier: DB.Sequelize.FLOAT,
|
||||
data_until: {
|
||||
type: DB.Sequelize.INTEGER,
|
||||
},
|
||||
@@ -33,37 +35,53 @@ var House = DB.sequelize.define(NAME, {
|
||||
if (minute > 420 && minute < 1140){
|
||||
multiplier = 1 - Math.abs(780 - minute) / 360;
|
||||
}
|
||||
return multiplier;
|
||||
return multiplier * house.production_multiplier;
|
||||
},
|
||||
unixToLocalDay: function(unix){
|
||||
var house = this;
|
||||
return moment.tz(unix * 1000, house.timezone).startOf('day').unix();
|
||||
},
|
||||
aggregatePowerToEnergyData: function(){
|
||||
dayToMonthDayString: function(unix){
|
||||
var house = this;
|
||||
return moment.tz(unix * 1000, house.timezone).format('MM-DD');
|
||||
},
|
||||
aggregatePowerToEnergyData: function(){
|
||||
var house = this,
|
||||
base_irradiance;
|
||||
return DB.EnergyDatum.destroy({where: {house_id: house.id}})
|
||||
.then(()=>{
|
||||
return DataHelper.baseIrradiance();
|
||||
})
|
||||
.then((data)=>{
|
||||
base_irradiance = data;
|
||||
return DB.PowerDatum.count({where: {house_id: house.id}})
|
||||
})
|
||||
.then((count)=>{
|
||||
var limit = 0,
|
||||
energy_data = new Map(),
|
||||
promises = [];
|
||||
console.log('House#aggregatePowerToEnergyData')
|
||||
while (limit < count){
|
||||
let complete = DB.PowerDatum.findAll({where: {house_id: house.id}, limit: 1000, offset: limit, order: 'id ASC'})
|
||||
.then((power_data)=>{
|
||||
power_data.forEach((power_datum)=>{
|
||||
var day = house.unixToLocalDay(power_datum.time),
|
||||
energy_datum = energy_data.get(day) || {production: 0, consumption: 0, day: day, house_id: house.id};
|
||||
energy_datum.production += power_datum.production / 1000; // convert Wh to kWh
|
||||
energy_datum.consumption += power_datum.consumption / 1000; // convert Wh to kWh
|
||||
energy_data.set(day, energy_datum);
|
||||
});
|
||||
});
|
||||
.then((power_data)=>{
|
||||
power_data.forEach((power_datum)=>{
|
||||
var day = house.unixToLocalDay(power_datum.time),
|
||||
energy_datum = energy_data.get(day) || {production: 0, consumption: 0, day: day, house_id: house.id};
|
||||
energy_datum.production += power_datum.production / 1000; // convert Wh to kWh
|
||||
energy_datum.consumption += power_datum.consumption / 1000; // convert Wh to kWh
|
||||
energy_data.set(day, energy_datum);
|
||||
});
|
||||
});
|
||||
promises.push(complete);
|
||||
limit += 1000;
|
||||
}
|
||||
return Promise.all(promises).then(()=>{
|
||||
Array.from(energy_data.values()).forEach((energy_datum)=>{
|
||||
let day_multiplier = 1 + Math.random() * 0.10 - 0.05,
|
||||
base_day_irradiance = base_irradiance[house.dayToMonthDayString(energy_datum.day)] || 105,
|
||||
irradiance = base_day_irradiance * house.production_multiplier * day_multiplier;
|
||||
energy_datum.irradiance = irradiance;
|
||||
})
|
||||
return DB.EnergyDatum.bulkCreate(Array.from(energy_data.values()), {validate: true});
|
||||
});
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user