93 lines
2.7 KiB
JavaScript
93 lines
2.7 KiB
JavaScript
import extend from 'extend';
|
|
import moment from 'moment-timezone';
|
|
|
|
import DateRange from './../../shared/utils/date_range';
|
|
import EnergyDataApi from 'api/energy_data';
|
|
|
|
const NAME = 'EnergyDatum';
|
|
const COLLECTION_DEFAULTS = {
|
|
indices: ['day']
|
|
};
|
|
|
|
class EnergyDatum {
|
|
constructor(data, house){
|
|
var energy_datum = this;
|
|
energy_datum.house = house;
|
|
energy_datum.data = data;
|
|
}
|
|
|
|
get scoped_id(){
|
|
return `energy-datum-${this.data.id}`;
|
|
}
|
|
|
|
// returns a datestamp that has the client timezone, but actually is house local time.
|
|
get day_to_date(){
|
|
var energy_datum = this,
|
|
house = energy_datum.house;
|
|
return house.toDate(energy_datum.data.day);
|
|
}
|
|
|
|
get day_to_s(){
|
|
var energy_datum = this;
|
|
return moment.tz(energy_datum.data.day * 1000, energy_datum.house.data.timezone).format('YYYY-MM-DD');
|
|
}
|
|
|
|
get irradiance(){
|
|
var energy_datum = this;
|
|
return Math.round(energy_datum.data.irradiance);
|
|
}
|
|
|
|
get consumption(){
|
|
var energy_datum = this;
|
|
return Math.round(energy_datum.data.consumption);
|
|
}
|
|
|
|
get production(){
|
|
var energy_datum = this;
|
|
return Math.round(energy_datum.data.production);
|
|
}
|
|
|
|
// This method will ensure the energy data for the passed houses while:
|
|
// 1. Making only 1 API.
|
|
// 2. Only opening 1 house LokiJs DB at a time.
|
|
static ensureEnergyDataForHouses(houses, date_range){
|
|
var new_ranges = {}, params = [];
|
|
houses.forEach((house)=>{
|
|
var query_ranges = DateRange.addRange(date_range, house.data.energy_datum_ranges || []);
|
|
if (query_ranges.gaps_filled.length > 0) {
|
|
params.push({dates: query_ranges.gaps_filled, house_id: house.data.id});
|
|
new_ranges[house.data.id] = query_ranges.new_ranges;
|
|
}
|
|
});
|
|
|
|
// already have all the data we need.
|
|
if (params.length === 0) return Promise.resolve();
|
|
|
|
// get all data needed for all houses in one call.
|
|
return new Promise((fnResolve, fnReject)=>{
|
|
EnergyDataApi.index({houses: params})
|
|
.then((energy_data)=>{
|
|
energy_data = energy_data.reduce((grouped, energy_datum)=>{
|
|
grouped[energy_datum.house_id] = grouped[energy_datum.house_id] || [];
|
|
grouped[energy_datum.house_id].push(energy_datum);
|
|
return grouped;
|
|
}, {});
|
|
houses.reduce((promise, house)=>{
|
|
return promise.then(()=>{
|
|
if (!energy_data[house.data.id]) return Promise.resolve();
|
|
return house.saveEnergyData(energy_data[house.data.id], new_ranges[house.data.id])
|
|
}).then(()=>{
|
|
house.closeDb();
|
|
});
|
|
}, Promise.resolve()).then(fnResolve);
|
|
});
|
|
})
|
|
}
|
|
|
|
}
|
|
|
|
EnergyDatum.NAME = NAME;
|
|
EnergyDatum.COLLECTION_DEFAULTS = COLLECTION_DEFAULTS;
|
|
|
|
export default EnergyDatum;
|