homebridge-synology = function (homebridge) { Service = homebridge.hap.Service; Characteristic = homebridge.hap.Characteristic; fixInheritance(SynologyAccessory.CpuLoad, Characteristic); fixInheritance(SynologyAccessory.DiskUsage, Characteristic); fixInheritance(SynologyAccessory.StatsService, Service); homebridge.registerAccessory('homebridge-synology', 'Synology', SynologyAccessory); }
n/a
synology = function (params) { this.ip = params.ip; this.mac = params.mac; this.secure = params.secure || false; this.port = params.port || (this.secure ? 5001 : 5000); this.timeout = parseInt(params.timeout) || 5000; //request timeout this.version = parseInt(params.version) || 6; this.user = params.user; this.passwd = params.passwd; this.auth = { sid: '', //session id time: '', //unix time timeout: 15 * 60 //in sec }; this.url = 'http' + (this.secure ? 's' : '') + '://' + this.ip + ':' + this.port; }
n/a
synology = function (params) { this.ip = params.ip; this.mac = params.mac; this.secure = params.secure || false; this.port = params.port || (this.secure ? 5001 : 5000); this.timeout = parseInt(params.timeout) || 5000; //request timeout this.version = parseInt(params.version) || 6; this.user = params.user; this.passwd = params.passwd; this.auth = { sid: '', //session id time: '', //unix time timeout: 15 * 60 //in sec }; this.url = 'http' + (this.secure ? 's' : '') + '://' + this.ip + ':' + this.port; }
n/a
_login = function () { var that = this; return new Promise(function(resolve, reject) { if(that.isLoggedIn()) { resolve("Still logged in") } else { var options = { url: that.url + '/webapi/auth.cgi', timeout: that.timeout, qs: { api: 'SYNO.API.Auth', method: 'login', version: 3, account: that.user, passwd: that.passwd, session: 'homebridge-synology-' + Math.random().toString(36).replace(/[^a-z]+/g, '').substr(0, 10), format: 'sid' } }; request.get(options, function(err, res, body) { if(!err) { var json = JSON.parse(body); that.auth.sid = json.data.sid; that.auth.time = (new Date / 1e3 | 0); resolve("Login successfull"); } else { reject("Can't Login to Diskstation") } }); } }); }
...
/**
* Shutdown your Diskstation
* @param callback
*/
Synology.prototype.shutdown = function(callback) {
var that = this;
that._login().then(function() {
var apiUrl = (that.version >= 6) ? '/webapi/entry.cgi' : '/webapi/dsm/system.cgi';
var options = {
url: that.url + apiUrl,
qs: {
api: (that.version >= 6) ? 'SYNO.Core.System' : 'SYNO.DSM.System',
version: 1,
...
getCpuLoad = function (callback) { var that = this; that._login().then(function() { var apiUrl = (that.version >= 6) ? '/webapi/entry.cgi' : '/webapi/dsm/system_loading.cgi'; var options = { url: that.url + apiUrl, qs: { api: (that.version >= 6) ? 'SYNO.Core.System.Utilization' : 'SYNO.DSM.SystemLoading', version: 1, method: (that.version >= 6) ? 'get' : 'getinfo', type: 'current', resource: ['cpu'], _sid: that.auth.sid }, method: 'GET' }; request(options, function(err, res, body) { if (!err && res.statusCode == 200) { var json = JSON.parse(body); if (json.success) { if (that.version >= 6) { var load = json.data.cpu['other_load'] + json.data.cpu['system_load'] + json.data.cpu['user_load']; } else { load = Math.round(json.data.cpu.user * 100); } callback(null, load); } else { callback("An error occured while getting CpuLoad: " + json.error.code); } } else { callback("An error occured while getting CpuLoad: " + err); } }); }).catch(function(err) { callback("An error occured while getting CpuLoad: " + err); }) }
...
}
};
SynologyAccessory.prototype.getCpuLoad = function (callback) {
var that = this;
that.synology.getCpuLoad(function (err, data) {
if (!err) {
that.log('current cpu load: %s %', data);
callback(null, data);
} else {
that.log(err);
callback(null, 0); //testing
}
...
getDiskTemp = function (callback) { var that = this; that._login().then(function(res) { var apiUrl = (that.version >= 6) ? '/webapi/entry.cgi' : '/webapi/dsm/info.cgi'; var options = { url: that.url + apiUrl, qs: { api: (that.version >= 6) ? 'SYNO.Core.System' : '', version: 1, method: (that.version >= 6) ? 'info' : 'getinfo', type: 'storage', _sid: that.auth.sid }, method: 'GET' }; request(options, function(err, res, body) { if (!err && res.statusCode == 200) { var json = JSON.parse(body); if (json.success) { var temp = 0; for (var i = json.data.hdd_info.length; i--;) { temp += json.data.hdd_info[i].temp; } temp = Math.round(temp / json.data.hdd_info.length); callback(null, temp); } else { callback(err); } } else { callback(err); } }); }).catch(function(err) { callback(err); }); }
...
};
request(options, function(err, res, body) {
if (!err && res.statusCode == 200) {
var json = JSON.parse(body);
if (json.success && typeof json.data.temperature !== 'undefined') {
callback(null, json.data.temperature);
} else {
that.getDiskTemp(function(error, data) {
if(!error) {
callback(null, data)
} else {
callback("An error occured while getting SystemTemp: " + error)
}
});
}
...
getDiskUsage = function (callback) { var that = this; that._login().then(function() { var apiUrl = (that.version >= 6) ? '/webapi/entry.cgi' : '/webapi/dsm/volume.cgi'; var options = { url: that.url + apiUrl, qs: { api: (that.version >= 6) ? 'SYNO.Core.System' : 'SYNO.DSM.Volume', version: 1, method: (that.version >= 6) ? 'info' : 'list', type: 'storage', //only dsm >= 6 _sid: that.auth.sid }, method: 'GET' }; request(options, function(err, res, body) { if (!err && res.statusCode == 200) { var json = JSON.parse(body); //dsm version 5.x if (json.success && that.version < 6) { var used = 0, total = 0; for (var i = json.data.volumes.length; i--;) { used += json.data.volumes[i].used; total += json.data.volumes[i].total; } callback(null, Math.round(used / total * 100)); //dsm version 6.x } else if (json.success && that.version >= 6) { var used = 0, total = 0; for (var i = json.data.vol_info.length; i--;) { used += json.data.vol_info[i].used_size; total += json.data.vol_info[i].total_size; } callback(null, Math.round(used / total * 100)); } else { callback("An error occured while getting DiskUsage: " + json.error.code); } } else { callback("An error occured while getting DiskUsage: " + err); } }); }).catch(function(err) { callback(err); }); }
...
});
};
SynologyAccessory.prototype.getDiskUsage = function (callback) {
var that = this;
that.synology.getDiskUsage(function (err, data) {
if (!err) {
that.log('current volume usage: %s %', data);
callback(null, data);
} else {
that.log(err);
callback(null, 0); //testing
}
...
getPowerState = function (callback) { that = this; var options = { url: that.url + '/webman/index.cgi', method: 'GET', timeout: that.timeout } request(options, function(err, res) { if (!err && res.statusCode == 200) { callback(null, true); } else { callback(null, false); } }); }
...
this.addOptionalCharacteristic(new SynologyAccessory.CpuLoad());
};
SynologyAccessory.prototype.getPowerState = function (callback) {
var that = this;
that.synology.getPowerState(function (err, state) {
if (!err) {
that.log('current power state is: ' + state);
callback(null, state);
} else {
that.log(err);
callback(err);
}
...
getSystemTemp = function (callback) { var that = this; that._login().then(function() { var apiUrl = (that.version >= 6) ? '/webapi/entry.cgi' : '/webapi/dsm/info.cgi'; var options = { url: that.url + apiUrl, qs: { api: (that.version >= 6) ? 'SYNO.Core.System' : 'SYNO.DSM.Info', version: 1, method: (that.version >= 6) ? 'info' : 'getinfo', _sid: that.auth.sid }, method: 'GET' }; request(options, function(err, res, body) { if (!err && res.statusCode == 200) { var json = JSON.parse(body); if (json.success && typeof json.data.temperature !== 'undefined') { callback(null, json.data.temperature); } else { that.getDiskTemp(function(error, data) { if(!error) { callback(null, data) } else { callback("An error occured while getting SystemTemp: " + error) } }); } } else { callback("An error occured while getting SystemTemp: " + err); } }); }).catch(function(err) { callback("An error occured while getting SystemTemp: " + err); }); }
...
}
});
};
SynologyAccessory.prototype.getSystemTemp = function (callback) {
var that = this;
that.synology.getSystemTemp(function (err, data) {
if (!err) {
that.log('current system temp: %s °C', data);
callback(null, data);
} else {
that.log(err);
callback(null, 0); //testing
}
...
isLoggedIn = function () { return (this.auth.sid && (this.auth.time + this.auth.timeout) > (new Date / 1e3 | 0)) ? true : false; }
...
* Login to your diskstation
* @return {Promise}
*/
Synology.prototype._login = function() {
var that = this;
return new Promise(function(resolve, reject) {
if(that.isLoggedIn()) {
resolve("Still logged in")
} else {
var options = {
url: that.url + '/webapi/auth.cgi',
timeout: that.timeout,
qs: {
api: 'SYNO.API.Auth',
...
shutdown = function (callback) { var that = this; that._login().then(function() { var apiUrl = (that.version >= 6) ? '/webapi/entry.cgi' : '/webapi/dsm/system.cgi'; var options = { url: that.url + apiUrl, qs: { api: (that.version >= 6) ? 'SYNO.Core.System' : 'SYNO.DSM.System', version: 1, method: 'shutdown', _sid: that.auth.sid }, method: 'GET', }; request(options, function(err, res, body) { (!err && res.statusCode == 200 && JSON.parse(body).success) ? callback(null): callback(err); }); }).catch(function(err) { callback(err); }); }
...
that.log('Something went wrong: ' + err);
callback(err);
}
});
}
else { //turn off
that.synology.shutdown(function (err) {
if (!err) {
that.log("Shutting down Diskstation")
callback(null);
} else {
that.log("Error shutting down your Diskstation")
callback(err);
}
...
wakeUp = function (callback) { var that = this; wol.wake(that.mac, function(err) { if (!err) { callback(null) } else { callback(err); } }); }
...
};
SynologyAccessory.prototype.setPowerState = function (powerState, callback) {
var that = this;
if (powerState) { //turn on
that.synology.wakeUp(function (err) {
if (!err) {
that.log('Diskstation woked up!');
callback(null);
} else {
that.log('Something went wrong: ' + err);
callback(err);
}
...