citizenwatt-refactor/base/static/js/conso/DataProvider.js

90 lines
2.0 KiB
JavaScript

/**
* Provide a way to get new data.
*/
var DataProvider = function() {
var api = {};
var energy_provider = null; // Cache for energy provider info
var sensor_id = null; // Cache for sensor ID
api.onratechange = function(rate){};
/**
* Get new data from server.
* @param target: Type of data to get (@see API specification)
* @param callback: callback that take data as first argument
*/
api.get = function(target, callback) {
var req = new XMLHttpRequest();
req.open('GET', API_URL + target, true);
req.send();
req.onreadystatechange = function() {
if (req.readyState == 4) {
var res;
try {
res = JSON.parse(req.responseText);
}
catch (e) {
console.log('ERROR while handling `' + target + '`:', req.responseText);
}
if (res && res.rate) {
api.onratechange(res.rate);
}
if (res && res.data === null) res.data = [];
callback(res.data);
}
}
}
/**
* Get current provider info
* @param callback: callback that takes provider
*/
api.getProviderInfo = function(callback) {
if (energy_provider === null) {
api.get('/energy_providers/current', function(provider) {
energy_provider = provider;
callback(energy_provider);
});
} else {
callback(energy_provider);
}
}
/**
* Get watt_euros convertion info
* @param rate: day or night tariff
* @param callback: callback that takes origin value and slope
*/
api.getConvertInfo = function(rate, callback) {
api.getProviderInfo(function(provider){
callback(
provider[rate+'_slope_watt_euros'],
provider[rate+'_constant_watt_euros']
);
});
}
/**
* Get active sensor ID (active iff name is 'CitizenWatt')
* @param callback: callback that takes sensor ID
*/
api.getSensorId = function(callback) {
if (sensor_id == null) {
api.get('/sensors', function(sensors) {
for (var i = sensors.length - 1; i >= 0; i--) {
if (sensors[i].name == 'CitizenWatt')
sensor_id = sensors[i].id;
};
callback(sensor_id);
});
} else {
callback(sensor_id);
}
}
return api;
};