UNPKG

tplink-lightbulb-fix

Version:

Control TP-Link smart-home devices from nodejs

1 lines 15 kB
{"version":3,"file":"tplink-lightbulb.cjs","sources":["../src/index.js"],"sourcesContent":["import dgram from 'dgram'\nimport EventEmitter from 'events'\n\nexport default class TPLSmartDevice {\n constructor (ip) {\n this.ip = ip\n }\n\n // Scan for lightbulbs on your network\n static scan (filter, broadcast = '255.255.255.255') {\n const emitter = new EventEmitter()\n const client = dgram.createSocket({\n type: 'udp4',\n reuseAddr: true\n })\n client.bind(9998, undefined, () => {\n client.setBroadcast(true)\n const msgBuf = TPLSmartDevice.encrypt(Buffer.from('{\"system\":{\"get_sysinfo\":{}}}'))\n client.send(msgBuf, 0, msgBuf.length, 9999, broadcast)\n })\n client.on('message', (msg, rinfo) => {\n const decryptedMsg = this.decrypt(msg).toString('ascii')\n const jsonMsg = JSON.parse(decryptedMsg)\n const sysinfo = jsonMsg.system.get_sysinfo\n\n if (filter && sysinfo.mic_type !== filter) {\n return\n }\n\n const light = new TPLSmartDevice(rinfo.address)\n light._info = rinfo\n light._sysinfo = sysinfo\n light.host = rinfo.address\n light.port = rinfo.port\n light.name = sysinfo.alias\n light.deviceId = sysinfo.deviceId\n\n emitter.emit('light', light)\n })\n emitter.stop = () => client.close()\n return emitter\n }\n\n // Send a message to a lightbulb (for RAW JS message objects)\n send (msg) {\n return new Promise((resolve, reject) => {\n if (!this.ip) {\n return reject(new Error('IP not set.'))\n }\n const client = dgram.createSocket('udp4')\n const message = this.encrypt(Buffer.from(JSON.stringify(msg)))\n client.send(message, 0, message.length, 9999, this.ip, (err, bytes) => {\n if (err) {\n return reject(err)\n }\n client.on('message', msg => {\n resolve(JSON.parse(this.decrypt(msg).toString()))\n client.close()\n })\n })\n })\n }\n\n // TODO: wifi needs more testing. it seems very broken.\n\n // Scans the wifi networks in range of the device\n async listwifi () {\n const r1 = await this.send({\n netif: {\n get_scaninfo: {\n refresh: 1\n }\n }\n })\n\n if (r1?.netif?.get_scaninfo?.ap_list) {\n return r1.netif.get_scaninfo.ap_list\n } else {\n // on fail, try older message-format\n const r2 = await this.send({\n 'smartlife.iot.common.softaponboarding': {\n get_scaninfo: {\n refresh: 1\n }\n }\n })\n if (r2 && r2['smartlife.iot.common.softaponboarding']?.get_scaninfo?.ap_list) {\n return r2['smartlife.iot.common.softaponboarding'].get_scaninfo.ap_list\n }\n }\n }\n\n // Connects the device to the access point in the parameters\n async connectwifi (ssid, password, keyType = 1, cypherType = 0) {\n const r1 = await this.send({\n netif: {\n set_stainfo: {\n cypher_type: cypherType,\n key_type: keyType,\n password,\n ssid\n }\n }\n })\n\n if (r1?.netif?.set_stainfo?.err_code === 0) {\n return true\n }\n\n // on fail, try older message-format\n\n const r2 = await this.send({\n 'smartlife.iot.common.softaponboarding': {\n set_stainfo: {\n cypher_type: cypherType,\n key_type: keyType,\n password,\n ssid\n }\n }\n })\n if (r2['smartlife.iot.common.softaponboarding'] && r2['smartlife.iot.common.softaponboarding'].err_msg) {\n throw new Error(r2['smartlife.iot.common.softaponboarding'].err_msg)\n } else {\n return true\n }\n }\n\n // Get info about the TPLSmartDevice\n async info () {\n const r = await this.send({ system: { get_sysinfo: {} } })\n return r.system.get_sysinfo\n }\n\n // Set power-state of lightbulb\n async power (powerState = true, transition = 0, options = {}) {\n const info = await this.info()\n if (typeof info.relay_state !== 'undefined') {\n return this.send({\n system: {\n set_relay_state: {\n state: powerState ? 1 : 0\n }\n }\n })\n } else {\n const r = await this.send({\n 'smartlife.iot.smartbulb.lightingservice': {\n transition_light_state: {\n ignore_default: 1,\n on_off: powerState ? 1 : 0,\n transition_period: transition,\n ...options\n }\n }\n })\n return r['smartlife.iot.smartbulb.lightingservice'].transition_light_state\n }\n }\n\n // Set led-state of lightbulb\n led (ledState = true) {\n return this.send({ system: { set_led_off: { off: ledState ? 0 : 1 } } })\n }\n\n // Set the name of lightbulb\n async name (newAlias) {\n const info = await this.info()\n return typeof info.dev_name !== 'undefined'\n ? this.send({ system: { set_dev_alias: { alias: newAlias } } })\n : this.send({ 'smartlife.iot.common.system': { set_dev_alias: { alias: newAlias } } })\n }\n\n // Get schedule info\n async daystat (month, year) {\n const now = new Date()\n month = month || now.getMonth() + 1\n year = year || now.getFullYear()\n const r = await this.send({ 'smartlife.iot.common.schedule': { get_daystat: { month: month, year: year } } })\n return r['smartlife.iot.common.schedule'].get_daystat\n }\n\n // Get cloud info from bulb\n async cloud () {\n const r = await this.send({ 'smartlife.iot.common.cloud': { get_info: {} } })\n return r['smartlife.iot.common.cloud'].get_info\n }\n\n // Get schedule from bulb\n async schedule () {\n const r = await this.send({ 'smartlife.iot.common.schedule': { get_rules: {} } })\n return r['smartlife.iot.common.schedule'].get_rules\n }\n\n // Get operational details from bulb\n details () {\n return this.send({ 'smartlife.iot.smartbulb.lightingservice': { get_light_details: {} } })\n }\n\n // Reboot the device\n reboot () {\n return this.send({ 'smartlife.iot.common.system': { reboot: { delay: 1 } } })\n }\n\n // Badly encrypt message in format bulbs use\n static encrypt (buffer, key = 0xAB) {\n for (let i = 0; i < buffer.length; i++) {\n const c = buffer[i]\n buffer[i] = c ^ key\n key = buffer[i]\n }\n return buffer\n }\n\n encrypt (buffer, key) {\n return TPLSmartDevice.encrypt(buffer, key)\n }\n\n // Badly decrypt message from format bulbs use\n static decrypt (buffer, key = 0xAB) {\n for (let i = 0; i < buffer.length; i++) {\n const c = buffer[i]\n buffer[i] = c ^ key\n key = c\n }\n return buffer\n }\n\n decrypt (buffer, key) {\n return TPLSmartDevice.decrypt(buffer, key)\n }\n}\n"],"names":["TPLSmartDevice","constructor","ip","scan","filter","broadcast","emitter","EventEmitter","client","dgram","createSocket","type","reuseAddr","bind","undefined","setBroadcast","msgBuf","encrypt","Buffer","from","send","length","on","msg","rinfo","decryptedMsg","decrypt","toString","jsonMsg","JSON","parse","sysinfo","system","get_sysinfo","mic_type","light","address","_info","_sysinfo","host","port","name","alias","deviceId","emit","stop","close","Promise","resolve","reject","Error","message","stringify","err","bytes","listwifi","r1","netif","get_scaninfo","refresh","ap_list","r2","connectwifi","ssid","password","keyType","cypherType","set_stainfo","cypher_type","key_type","err_code","err_msg","info","r","power","powerState","transition","options","relay_state","set_relay_state","state","transition_light_state","ignore_default","on_off","transition_period","led","ledState","set_led_off","off","newAlias","dev_name","set_dev_alias","daystat","month","year","now","Date","getMonth","getFullYear","get_daystat","cloud","get_info","schedule","get_rules","details","get_light_details","reboot","delay","buffer","key","i","c"],"mappings":"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"}