diff --git a/lib/mongodb-functions.ts b/lib/mongodb-functions.ts index e3aaec0..afe6266 100644 --- a/lib/mongodb-functions.ts +++ b/lib/mongodb-functions.ts @@ -285,19 +285,30 @@ function parseDate(d): number | string { return isNaN(n) ? "" + d : n; } +interface FlatAttributes { + object?: boolean; + objectTimestamp?: number; + writable?: boolean; + writableTimestamp?: number; + value?: [string | number | boolean, string]; + valueTimestamp?: number; + notification?: number; + notificationTimestamp?: number; + accessList?: string[]; + accessListTimestamp?: number; +} + interface FlatDevice { - [param: string]: { - object: boolean; - objectTimestamp: number; - writable: boolean; - writableTimestamp: number; - value: [string | number | boolean, string]; - valueTimestamp: number; - }; + [param: string]: FlatAttributes; } export function flattenDevice(device): FlatDevice { - function recursive(input, root, output, timestamp): void { + function recursive( + input, + root: string, + output: FlatDevice, + timestamp: number + ): void { for (const [name, tree] of Object.entries(input)) { if (!root) { if (name === "_lastInform") { @@ -338,7 +349,7 @@ export function flattenDevice(device): FlatDevice { }; } else if (name === "_id") { output["DeviceID.ID"] = { - value: [tree, "xsd:string"], + value: [tree as string, "xsd:string"], valueTimestamp: timestamp, writable: false, writableTimestamp: timestamp, @@ -407,34 +418,44 @@ export function flattenDevice(device): FlatDevice { else if (+input["_timestamp"] > timestamp) childrenTimestamp = +input["_timestamp"]; - const attrs = {}; + const attrs: FlatAttributes = {}; if (tree["_value"] != null) { - attrs["value"] = [ + attrs.value = [ tree["_value"] instanceof Date ? +tree["_value"] : tree["_value"], tree["_type"] ]; - attrs["valueTimestamp"] = +(tree["_timestamp"] || childrenTimestamp); - attrs["object"] = false; - attrs["objectTimestamp"] = childrenTimestamp; + attrs.valueTimestamp = +(tree["_timestamp"] || childrenTimestamp); + attrs.object = false; + attrs.objectTimestamp = childrenTimestamp; } else if (tree["_object"] != null) { - attrs["object"] = tree["_object"]; - attrs["objectTimestamp"] = childrenTimestamp; + attrs.object = tree["_object"]; + attrs.objectTimestamp = childrenTimestamp; } if (tree["_writable"] != null) { - attrs["writable"] = tree["_writable"]; - attrs["writableTimestamp"] = childrenTimestamp; + attrs.writable = tree["_writable"]; + attrs.writableTimestamp = childrenTimestamp; + } + + if (tree["_notification"] != null) { + attrs.notification = tree["_notification"]; + attrs.notificationTimestamp = +tree["_attributesTimestamp"] || 1; + } + + if (tree["_accessList"] != null) { + attrs.accessList = tree["_accessList"]; + attrs.accessListTimestamp = +tree["_attributesTimestamp"] || 1; } const r = root ? `${root}.${name}` : name; output[r] = attrs; - if (attrs["object"] || tree["object"] == null) + if (attrs.object || tree["object"] == null) recursive(tree, r, output, childrenTimestamp); } } - const newDevice = {}; + const newDevice: FlatDevice = {}; const timestamp = new Date(device["_lastInform"] || 1).getTime(); recursive(device, "", newDevice, timestamp); return newDevice; diff --git a/lib/ui/api.ts b/lib/ui/api.ts index c452840..61ad302 100644 --- a/lib/ui/api.ts +++ b/lib/ui/api.ts @@ -99,7 +99,7 @@ router.get(`/devices/:id.csv`, async ctx => { ctx.body = new stream.PassThrough(); ctx.body.write( - "Parameter,Object,Object timestamp,Writable,Writable timestamp,Value,Value type,Value timestamp\n" + "Parameter,Object,Object timestamp,Writable,Writable timestamp,Value,Value type,Value timestamp,Notification,Notification timestamp,Access list,Access list timestamp\n" ); for (const k of Object.keys(res[0]).sort()) { @@ -112,7 +112,11 @@ router.get(`/devices/:id.csv`, async ctx => { p.writableTimestamp, p.value != null ? `"${p.value[0].toString().replace(/"/g, '""')}"` : "", p.value != null ? p.value[1] : "", - p.valueTimestamp + p.valueTimestamp, + p.notification, + p.notificationTimestamp, + p.accessList ? p.accessList.join(", ") : "", + p.accessListTimestamp ]; ctx.body.write(row.map(r => (r != null ? r : "")).join(",") + "\n"); }