@chuck.schwer are you able to help please?
This is the error message in logs
> 2018-11-04 22:13:50.093:debug mac:4E6574777278, ip:c0a80105, port:ce73, headers:UE9TVCAvIEhUVFAvMS4xDQpDb25uZWN0aW9uOiBjbG9zZQ0KSG9zdDogMTkyLjE2OC4xLjIxNzozOTUwMQ0KU2VydmVyOiBBbGFybSBTeXN0ZW0NCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PVVURi04DQo=, body:
This is part of the driver. The relevant part (I suspect) is after the snip.
def parse(description)
{
def map = [:]
def events = []
def cmds = []
if(description == "updated") return
def descMap = parseDescriptionAsMap(description)
if (descMap == null)
{
log.debug "Not valid json response/message"
log.debug description
return
}
def body = new String(descMap["body"].decodeBase64())
def slurper = new JsonSlurper()
def result;
try
{
result = slurper.parseText(body)
}
catch (e)
{
log.debug "Invalid response from system: " + body
return
}
// Received an alarm stat string so update tile status but dont display it since the event string below will be logged
if (result.containsKey("stat_str"))
{
handleAlarmStatus(result.stat_str)
}
// If we receive a key containing 'stat_update_from' then it is an alarm status so add it to the event log and update tile
if (result.containsKey("stat_update_from"))
{
def dateTime = new Date()
def sensorStateChangedDate = dateTime.format("yyyy-MM-dd HH:mm", location.timeZone)
def status_string = result.stat_str + " by " + result.stat_update_from + " at " + sensorStateChangedDate
// Send the status string that we have built
sendEvent(name: "events", value: "${status_string}", displayed: true, isStateChange: true)
}
if (result.containsKey("zone_status"))
{
handleZoneStatus(result.zone_id, result.zone_status)
}
// This code will pull zone information out of the /getzonenamespage (and allows for zones not in order)
if (result.containsKey("maxzoneid"))
{
log.debug "Handling getzonenames page"
handleCreateZones(result.zones)
}
}
---
snip
---
private handleZoneStatus(zoneId, zoneStatus)
{
def thisZoneDeviceId = "alarmchildzone"+zoneId
def curdevice = null
try
{
// Got a zone status so first try to find the correct child device
curdevice = getChildDevices()?.find { it.deviceNetworkId == thisZoneDeviceId }
}
catch (e)
{
log.debug "Failed to find child zone for zone " + zoneId + "exception ${e}"
}
if (curdevice == null)
{
log.debug "Failed to find child device for zone: " + zoneId + " expecting " + thisZoneDeviceId
/*
def children = getChildDevices()
log.debug "device has ${children.size()} children"
children.each { child ->
log.debug "child ${child.displayName} has deviceNetworkId ${child.deviceNetworkId}"
}
*/
}
else
{
// Check the device type for this child, since the different child device types need different event types
boolean isMotionDevice = (curdevice.capabilities.find { it.name == "Motion Sensor" } != null)
boolean isSmokeDevice = (curdevice.capabilities.find { it.name == "Smoke Detector" } != null)
// Handle the specific zone status result
switch (zoneStatus)
{
case "Active":
log.debug "Got Active zone: " + zoneId + ", which is called - " + curdevice
if (isMotionDevice)
{
sendEvent(name: "panelzone"+zoneId, value: "active", displayed: false, isStateChange: true)
curdevice?.sendEvent(name: "motion", value: "active")
}
else if (isSmokeDevice)
{
sendEvent(name: "panelzone"+zoneId, value: "smoke", displayed: false, isStateChange: true)
curdevice?.sendEvent(name: "smoke", value: "detected")
}
else
{
sendEvent(name: "panelzone"+zoneId, value: "open", displayed: false, isStateChange: true)
curdevice?.sendEvent(name: "contact", value: "open")
}
break
case "Inactive":
log.debug "Got Inactive zone: " + zoneId + ", which is called - " + curdevice
if (isMotionDevice)
{
sendEvent(name: "panelzone"+zoneId, value: "inactive", displayed: false, isStateChange: true)
curdevice?.sendEvent(name: "motion", value: "inactive")
}
else if (isSmokeDevice)
{
sendEvent(name: "panelzone"+zoneId, value: "clear", displayed: false, isStateChange: true)
curdevice?.sendEvent(name: "smoke", value: "clear")
}
else
{
sendEvent(name: "panelzone"+zoneId, value: "closed", displayed: false, isStateChange: true)
curdevice?.sendEvent(name: "contact", value: "closed")
}
break
case "Bypassed - Active":
log.debug "Got Active Bypassed zone: " + zoneId + ", which is called - " + curdevice
sendEvent(name: "panelzone"+zoneId, value: "bypass", displayed: false, isStateChange: true)
if (isMotionDevice)
{
curdevice?.sendEvent(name: "motion", value: "active")
}
else if (isSmokeDevice)
{
curdevice?.sendEvent(name: "smoke", value: "detected")
}
else
{
curdevice?.sendEvent(name: "contact", value: "open")
}
break
case "Bypassed - Inactive":
log.debug "Got Inactive Bypassed zone: " + zoneId + ", which is called - " + curdevice
sendEvent(name: "panelzone"+zoneId, value: "bypass", displayed: false, isStateChange: true)
if (isMotionDevice)
{
curdevice?.sendEvent(name: "motion", value: "inactive")
}
else if (isSmokeDevice)
{
curdevice?.sendEvent(name: "smoke", value: "clear")
}
else
{
curdevice?.sendEvent(name: "contact", value: "closed")
}
break
case "Tamper":
log.debug "Got Tamper for zone: " + zoneId + ", which is called - " + curdevice
// We'll set it to open for now, since at least that gives an indication something is wrong!
if (isMotionDevice)
{
sendEvent(name: "panelzone"+zoneId, value: "active", displayed: false, isStateChange: true)
curdevice?.sendEvent(name: "motion", value: "active")
}
else if (isSmokeDevice)
{
sendEvent(name: "panelzone"+zoneId, value: "smoke", displayed: false, isStateChange: true)
curdevice?.sendEvent(name: "smoke", value: "detected")
}
else
{
sendEvent(name: "panelzone"+zoneId, value: "open", displayed: false, isStateChange: true)
curdevice?.sendEvent(name: "contact", value: "open")
}
break
default:
log.debug "Unknown status received: ${zoneId} is ${zoneStatus}"
break
}
}
}