2019-01-16 09:07:10 +08:00
|
|
|
/* jshint -W097 */
|
|
|
|
/* jshint strict:true */
|
|
|
|
/* jslint node: true */
|
|
|
|
/* jslint esversion: 6 */
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
2019-01-16 09:09:54 +08:00
|
|
|
* yunkong2 sonoff Adapter
|
2019-01-16 09:07:10 +08:00
|
|
|
*
|
|
|
|
* (c) 2017-2019 bluefox
|
|
|
|
*
|
|
|
|
* MIT License
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
const utils = require(__dirname + '/lib/utils'); // Get common adapter utils
|
|
|
|
let adapter;
|
|
|
|
const adapterName = require('./package.json').name.split('.').pop();
|
|
|
|
const Server = require(__dirname + '/lib/server');
|
|
|
|
let server = null;
|
|
|
|
|
|
|
|
function decrypt(key, value) {
|
|
|
|
let result = '';
|
|
|
|
for (let i = 0; i < value.length; ++i) {
|
|
|
|
result += String.fromCharCode(key[i % key.length].charCodeAt(0) ^ value.charCodeAt(i));
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
function startAdapter(options) {
|
|
|
|
options = options || {};
|
|
|
|
Object.assign(options, {name: adapterName});
|
|
|
|
|
|
|
|
adapter = new utils.Adapter(options);
|
|
|
|
|
|
|
|
adapter.on('ready', () => {
|
|
|
|
// it must be like this
|
|
|
|
|
|
|
|
adapter.getForeignObject('system.config', (err, obj) => {
|
|
|
|
if (obj && obj.native && obj.native.secret) {
|
|
|
|
//noinspection JSUnresolvedVariable
|
|
|
|
adapter.config.pass = decrypt(obj.native.secret, adapter.config.pass);
|
|
|
|
} else {
|
|
|
|
//noinspection JSUnresolvedVariable
|
|
|
|
adapter.config.pass = decrypt('Zgfr56gFe87jJOM', adapter.config.pass);
|
|
|
|
}
|
|
|
|
main();
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
adapter.on('unload', cb => {
|
|
|
|
if (server) {
|
|
|
|
server.destroy(cb);
|
|
|
|
} else if (cb) {
|
|
|
|
cb();
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
// is called if a subscribed state changes
|
|
|
|
adapter.on('stateChange', (id, state) => {
|
|
|
|
adapter.log.debug('stateChange ' + id + ': ' + JSON.stringify(state));
|
|
|
|
// you can use the ack flag to detect if state is desired or acknowledged
|
|
|
|
if (state && !state.ack && server) {
|
|
|
|
server.onStateChange(id, state);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
return adapter;
|
|
|
|
}
|
|
|
|
|
|
|
|
function main() {
|
|
|
|
adapter.config.TELE_SENSOR = adapter.config.TELE_SENSOR === true || adapter.config.TELE_SENSOR === 'true';
|
|
|
|
adapter.config.TELE_STATE = adapter.config.TELE_STATE === true || adapter.config.TELE_STATE === 'true';
|
|
|
|
adapter.config.STAT_RESULT = adapter.config.STAT_RESULT === true || adapter.config.STAT_RESULT === 'true';
|
|
|
|
|
|
|
|
// subscribe for all variables
|
|
|
|
adapter.subscribeStates('*');
|
|
|
|
|
|
|
|
// read all states and set alive to false
|
|
|
|
adapter.getStatesOf('', '', (err, states) => {
|
|
|
|
if (states && states.length) {
|
|
|
|
states.forEach(state => {
|
|
|
|
if (state._id.match(/\.alive$/)) {
|
|
|
|
adapter.setForeignState(state._id, false, true);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
server = new Server(adapter);
|
|
|
|
}
|
|
|
|
|
|
|
|
// If started as allInOne/compact mode => return function to create instance
|
|
|
|
if (module && module.parent) {
|
|
|
|
module.exports = startAdapter;
|
|
|
|
} else {
|
|
|
|
// or start the instance directly
|
|
|
|
startAdapter();
|
|
|
|
}
|