Skip to content

Commit

Permalink
Merge pull request #26 from konnected-io/discovery-cleanup
Browse files Browse the repository at this point in the history
cleanup and reliability improvements for device discovery
  • Loading branch information
heythisisnate authored Jul 10, 2017
2 parents 75dda55 + 677b95e commit 7d075ed
Show file tree
Hide file tree
Showing 3 changed files with 41 additions and 15 deletions.
1 change: 1 addition & 0 deletions scripts/flash
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ IMAGE_NAME=konnected-security-2-0-beta1
PORT=/dev/cu.wchusbserial1410

esptool.py --port=${PORT} write_flash --flash_mode dio 0x00000 firmware/${IMAGE_NAME}.bin
sleep 2
cd source-code && nodemcu-uploader --port=${PORT} upload * --verify=raw
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ def pageWelcome() {
def configuredAlarmPanels = [] + getConfiguredDevices()
section("Tap Next to add or configure your Konnected device, or view the links below:") {
href(
name: "pageWelcomeManual",
name: "pageWelcomeManual",
title: "Instructions & Documentation",
description: "Tap to view the online documentation, or view on your computer at http://docs.konnected.io",
required: false,
Expand All @@ -96,21 +96,21 @@ def pageWelcome() {
}
section("") {
href(
name: "pageWelcomeDonate",
name: "pageWelcomeDonate",
title: "Donate to Konnected!",
description: "Konnected Alarm is an open source project. Your donations help fund future enhancements and products.",
required: false,
image: "https://raw.githubusercontent.com/konnected-io/SmartThings/master/images/icons/Donate.png",
url: "https://store.konnected.io/products/donate-to-this-project"
)
}

if (configuredAlarmPanels) {
section("Device Status: You must be connected within your local area network to be able to view device status.") {
configuredAlarmPanels.each {
href(
name: "device_" + it.mac,
title: "konnected-" + it.mac[-6..-1],
title: "konnected-security-" + it.mac[-6..-1],
description: "Tap to view device status",
required: false,
image: "https://raw.githubusercontent.com/konnected-io/SmartThings/master/images/icons/Device.png",
Expand Down Expand Up @@ -154,7 +154,7 @@ def pageDiscovery() {
Map pageDiscoveryGetAlarmPanels() {
def alarmPanels = [:]
def verifiedAlarmPanels = getDevices().findAll{ it.value.verified == true }
verifiedAlarmPanels.each { alarmPanels["${it.value.mac}"] = it.value.name ?: "konnected-${it.value.mac[-6..-1]}" }
verifiedAlarmPanels.each { alarmPanels["${it.value.mac}"] = it.value.name ?: "konnected-security-${it.value.mac[-6..-1]}" }
return alarmPanels
}

Expand All @@ -165,7 +165,7 @@ def pageConfiguration() {

dynamicPage(name: "pageConfiguration") {
configuredAlarmPanels.each { alarmPanel ->
section(hideable: true, "AlarmPanel_${alarmPanel.mac[-6..-1]}") {
section(hideable: true, "konnected-security-${alarmPanel.mac[-6..-1]}") {
for ( i in [1, 2, 5, 6, 7, 8, 9]) {
def deviceTypeDefaultValue = (settings."deviceType_${alarmPanel.mac}_${i}") ? settings."deviceType_${alarmPanel.mac}_${i}" : ""
def deviceLabelDefaultValue = (settings."deviceLabel_${alarmPanel.mac}_${i}") ? settings."deviceLabel_${alarmPanel.mac}_${i}" : ""
Expand Down Expand Up @@ -220,7 +220,11 @@ private Map pageConfigurationGetDeviceType(Integer i) {

// Retrieve selected device
def getConfiguredDevices() {
getDevices().findAll { settings.selectedAlarmPanels.contains(it.value.mac) }.collect { it.value }
getDevices().findAll {
settings.selectedAlarmPanels?.contains(it.value.mac)
}.collect {
it.value
}
}

// Retrieve devices saved in state
Expand Down Expand Up @@ -262,31 +266,52 @@ def discoverySearchHandler(evt) {
String ssdpUSN = event.ssdpUSN.toString()
def devices = getDevices()
if (devices[ssdpUSN]) {
log.debug "Refreshing network attributes of device $event.mac"
def d = devices[ssdpUSN]
d.networkAddress = event.networkAddress
d.deviceAddress = event.deviceAddress
log.debug "Refreshed attributes of device $d"
} else {
log.debug "Discovered new device $event.mac"
devices[ssdpUSN] = event
log.debug "Discovered new device $event"
discoveryVerify(event)
}
}

//Device Discovery : Verify search response by retrieving XML
def discoveryVerification() {
def alarmPanels = getDevices().findAll { it?.value?.verified != true }
alarmPanels.each {
String host = getDeviceIpAndPort(it.value)
sendHubCommand(new physicalgraph.device.HubAction("""GET ${it.value.ssdpPath} HTTP/1.1\r\nHOST: ${host}\r\n\r\n""", physicalgraph.device.Protocol.LAN, host, [callback: discoveryVerificationHandler]))
getDevices().findAll { it?.value?.verified != true }.each {
discoveryVerify(it.value)
}
}

// Device Discovery : Verify a Device
def discoveryVerify(Map device) {
log.debug "Verifying communication with device $device"
String host = getDeviceIpAndPort(device)
sendHubCommand(
new physicalgraph.device.HubAction(
"""GET ${device.ssdpPath} HTTP/1.1\r\nHOST: ${host}\r\n\r\n""",
physicalgraph.device.Protocol.LAN,
host,
[callback: discoveryVerificationHandler]
)
)
}

//Device Discovery : Handle verification response
def discoveryVerificationHandler(physicalgraph.device.HubResponse hubResponse) {
def body = hubResponse.xml
def devices = getDevices()
def device = devices.find { it?.key?.contains(body?.device?.UDN?.text()) }
if (device) { device.value << [name: body?.device?.roomName?.text(), model:body?.device?.modelName?.text(), serialNumber:body?.device?.serialNum?.text(), verified: true] }
if (device) {
log.debug "Verification Success: $body"
device.value << [
name: body?.device?.roomName?.text(),
model:body?.device?.modelName?.text(),
serialNumber:body?.device?.serialNum?.text(),
verified: true
]
}
}

//Child Devices : create/delete child devices from SmartThings app selection
Expand Down
2 changes: 1 addition & 1 deletion source-code/ssdp.lua
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ local deviceXML = { "<?xml version=\"1.0\"?>\r\n", "<root xmlns=\"urn:schemas-up
table.insert(deviceXML, "\t\t<friendlyName>" .. device.name .. "</friendlyName>\r\n" )
table.insert(deviceXML, "\t\t<manufacturer>konnected.io</manufacturer>\r\n" )
table.insert(deviceXML, "\t\t<manufacturerURL>http://konnected.io/</manufacturerURL>\r\n" )
table.insert(deviceXML, "\t\t<modelDescription>Alarm Panel</modelDescription>\r\n" )
table.insert(deviceXML, "\t\t<modelDescription>Konnected Security</modelDescription>\r\n" )
table.insert(deviceXML, "\t\t<modelName>" .. device.name .. "</modelName>\r\n" )
table.insert(deviceXML, "\t\t<modelNumber>" .. device.hwVersion .. "</modelNumber>\r\n" )
table.insert(deviceXML, "\t\t<serialNumber>" .. node.chipid() .. "</serialNumber>\r\n" )
Expand Down

0 comments on commit 7d075ed

Please sign in to comment.