127.0.0.1:8000 smart-home-server / master server / utils / tplink.js
master

Tree @master (Download .tar.gz)

tplink.js @masterraw · history · blame

const utils = require('.');
const {
    login
} = require("tplink-cloud-api");

let tplink;

login(
    process.env.TPLINK_EMAIL,
    process.env.TPLINK_PASSWORD,
    utils.uuid()
).then(function(new_tplink) {
    tplink = new_tplink;
    console.log("TPLink authentication successful");
}).catch(console.error);

module.exports = {
    set_devices: set_devices,
};

function set_devices( /* ...devices [optional], state */ ) {
    let devices;
    let state;
    if (arguments.length === 1) {
        devices = [];
        state = arguments[0];
    } else {
        devices = [...arguments];
        state = devices.pop();
    }

    return tplink.getDeviceList().then(function(device_list) {
        let asyncFunctions = [];
        for (const device_data of device_list) {
            const device = tplink.newDevice(device_data);
            if (device.disconnected) { // might be !device.status
                console.log(device.alias, "disconnected!");
                continue;
            }

            if (!devices.length || utils.includes_substr(devices, device.alias)) {
                asyncFunctions.push(function(callback) {
                    device.isOn().then(function(on) {
                        if (on !== state) {
                            if (on) {
                                console.log("Turn off", device.alias);
                                device.powerOff();
                            } else {
                                console.log("Turn on", device.alias);
                                device.powerOn();
                            }
                            callback(true);
                        } else {
                            console.log(`${device.alias} is already ${on ? "on" : "off"}`);
                            callback();
                        }
                    });
                });
            }
        }
        return asyncFunctions;
    }).then(function(asyncFunctions) {
        return new Promise(function(resolve) {
            utils.asyncCallback(asyncFunctions, resolve);
        });
    });
}