Last active
March 17, 2017 19:52
-
-
Save hardillb/f779de69d805239dca14668207992513 to your computer and use it in GitHub Desktop.
A short script to do admin tasks on the WeMo Link ZigBee bridge
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var http = require('http'); | |
var util = require('util'); | |
var postbodyheader = [ | |
'<?xml version="1.0" encoding="utf-8"?>', | |
'<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">', | |
'<s:Body>'].join('\n'); | |
var postbodyfooter = ['</s:Body>', | |
'</s:Envelope>' | |
].join('\n'); | |
// These details need updating to match your setup, the devs.js script can help you discover the values | |
var ipAddr = "192.168.1.52"; | |
var port = 49153; | |
var udn = "uuid:Bridge-1_0-231442B0100xxxx"; | |
var getEndDevices = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#GetEndDevices"', | |
body: [ | |
postbodyheader, | |
'<u:GetEndDevices xmlns:u="urn:Belkin:service:bridge:1">', | |
'<DevUDN>%s</DevUDN>', | |
'<ReqListType>ALL_LIST</ReqListType>', | |
'</u:GetEndDevices>', | |
postbodyfooter | |
].join('\n') | |
} | |
var scanDevices = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#GetEndDevices"', | |
body: [ | |
postbodyheader, | |
'<u:GetEndDevices xmlns:u="urn:Belkin:service:bridge:1">', | |
'<DevUDN>%s</DevUDN>', | |
'<ReqListType>SCAN_LIST</ReqListType>', | |
'</u:GetEndDevices>', | |
postbodyfooter | |
].join('\n') | |
} | |
var unpairedDevices = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#GetEndDevices"', | |
body: [ | |
postbodyheader, | |
'<u:GetEndDevices xmlns:u="urn:Belkin:service:bridge:1">', | |
'<DevUDN>%s</DevUDN>', | |
'<ReqListType>UNPAIRED_LIST</ReqListType>', | |
'</u:GetEndDevices>', | |
postbodyfooter | |
].join('\n') | |
} | |
var addDevice = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#AddDevice"', | |
body: [ | |
postbodyheader, | |
'<u:AddDevice xmlns:u="urn:Belkin:service:bridge:1">', | |
'<DeviceIDs>%s</DeviceIDs>', | |
'</u:AddDevice>', | |
postbodyfooter | |
].join('\n') | |
} | |
var openNetwork = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#OpenNetwork"', | |
body: [ | |
postbodyheader, | |
'<u:OpenNetwork xmlns:u="urn:Belkin:service:bridge:1">', | |
'<DevUDN>%s</DevUDN>', | |
'</u:OpenNetwork>', | |
postbodyfooter | |
].join('\n') | |
} | |
var closeNetwork = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#CloseNetwork"', | |
body: [ | |
postbodyheader, | |
'<u:CloseNetwork xmlns:u="urn:Belkin:service:bridge:1">', | |
'<DevUDN>%s</DevUDN>', | |
'</u:CloseNetwork>', | |
postbodyfooter | |
].join('\n') | |
} | |
var identifyDevice = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#IdentifyDevice"', | |
body: [ | |
postbodyheader, | |
'<u:IdentifyDevice xmlns:u="urn:Belkin:service:bridge:1">', | |
'<DeviceID>%s</DeviceID>', | |
'</u:IdentifyDevice>', | |
postbodyfooter | |
].join('\n') | |
} | |
var createGroup = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#CreateGroup"', | |
body: [ | |
postbodyheader, | |
'<u:CreateGroup xmlns:u="urn:Belkin:service:bridge:1">', | |
'<ReqCreateGroup>', | |
'<?xml version="1.0" encoding="UTF-8"?><CreateGroup><GroupID>%d</GroupID><GroupName>%s</GroupName><DeviceIDList>%s</DeviceIDList><GroupCapabilityIDs>%s</GroupCapabilityIDs><GroupCapabilityValues>%s</GroupCapabilityValues></CreateGroup>', | |
'</ReqCreateGroup>', | |
'</u:CreateGroup>', | |
postbodyfooter | |
].join('\n') | |
} | |
var getCapabilitiesList = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#GetCapabilityProfileIDList"', | |
body: [ | |
postbodyheader, | |
'<u:GetCapabilityProfileIDList xmlns:u="urn:Belkin:service:bridge:1">', | |
'<DevUDN>%s</DevUDN>', | |
'</u:GetCapabilityProfileIDList>', | |
postbodyfooter | |
].join('\n') | |
} | |
var getDevCapabilities = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#GetDeviceCapabilities"', | |
body: [ | |
postbodyheader, | |
'<u:GetDeviceCapabilities xmlns:u="urn:Belkin:service:bridge:1">', | |
'<DeviceIDs>%s</DeviceIDs>', | |
'</u:GetDeviceCapabilities>', | |
postbodyfooter | |
].join('\n') | |
} | |
//this isn't right just yet | |
var getCapabilitiesProfileList = { | |
method: 'POST', | |
path: '/upnp/control/bridge1', | |
action: '"urn:Belkin:service:bridge:1#GetCapabilityProfileList"', | |
body: [ | |
postbodyheader, | |
'<u:GetCapabilityProfileList xmlns:u="urn:Belkin:service:bridge:1">', | |
'<CapabilityIDs>10006,10008,10300,30008,30009,3000A,30301</CapabilityIDs>', | |
'</u:GetCapabilityProfileList>', | |
postbodyfooter | |
].join('\n') | |
} | |
var command = getEndDevices; | |
console.log(process.argv.length); | |
var body; | |
if (process.argv.length === 2) { | |
console.log("hello"); | |
command = getEndDevices; | |
body = util.format(command.body, udn); | |
} else if (process.argv.length === 3) { | |
console.log("bar"); | |
if (process.argv[2] === 'devices') { | |
command = getEndDevices; | |
udn = ""; | |
} else if (process.argv[2] === 'open') { | |
command = openNetwork; | |
} else if (process.argv[2] === 'close') { | |
command = closeNetwork; | |
} else if (process.argv[2] === 'capabilities') { | |
command = getCapabilitiesList; | |
} else if (process.argv[2] === 'capabilityDetails') { | |
command = getCapabilitiesProfileList; | |
udn = ""; | |
} else if (process.argv[2] === 'scan') { | |
command = scanDevices; | |
} else if (process.argv[2] === 'unpaired') { | |
command = unpairedDevices; | |
} | |
body = util.format(command.body, udn); | |
} else if (process.argv.length === 4) { | |
console.log("foo"); | |
if (process.argv[2] === 'identify') { | |
command = identifyDevice; | |
} else if (process.argv[2] === 'deviceCapabilities') { | |
command = getDevCapabilities; | |
} else if (process.argv[2] == 'add') { | |
command = addDevice; | |
} | |
body = util.format(command.body, process.argv[3]); | |
} else if (process.argv.length === 8) { | |
if (process.argv[2] === 'createGroup') { | |
command = createGroup; | |
body = util.format(command.body, | |
process.argv[3], | |
process.argv[4], | |
process.argv[5], | |
process.argv[6]); | |
} | |
} | |
console.log("%s\n", body); | |
var options = { | |
host: ipAddr, | |
port: port, | |
path: command.path, | |
method: command.method, | |
headers: { | |
'SOAPACTION': command.action, | |
'Content-Type': 'text/xml; charset="utf-8"', | |
'Accept': '' | |
} | |
}; | |
var request = http.request(options, function(res){ | |
var data = ""; | |
res.setEncoding('utf8'); | |
res.on('data', function(chunk){ | |
data += chunk; | |
}); | |
res.on('end', function(){ | |
console.log(data); | |
}); | |
}); | |
request.on('error', function(e){ | |
console.log(e); | |
}); | |
request.write(body); | |
request.end(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var Client = require('node-ssdp').Client; | |
var client = new Client(); | |
var urn = 'urn:Belkin:service:basicevent:1'; | |
client.setMaxListeners(0); | |
client.on('response', function (headers, statusCode, rinfo) { | |
console.log("%j",headers); | |
}); | |
client.search(urn); | |
setTimeout(function(){ | |
client._stop(); | |
},5000); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment