From c75ae9030c505ec1b7e31911347d10beec7ea9ef Mon Sep 17 00:00:00 2001 From: Eric Hulburd Date: Wed, 10 Feb 2016 18:57:15 -0600 Subject: [PATCH] render energy savings table --- client/dashboard/layout/layout.js | 5 +++-- client/dashboard/layout/layout.rt | 4 ++-- client/dashboard/layout/layout.rt.js | 2 +- client/models/house.js | 4 ++-- client/models/power_datum.js | 2 +- server/controllers/energy_controller.js | 2 +- server/lib/tasks/seed_data.js | 17 ++++++++--------- server/models/energy_datum.js | 8 +++++--- server/models/house.js | 5 ++--- server/models/power_datum.js | 4 +++- 10 files changed, 28 insertions(+), 25 deletions(-) diff --git a/client/dashboard/layout/layout.js b/client/dashboard/layout/layout.js index 09c6871..043519b 100644 --- a/client/dashboard/layout/layout.js +++ b/client/dashboard/layout/layout.js @@ -35,8 +35,9 @@ var Layout = React.createClass({ var layout = this, view = event.target.value; layout.view_name = event.target.innerText; - layout.setState({view: view}); - layout.ensureHouseViewData(); + layout.setState({view: view}, function(){ + layout.ensureHouseViewData(); + }); }, setHouse: function(event){ diff --git a/client/dashboard/layout/layout.rt b/client/dashboard/layout/layout.rt index 6bc107d..7424807 100644 --- a/client/dashboard/layout/layout.rt +++ b/client/dashboard/layout/layout.rt @@ -19,8 +19,8 @@ Day - Consumption (Wh) - Production (Wh) + Consumption (kWh) + Production (kWh) diff --git a/client/dashboard/layout/layout.rt.js b/client/dashboard/layout/layout.rt.js index db1a687..ff597ae 100644 --- a/client/dashboard/layout/layout.rt.js +++ b/client/dashboard/layout/layout.rt.js @@ -33,7 +33,7 @@ export default function () { 'onChange': this.setHouse }, _.map(this.state.houses, repeatHouse2.bind(this)) - ])) : null, this.state.view === 'energy' && this.state.house ? React.createElement('table', { 'className': 'table' }, React.createElement('thead', {}, React.createElement('tr', {}, React.createElement('th', {}), React.createElement('th', {}, 'Day'), React.createElement('th', {}, 'Consumption (Wh)'), React.createElement('th', {}, 'Production (Wh)'))), React.createElement.apply(this, [ + ])) : null, this.state.view === 'energy' && this.state.house ? React.createElement('table', { 'className': 'table' }, React.createElement('thead', {}, React.createElement('tr', {}, React.createElement('th', {}), React.createElement('th', {}, 'Day'), React.createElement('th', {}, 'Consumption (kWh)'), React.createElement('th', {}, 'Production (kWh)'))), React.createElement.apply(this, [ 'tbody', {}, _.map(this.state.house.energy_data, repeatEnergy_datum3.bind(this)) diff --git a/client/models/house.js b/client/models/house.js index 730e612..c94a527 100644 --- a/client/models/house.js +++ b/client/models/house.js @@ -82,7 +82,7 @@ class House { if (date_range.length === 0) return house.getEnergyData({dates: [[opts.start_date, opts.end_date]]}) - query_ranges = MathUtil.minusRange([start_date, end_date], [min_date, max_date]); + query_ranges = MathUtil.minusRange([opts.start_date, opts.end_date], [min_date, max_date]); cache = ArrayUtil.selectMap(date_range, (datum_day)=>{ return ArrayUtil.all(query_ranges, (query_range)=>{ @@ -105,7 +105,7 @@ class House { return EnergyDataApi.index(params).then((energy_data)=>{ return energy_data.map((energy_datum_data)=>{ var energy_datum = EnergyDatum.updateOrInitialize(energy_datum_data, house); - house.energy_data_store.set(power_datum.time, energy_datum); + house.energy_data_store.set(energy_datum.day, energy_datum); house.energy_data.push(energy_datum); return energy_datum; }); diff --git a/client/models/power_datum.js b/client/models/power_datum.js index 22b3c88..c21acfb 100644 --- a/client/models/power_datum.js +++ b/client/models/power_datum.js @@ -23,7 +23,7 @@ class PowerDatum { get time_to_s(){ var power_datum = this; - return power_datum.data.time.format('YYYY-MM-DD HH:MM'); + return power_datum.data.time.format('YYYY-MM-DD HH:mm'); } get consumption_to_s(){ var power_datum = this; diff --git a/server/controllers/energy_controller.js b/server/controllers/energy_controller.js index 06c05d0..9646461 100644 --- a/server/controllers/energy_controller.js +++ b/server/controllers/energy_controller.js @@ -6,7 +6,7 @@ class EnergyController{ static index(req, res){ DB.EnergyDatum.exposeForHouseAtDates(req.query.house_id, req.query.dates).then((energy_data)=>{ - req.json({data: energy_data}); + res.json({data: energy_data}); }); } diff --git a/server/lib/tasks/seed_data.js b/server/lib/tasks/seed_data.js index ba1a273..797ee5e 100644 --- a/server/lib/tasks/seed_data.js +++ b/server/lib/tasks/seed_data.js @@ -21,23 +21,23 @@ export class PowerDataSeed { data.time = moment.utc(parseInt(data.time * 1000)).format(); rows.push(data); if (rows.length % 100 === 0){ - DB.PowerDatum.bulkCreate(rows, {validate: true}).then(()=>{ - rows = []; + DB.PowerDatum.bulkCreate(rows, {validate: true}).catch((error)=>{ + console.error(JSON.stringify(error)); + console.error(JSON.stringify(rows)); }); + rows = []; } }); csvStream.on("end", function(){ console.log("all rows parsed") DB.PowerDatum.bulkCreate(rows, {validate: true}).then(()=>{ return DB.House.findAll().then((houses)=>{ - var promise = Promise.resolve(); - + var promises = []; for (var house of houses){ - promise = promise.then(()=>{ - return house.aggregatePowerToEnergyData(); - }); + var p = house.aggregatePowerToEnergyData(); + promises.push(p); } - return promise; + return Promise.all(promises); }); }).then(()=>{ console.log("DONE!") @@ -90,7 +90,6 @@ export class HouseSeed { rows = []; csvStream.on("data", function(data){ - console.log(JSON.stringify(data)) rows.push(data); }); csvStream.on("end", function(){ diff --git a/server/models/energy_datum.js b/server/models/energy_datum.js index 77cae18..5d54a71 100644 --- a/server/models/energy_datum.js +++ b/server/models/energy_datum.js @@ -14,7 +14,9 @@ var EnergyDatum = DB.sequelize.define(NAME, { primaryKey: true, autoIncrement: true // Automatically gets converted to SERIAL for postgres }, - day: DB.Sequelize.DATEONLY, + day: { + type: DB.Sequelize.DATEONLY, + }, production: DB.Sequelize.FLOAT, consumption: DB.Sequelize.FLOAT }, { @@ -22,9 +24,9 @@ var EnergyDatum = DB.sequelize.define(NAME, { underscored: true, tableName: "energy_data", instanceMethods: { - exposeToApi: ()=>{ + exposeToApi: function(){ var energy_datum = this, - values = this.dataValues; + values = energy_datum.dataValues; values.energy_datum = energy_datum.day.getTime() / 1000; return values; } diff --git a/server/models/house.js b/server/models/house.js index ad3d453..1cd9e3c 100644 --- a/server/models/house.js +++ b/server/models/house.js @@ -44,11 +44,10 @@ var House = DB.sequelize.define(NAME, { power_data.forEach((power_datum)=>{ var day = house.timeToDateString(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; - energy_datum.consumption += power_datum.consumption; + 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); }); - console.log(Array.from(energy_data.values())) return DB.EnergyDatum.bulkCreate(Array.from(energy_data.values()), {validate: true}); }); } diff --git a/server/models/power_datum.js b/server/models/power_datum.js index 36bc3b2..99b29e2 100644 --- a/server/models/power_datum.js +++ b/server/models/power_datum.js @@ -14,7 +14,9 @@ var PowerDatum = DB.sequelize.define(NAME, { primaryKey: true, autoIncrement: true // Automatically gets converted to SERIAL for postgres }, - time: DB.Sequelize.DATE, + time: { + type: DB.Sequelize.DATE, + }, consumption: DB.Sequelize.FLOAT, production: DB.Sequelize.FLOAT }, {