"As a Requirement Engineer I would like to know how many errors my devices report"
In DOORS 9 module one can visualize this as:
So we would like to get a number of errors of given type reported by each of devices.
Device Error Reports in Sample App
First I need a device which can send some error codes. The IoT Starter Application mentioned in one of previous post publishes three kind of messages- touchmove - user interaction with screen
- accel - orientation of the device and its position
- text - a text provided by user
I extended that application to be able to send error codes.
Pressing "Send Error" button and selecting error code sends a MQTT message to IoTF broker.
Typical error message looks like;
{
device_id: "doors9"
evt_type: "error"
timestamp:
{
$date: 1449059192155
}
evt:
{
errorCode: "20"
}
}
Design for Analytics
Requirements in my DOORS module have a "ErrorCode" integer attribute which links a requirement to a error code reported by my device.
Additionally I'm using DOORS module level attributes to store values I do not need hardcoded in my DXL. Those are:
- Authorization (string)- so I do not need to calculate Base64 on each call
- DeviceType(string) - which of my devices this module describes
- Organization (string) - my Bluemix organisation name
With all information in place I can write some simple layout DXL (which can be convert to attribute DXL later on to improve performance)
This will return a JSON string with a list of events. If you do not have a JSON parser ready you can try to parse this data with Regular Expressions. Please remember this is a very simple example and in real world one shall not attempt to parse JSON with regular expressions.
My main worker code looks like:
You can find full DXL here.
Above layout DXL works fine when there're not so many devices. Once there will be more of them we no longer want to see how many times each device reported given issue. Thus the DXL could be rewritten to show something like:
As you saw in this example I'm using layout DXL but I think for a better understanding and feedback, one should consider writing a utility DXL.
Maybe that utility could provide its own UI for easier navigation?
In example above there's no need to send a HttpRequest for each object... It is enough to make one call per 100 (max page) events returned by query and write a little more complex Skip management. That however would require to make one top level Skip, but I'm sure you all know how to do it.
Layout DXL
I want a specific type of event from all devices of a given type from my organization. So I need to use a historic query for a device type:buf = "https://internetofthings.ibmcloud.com/api/v0001/historian/" org"/" deviceType "?evt_type=" eventId
This will return a JSON string with a list of events. If you do not have a JSON parser ready you can try to parse this data with Regular Expressions. Please remember this is a very simple example and in real world one shall not attempt to parse JSON with regular expressions.
My main worker code looks like:
if (!null obj) { int ival = obj."ErrorCode" if (ival == 0) halt string val = obj."ErrorCode" Module m = module obj string auth = m."Authorization" string dtype = m."DeviceType" string org = m."Organization" if (!null m && auth != "" && org != "" && dtype != "") { Buffer b = getData(auth, org, dtype, "error") if (!null b) { string s = stringOf b Regexp re = regexp2 "\"device_id\":\"([^\"]*)\"[^}]+.[^}]+{\"errorCode\":\"([^\"]*)\"" int i = 0 string device = "", code ="" // temporary skip to hold names of devices which reported Skip erSkp = createString int allErrors = 0 int numDevices = 0 while (!null s && re s && i<100) { // i is just a guard, we know there is no more then a 100 results in one page device = s[match 1] code = s[match 2] int ireported = 0 // if code matches attribute value if (code == val) { allErrors++ // icrease number of errors if (!find(erSkp, device, ireported)) { put(erSkp, device, 1) numDevices++ } else { ireported++ put(erSkp, device, ireported, true) } } s = s[end 0 +1:] i++ } // while // clean up delete b // report if (allErrors != 0) { for ireported in erSkp do { device = (string key erSkp) displayRich "Device with Id {\\b "device "} reported an issue " (ireported == 1 ? "once" : ireported" times") } } delete erSkp } // null b } // module setup } // !null obj
You can find full DXL here.
Conclusion
Above layout DXL works fine when there're not so many devices. Once there will be more of them we no longer want to see how many times each device reported given issue. Thus the DXL could be rewritten to show something like:
As you saw in this example I'm using layout DXL but I think for a better understanding and feedback, one should consider writing a utility DXL.
Maybe that utility could provide its own UI for easier navigation?
In example above there's no need to send a HttpRequest for each object... It is enough to make one call per 100 (max page) events returned by query and write a little more complex Skip management. That however would require to make one top level Skip, but I'm sure you all know how to do it.
No comments:
Post a Comment
Note: only a member of this blog may post a comment.