@hello.nrfcloud.com/proto-map 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +29 -0
- package/README.md +122 -0
- package/dist/generator/addDocBlock.js +5 -0
- package/dist/generator/generateLwM2MDefinitions.js +82 -0
- package/dist/generator/generateLwM2MDefinitions.spec.js +91 -0
- package/dist/generator/generateLwm2mTimestampResources.js +69 -0
- package/dist/generator/generateModels.js +142 -0
- package/dist/generator/generateType.js +90 -0
- package/dist/generator/generateValidator.js +132 -0
- package/dist/generator/generateValidators.js +63 -0
- package/dist/generator/isDir.js +163 -0
- package/dist/generator/isDir.spec.js +212 -0
- package/dist/generator/lwm2m.js +106 -0
- package/dist/generator/models.js +306 -0
- package/dist/generator/printNode.js +8 -0
- package/dist/generator/tokenizeName.js +5 -0
- package/dist/generator/tokenizeName.spec.js +98 -0
- package/dist/generator/types.js +140 -0
- package/dist/lwm2m/LWM2MObjectDefinition.js +88 -0
- package/dist/lwm2m/LWM2MObjectInfo.js +9 -0
- package/dist/lwm2m/LwM2MObject.d.js +1 -0
- package/dist/lwm2m/LwM2MObjectID.js +57 -0
- package/dist/lwm2m/ParsedLwM2MObjectDefinition.js +1 -0
- package/dist/lwm2m/check-lwm2m-rules.js +480 -0
- package/dist/lwm2m/definitions.js +596 -0
- package/dist/lwm2m/fromXML2JSON.js +194 -0
- package/dist/lwm2m/instanceTs.js +9 -0
- package/dist/lwm2m/instanceTs.spec.js +16 -0
- package/dist/lwm2m/isRegisteredLwM2MObject.js +3 -0
- package/dist/lwm2m/isRegisteredLwM2MObject.spec.js +45 -0
- package/dist/lwm2m/object/14201.d.js +5 -0
- package/dist/lwm2m/object/14202.d.js +5 -0
- package/dist/lwm2m/object/14203.d.js +5 -0
- package/dist/lwm2m/object/14204.d.js +5 -0
- package/dist/lwm2m/object/14205.d.js +5 -0
- package/dist/lwm2m/object/14210.d.js +5 -0
- package/dist/lwm2m/object/14220.d.js +5 -0
- package/dist/lwm2m/object/14230.d.js +5 -0
- package/dist/lwm2m/object/validate14201.js +18 -0
- package/dist/lwm2m/object/validate14202.js +17 -0
- package/dist/lwm2m/object/validate14203.js +19 -0
- package/dist/lwm2m/object/validate14204.js +17 -0
- package/dist/lwm2m/object/validate14205.js +15 -0
- package/dist/lwm2m/object/validate14210.js +13 -0
- package/dist/lwm2m/object/validate14220.js +12 -0
- package/dist/lwm2m/object/validate14230.js +13 -0
- package/dist/lwm2m/objects.js +8 -0
- package/dist/lwm2m/parseRangeEnumeration.js +20 -0
- package/dist/lwm2m/parseRangeEnumeration.spec.js +27 -0
- package/dist/lwm2m/resourceType.js +12 -0
- package/dist/lwm2m/timestampResources.js +12 -0
- package/dist/lwm2m/unwrapNestedArray.js +114 -0
- package/dist/lwm2m/unwrapNestedArray.spec.js +374 -0
- package/dist/lwm2m/validate.js +14 -0
- package/dist/lwm2m/validation.js +146 -0
- package/dist/lwm2m/validators.js +20 -0
- package/dist/markdown/getCodeBlock.js +74 -0
- package/dist/markdown/getFrontMatter.js +15 -0
- package/dist/markdown/parseREADME.js +19 -0
- package/dist/models/asset_tracker_v2+AWS/examples/examples.spec.js +489 -0
- package/dist/models/check-model-rules.js +137 -0
- package/dist/models/models.js +137 -0
- package/dist/models/types.js +13 -0
- package/dist/senml/SenMLSchema.js +79 -0
- package/dist/senml/SenMLSchema.spec.js +23 -0
- package/dist/senml/hasValue.js +8 -0
- package/dist/senml/hasValue.spec.js +103 -0
- package/dist/senml/lwm2mToSenML.js +137 -0
- package/dist/senml/lwm2mToSenML.spec.js +104 -0
- package/dist/senml/parseResourceId.js +58 -0
- package/dist/senml/parseResourceId.spec.js +13 -0
- package/dist/senml/senMLtoLwM2M.js +126 -0
- package/dist/senml/senMLtoLwM2M.spec.js +226 -0
- package/dist/senml/validateSenML.js +6 -0
- package/dist/senml/validateSenML.spec.js +31 -0
- package/export.js +13 -0
- package/index.d.ts +14 -0
- package/lwm2m/14201.xml +94 -0
- package/lwm2m/14202.xml +84 -0
- package/lwm2m/14203.xml +104 -0
- package/lwm2m/14204.xml +84 -0
- package/lwm2m/14205.xml +64 -0
- package/lwm2m/14210.xml +44 -0
- package/lwm2m/14220.xml +34 -0
- package/lwm2m/14230.xml +44 -0
- package/lwm2m/LWM2M-v1_1.xsd +168 -0
- package/lwm2m/LWM2MObjectDefinition.ts +84 -0
- package/lwm2m/LWM2MObjectInfo.ts +42 -0
- package/lwm2m/LwM2MObject.d.ts +19 -0
- package/lwm2m/LwM2MObjectID.ts +73 -0
- package/lwm2m/ParsedLwM2MObjectDefinition.ts +28 -0
- package/lwm2m/check-lwm2m-rules.ts +160 -0
- package/lwm2m/definitions.ts +278 -0
- package/lwm2m/format.sh +3 -0
- package/lwm2m/fromXML2JSON.ts +44 -0
- package/lwm2m/instanceTs.spec.ts +19 -0
- package/lwm2m/instanceTs.ts +10 -0
- package/lwm2m/isRegisteredLwM2MObject.spec.ts +48 -0
- package/lwm2m/isRegisteredLwM2MObject.ts +4 -0
- package/lwm2m/object/14201.d.ts +73 -0
- package/lwm2m/object/14202.d.ts +59 -0
- package/lwm2m/object/14203.d.ts +67 -0
- package/lwm2m/object/14204.d.ts +55 -0
- package/lwm2m/object/14205.d.ts +43 -0
- package/lwm2m/object/14210.d.ts +31 -0
- package/lwm2m/object/14220.d.ts +25 -0
- package/lwm2m/object/14230.d.ts +31 -0
- package/lwm2m/object/validate14201.ts +10 -0
- package/lwm2m/object/validate14202.ts +10 -0
- package/lwm2m/object/validate14203.ts +10 -0
- package/lwm2m/object/validate14204.ts +10 -0
- package/lwm2m/object/validate14205.ts +10 -0
- package/lwm2m/object/validate14210.ts +10 -0
- package/lwm2m/object/validate14220.ts +10 -0
- package/lwm2m/object/validate14230.ts +10 -0
- package/lwm2m/objects.ts +16 -0
- package/lwm2m/parseRangeEnumeration.spec.ts +34 -0
- package/lwm2m/parseRangeEnumeration.ts +29 -0
- package/lwm2m/resourceType.ts +11 -0
- package/lwm2m/timestampResources.ts +4 -0
- package/lwm2m/unwrapNestedArray.spec.ts +241 -0
- package/lwm2m/unwrapNestedArray.ts +27 -0
- package/lwm2m/validate.ts +30 -0
- package/lwm2m/validation.ts +120 -0
- package/lwm2m/validators.ts +21 -0
- package/models/PCA20035+solar/README.md +10 -0
- package/models/PCA20035+solar/transforms/airQuality.md +48 -0
- package/models/PCA20035+solar/transforms/battery.md +46 -0
- package/models/PCA20035+solar/transforms/button.md +45 -0
- package/models/PCA20035+solar/transforms/deviceInfo.md +72 -0
- package/models/PCA20035+solar/transforms/gain.md +45 -0
- package/models/PCA20035+solar/transforms/geolocationFromGroundfix.md +67 -0
- package/models/PCA20035+solar/transforms/geolocationFromMessage.md +80 -0
- package/models/PCA20035+solar/transforms/humidity.md +43 -0
- package/models/PCA20035+solar/transforms/networkInfo.md +84 -0
- package/models/PCA20035+solar/transforms/pressure.md +43 -0
- package/models/PCA20035+solar/transforms/temperature.md +43 -0
- package/models/README.md +10 -0
- package/models/asset_tracker_v2+AWS/README.md +6 -0
- package/models/asset_tracker_v2+AWS/examples/examples.spec.ts +229 -0
- package/models/asset_tracker_v2+AWS/examples/shadow/example-1.json +24 -0
- package/models/asset_tracker_v2+AWS/examples/shadow/example-2.json +30 -0
- package/models/asset_tracker_v2+AWS/examples/shadow/example-3.json +37 -0
- package/models/asset_tracker_v2+AWS/examples/shadow/example-4.json +48 -0
- package/models/asset_tracker_v2+AWS/examples/shadow/example-5.json +43 -0
- package/models/asset_tracker_v2+AWS/transforms/GNSS.md +66 -0
- package/models/asset_tracker_v2+AWS/transforms/battery-voltage.md +50 -0
- package/models/asset_tracker_v2+AWS/transforms/device-info.md +61 -0
- package/models/asset_tracker_v2+AWS/transforms/env.md +69 -0
- package/models/asset_tracker_v2+AWS/transforms/fuel-gauge.md +62 -0
- package/models/asset_tracker_v2+AWS/transforms/roam.md +100 -0
- package/models/asset_tracker_v2+AWS/transforms/solar.md +58 -0
- package/models/check-model-rules.ts +125 -0
- package/models/kartverket-vasstandsdata/README.md +13 -0
- package/models/models.ts +36 -0
- package/models/types.ts +17 -0
- package/package.json +111 -0
- package/senml/SenMLSchema.spec.ts +21 -0
- package/senml/SenMLSchema.ts +74 -0
- package/senml/hasValue.spec.ts +19 -0
- package/senml/hasValue.ts +12 -0
- package/senml/lwm2mToSenML.spec.ts +74 -0
- package/senml/lwm2mToSenML.ts +62 -0
- package/senml/parseResourceId.spec.ts +13 -0
- package/senml/parseResourceId.ts +23 -0
- package/senml/senMLtoLwM2M.spec.ts +181 -0
- package/senml/senMLtoLwM2M.ts +121 -0
- package/senml/validateSenML.spec.ts +16 -0
- package/senml/validateSenML.ts +8 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import assert from "node:assert";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { parseResourceId } from "./parseResourceId.js";
|
|
4
|
+
void describe("parseResourceId()", function() {
|
|
5
|
+
void it("should parse an LwM2M resource ID", function() {
|
|
6
|
+
return assert.deepEqual(parseResourceId("/14201/1/2/0"), {
|
|
7
|
+
ObjectID: 14201,
|
|
8
|
+
ObjectInstanceID: 1,
|
|
9
|
+
ResourceID: 2,
|
|
10
|
+
ResourceInstanceId: 0
|
|
11
|
+
});
|
|
12
|
+
});
|
|
13
|
+
});
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value: value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
function _object_spread(target) {
|
|
15
|
+
for(var i = 1; i < arguments.length; i++){
|
|
16
|
+
var source = arguments[i] != null ? arguments[i] : {};
|
|
17
|
+
var ownKeys = Object.keys(source);
|
|
18
|
+
if (typeof Object.getOwnPropertySymbols === "function") {
|
|
19
|
+
ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
|
|
20
|
+
return Object.getOwnPropertyDescriptor(source, sym).enumerable;
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
ownKeys.forEach(function(key) {
|
|
24
|
+
_define_property(target, key, source[key]);
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
return target;
|
|
28
|
+
}
|
|
29
|
+
function ownKeys(object, enumerableOnly) {
|
|
30
|
+
var keys = Object.keys(object);
|
|
31
|
+
if (Object.getOwnPropertySymbols) {
|
|
32
|
+
var symbols = Object.getOwnPropertySymbols(object);
|
|
33
|
+
if (enumerableOnly) {
|
|
34
|
+
symbols = symbols.filter(function(sym) {
|
|
35
|
+
return Object.getOwnPropertyDescriptor(object, sym).enumerable;
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
keys.push.apply(keys, symbols);
|
|
39
|
+
}
|
|
40
|
+
return keys;
|
|
41
|
+
}
|
|
42
|
+
function _object_spread_props(target, source) {
|
|
43
|
+
source = source != null ? source : {};
|
|
44
|
+
if (Object.getOwnPropertyDescriptors) {
|
|
45
|
+
Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
|
|
46
|
+
} else {
|
|
47
|
+
ownKeys(Object(source)).forEach(function(key) {
|
|
48
|
+
Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return target;
|
|
52
|
+
}
|
|
53
|
+
import { timestampResources } from "../lwm2m/timestampResources.js";
|
|
54
|
+
import { parseResourceId } from "./parseResourceId.js";
|
|
55
|
+
import { hasValue } from "./hasValue.js";
|
|
56
|
+
var isInfoForDifferentInstance = function(currentObject, resourceID, currentBaseTime) {
|
|
57
|
+
var _currentObject_Resources_tsRes, _currentObject_Resources;
|
|
58
|
+
if (currentObject === undefined) return true;
|
|
59
|
+
if (currentObject.ObjectID !== resourceID.ObjectID) return true;
|
|
60
|
+
var _currentObject_ObjectInstanceID;
|
|
61
|
+
if (((_currentObject_ObjectInstanceID = currentObject.ObjectInstanceID) !== null && _currentObject_ObjectInstanceID !== void 0 ? _currentObject_ObjectInstanceID : 0) !== resourceID.ObjectInstanceID) return true;
|
|
62
|
+
var tsRes = timestampResources[resourceID.ObjectID];
|
|
63
|
+
if (tsRes === undefined) throw new Error("Unknown LwM2M Object ID: ".concat(resourceID.ObjectID, "!"));
|
|
64
|
+
if (currentBaseTime !== ((_currentObject_Resources = currentObject.Resources) === null || _currentObject_Resources === void 0 ? void 0 : (_currentObject_Resources_tsRes = _currentObject_Resources[tsRes]) === null || _currentObject_Resources_tsRes === void 0 ? void 0 : _currentObject_Resources_tsRes.getTime())) return true;
|
|
65
|
+
return false;
|
|
66
|
+
};
|
|
67
|
+
var getValue = function(measurement) {
|
|
68
|
+
if ("bv" in measurement && !("v" in measurement)) return measurement.bv;
|
|
69
|
+
if ("bv" in measurement && "v" in measurement) return measurement.bv + measurement.v;
|
|
70
|
+
if ("v" in measurement) return measurement.v;
|
|
71
|
+
if ("vs" in measurement) return measurement.vs;
|
|
72
|
+
if ("vb" in measurement) return measurement.vb;
|
|
73
|
+
if ("vd" in measurement) return measurement.vd;
|
|
74
|
+
return undefined;
|
|
75
|
+
};
|
|
76
|
+
export var senMLtoLwM2M = function(senML) {
|
|
77
|
+
var currentBaseName = "";
|
|
78
|
+
var currentBaseTime = undefined;
|
|
79
|
+
var currentObject = undefined;
|
|
80
|
+
var items = [];
|
|
81
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
82
|
+
try {
|
|
83
|
+
for(var _iterator = senML[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
84
|
+
var item = _step.value;
|
|
85
|
+
if ("bn" in item && item.bn !== undefined) currentBaseName = item.bn;
|
|
86
|
+
if ("bt" in item && item.bt !== undefined) currentBaseTime = item.bt;
|
|
87
|
+
if (!hasValue(item)) continue;
|
|
88
|
+
var _item_n;
|
|
89
|
+
var itemResourceId = "".concat(currentBaseName).concat((_item_n = item.n) !== null && _item_n !== void 0 ? _item_n : "", "/0");
|
|
90
|
+
var resourceId = parseResourceId(itemResourceId);
|
|
91
|
+
if (resourceId === null) throw new Error("Invalid resource ID: ".concat(itemResourceId));
|
|
92
|
+
if (currentObject === undefined || currentBaseTime !== undefined && isInfoForDifferentInstance(currentObject, resourceId, currentBaseTime)) {
|
|
93
|
+
if (currentObject !== undefined) items.push(currentObject);
|
|
94
|
+
var tsRes = timestampResources[resourceId.ObjectID];
|
|
95
|
+
if (tsRes === undefined) throw new Error("Unknown LwM2M Object ID: ".concat(resourceId.ObjectID, "!"));
|
|
96
|
+
if (currentBaseTime === undefined) throw new Error("No base time defined for object!");
|
|
97
|
+
currentObject = {
|
|
98
|
+
ObjectID: resourceId.ObjectID,
|
|
99
|
+
Resources: _define_property({}, tsRes, new Date(currentBaseTime))
|
|
100
|
+
};
|
|
101
|
+
if (resourceId.ObjectInstanceID !== 0) currentObject.ObjectInstanceID = resourceId.ObjectInstanceID;
|
|
102
|
+
if ("blv" in item) currentObject.ObjectVersion = item.blv;
|
|
103
|
+
}
|
|
104
|
+
if ((currentObject === null || currentObject === void 0 ? void 0 : currentObject.Resources) === undefined) continue;
|
|
105
|
+
var value = getValue(item);
|
|
106
|
+
if (value !== undefined) {
|
|
107
|
+
currentObject.Resources = _object_spread_props(_object_spread({}, currentObject.Resources), _define_property({}, item.n, value));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
} catch (err) {
|
|
111
|
+
_didIteratorError = true;
|
|
112
|
+
_iteratorError = err;
|
|
113
|
+
} finally{
|
|
114
|
+
try {
|
|
115
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
116
|
+
_iterator.return();
|
|
117
|
+
}
|
|
118
|
+
} finally{
|
|
119
|
+
if (_didIteratorError) {
|
|
120
|
+
throw _iteratorError;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
if (currentObject !== undefined) items.push(currentObject);
|
|
125
|
+
return items;
|
|
126
|
+
};
|
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import { senMLtoLwM2M } from "./senMLtoLwM2M.js";
|
|
4
|
+
void describe("senMLtoLwM2M()", function() {
|
|
5
|
+
void it("should resolve a senML message into objects", function() {
|
|
6
|
+
var input = [
|
|
7
|
+
{
|
|
8
|
+
bn: "/14201/1/",
|
|
9
|
+
blv: "1.1",
|
|
10
|
+
bt: 1698155694999,
|
|
11
|
+
n: "0",
|
|
12
|
+
v: 33.98755678796222
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
n: "1",
|
|
16
|
+
v: -84.506132079174634
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
n: "2",
|
|
20
|
+
v: 295.468994140625
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
n: "3",
|
|
24
|
+
v: 17.74077033996582
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
n: "4",
|
|
28
|
+
v: 26.376304626464844
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
n: "5",
|
|
32
|
+
v: 359.1545715332
|
|
33
|
+
}
|
|
34
|
+
];
|
|
35
|
+
var expected = [
|
|
36
|
+
{
|
|
37
|
+
ObjectID: 14201,
|
|
38
|
+
ObjectInstanceID: 1,
|
|
39
|
+
ObjectVersion: "1.1",
|
|
40
|
+
Resources: {
|
|
41
|
+
0: 33.98755678796222,
|
|
42
|
+
1: -84.506132079174634,
|
|
43
|
+
2: 295.468994140625,
|
|
44
|
+
3: 17.74077033996582,
|
|
45
|
+
4: 26.376304626464844,
|
|
46
|
+
5: 359.1545715332,
|
|
47
|
+
99: new Date(1698155694999)
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
];
|
|
51
|
+
assert.deepEqual(senMLtoLwM2M(input), expected);
|
|
52
|
+
});
|
|
53
|
+
void it("should drop empty resources", function() {
|
|
54
|
+
var input = [
|
|
55
|
+
{
|
|
56
|
+
bn: "/14203/0/",
|
|
57
|
+
n: "0",
|
|
58
|
+
vs: "LTE-M",
|
|
59
|
+
bt: 1676369307222
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
n: "1",
|
|
63
|
+
v: 20
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
n: "2",
|
|
67
|
+
v: -79
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
n: "3",
|
|
71
|
+
v: 6
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
n: "4",
|
|
75
|
+
v: 56879116
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
n: "5",
|
|
79
|
+
v: 24001
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
n: "6",
|
|
83
|
+
vs: "10.160.243.113"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
n: "11"
|
|
87
|
+
}
|
|
88
|
+
];
|
|
89
|
+
var expected = [
|
|
90
|
+
{
|
|
91
|
+
ObjectID: 14203,
|
|
92
|
+
Resources: {
|
|
93
|
+
0: "LTE-M",
|
|
94
|
+
1: 20,
|
|
95
|
+
2: -79,
|
|
96
|
+
3: 6,
|
|
97
|
+
4: 56879116,
|
|
98
|
+
5: 24001,
|
|
99
|
+
6: "10.160.243.113",
|
|
100
|
+
99: new Date(1676369307222)
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
];
|
|
104
|
+
assert.deepEqual(senMLtoLwM2M(input), expected);
|
|
105
|
+
});
|
|
106
|
+
void it("should ignore repeated base properties", function() {
|
|
107
|
+
var input = [
|
|
108
|
+
{
|
|
109
|
+
bn: "/14203/0/",
|
|
110
|
+
n: "0",
|
|
111
|
+
vs: "LTE-M",
|
|
112
|
+
bt: 1699049665511
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
n: "1",
|
|
116
|
+
v: 20
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
bn: "/14203/0/",
|
|
120
|
+
n: "2",
|
|
121
|
+
v: -89,
|
|
122
|
+
bt: 1699049665511
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
n: "3",
|
|
126
|
+
v: 2305
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
n: "4",
|
|
130
|
+
v: 34784790
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
n: "5",
|
|
134
|
+
v: 24202
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
n: "6",
|
|
138
|
+
vs: "100.81.95.75"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
bn: "/14203/0/",
|
|
142
|
+
n: "11",
|
|
143
|
+
v: 7,
|
|
144
|
+
bt: 1699049665511
|
|
145
|
+
}
|
|
146
|
+
];
|
|
147
|
+
var expected = [
|
|
148
|
+
{
|
|
149
|
+
ObjectID: 14203,
|
|
150
|
+
Resources: {
|
|
151
|
+
0: "LTE-M",
|
|
152
|
+
1: 20,
|
|
153
|
+
2: -89,
|
|
154
|
+
3: 2305,
|
|
155
|
+
4: 34784790,
|
|
156
|
+
5: 24202,
|
|
157
|
+
6: "100.81.95.75",
|
|
158
|
+
11: 7,
|
|
159
|
+
99: new Date(1699049665511)
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
];
|
|
163
|
+
assert.deepEqual(senMLtoLwM2M(input), expected);
|
|
164
|
+
});
|
|
165
|
+
void it("should handle multiple measurements for the same resource", function() {
|
|
166
|
+
var input = [
|
|
167
|
+
{
|
|
168
|
+
bn: "/14205/0/",
|
|
169
|
+
n: "0",
|
|
170
|
+
v: 21,
|
|
171
|
+
bt: 1699049600000
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
bn: "/14205/1/",
|
|
175
|
+
n: "0",
|
|
176
|
+
v: 31,
|
|
177
|
+
bt: 1699049600000
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
bn: "/14205/0/",
|
|
181
|
+
n: "0",
|
|
182
|
+
v: 22,
|
|
183
|
+
bt: 1699049700000
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
bn: "/14205/1/",
|
|
187
|
+
n: "0",
|
|
188
|
+
v: 32,
|
|
189
|
+
bt: 1699049700000
|
|
190
|
+
}
|
|
191
|
+
];
|
|
192
|
+
var expected = [
|
|
193
|
+
{
|
|
194
|
+
ObjectID: 14205,
|
|
195
|
+
Resources: {
|
|
196
|
+
0: 21,
|
|
197
|
+
99: new Date(1699049600000)
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
ObjectID: 14205,
|
|
202
|
+
ObjectInstanceID: 1,
|
|
203
|
+
Resources: {
|
|
204
|
+
0: 31,
|
|
205
|
+
99: new Date(1699049600000)
|
|
206
|
+
}
|
|
207
|
+
},
|
|
208
|
+
{
|
|
209
|
+
ObjectID: 14205,
|
|
210
|
+
Resources: {
|
|
211
|
+
0: 22,
|
|
212
|
+
99: new Date(1699049700000)
|
|
213
|
+
}
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
ObjectID: 14205,
|
|
217
|
+
ObjectInstanceID: 1,
|
|
218
|
+
Resources: {
|
|
219
|
+
0: 32,
|
|
220
|
+
99: new Date(1699049700000)
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
];
|
|
224
|
+
assert.deepEqual(senMLtoLwM2M(input), expected);
|
|
225
|
+
});
|
|
226
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { describe, it } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { validateSenML } from "./validateSenML.js";
|
|
4
|
+
void describe("validateSenML()", function() {
|
|
5
|
+
void it("should validate", function() {
|
|
6
|
+
var senMl = [
|
|
7
|
+
{
|
|
8
|
+
bn: "/14202/1/",
|
|
9
|
+
blv: "1.1",
|
|
10
|
+
n: "0",
|
|
11
|
+
v: 99,
|
|
12
|
+
bt: 1699049685992
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
n: "1",
|
|
16
|
+
v: 4.179
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
n: "2",
|
|
20
|
+
v: 0
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
n: "3",
|
|
24
|
+
v: 25.7
|
|
25
|
+
}
|
|
26
|
+
];
|
|
27
|
+
assert.deepEqual(validateSenML(senMl), {
|
|
28
|
+
value: senMl
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
});
|
package/export.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export * from './dist/senml/SenMLSchema.js'
|
|
2
|
+
export * from './dist/senml/senMLtoLwM2M.js'
|
|
3
|
+
export * from './dist/senml/lwm2mToSenML.js'
|
|
4
|
+
export * from './dist/models/models.js'
|
|
5
|
+
export * from './dist/models/types.js'
|
|
6
|
+
export * from './dist/lwm2m/timestampResources.js'
|
|
7
|
+
export * from './dist/lwm2m/objects.js'
|
|
8
|
+
export * from './dist/lwm2m/definitions.js'
|
|
9
|
+
export * from './dist/lwm2m/LWM2MObjectInfo.js'
|
|
10
|
+
export * from './dist/lwm2m/validators.js'
|
|
11
|
+
export * from './dist/lwm2m/LwM2MObjectID.js'
|
|
12
|
+
export * from './dist/lwm2m/validation.js'
|
|
13
|
+
export * from './dist/lwm2m/instanceTs.js'
|
package/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export * from './senml/SenMLSchema.js'
|
|
2
|
+
export * from './senml/senMLtoLwM2M.js'
|
|
3
|
+
export * from './senml/lwm2mToSenML.js'
|
|
4
|
+
export * from './models/models.js'
|
|
5
|
+
export * from './models/types.js'
|
|
6
|
+
export * from './lwm2m/timestampResources.js'
|
|
7
|
+
export * from './lwm2m/LwM2MObject.js'
|
|
8
|
+
export * from './lwm2m/LwM2MObjectID.js'
|
|
9
|
+
export * from './lwm2m/objects.js'
|
|
10
|
+
export * from './lwm2m/definitions.js'
|
|
11
|
+
export * from './lwm2m/LWM2MObjectInfo.js'
|
|
12
|
+
export * from './lwm2m/validators.js'
|
|
13
|
+
export * from './lwm2m/validation.js'
|
|
14
|
+
export * from './lwm2m/instanceTs.js'
|
package/lwm2m/14201.xml
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<LWM2M xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://openmobilealliance.org/tech/profiles/LWM2M-v1_1.xsd">
|
|
3
|
+
<Object ObjectType="MODefinition">
|
|
4
|
+
<Name>Geolocation</Name>
|
|
5
|
+
<Description1><![CDATA[Describes the geo location of a device]]></Description1>
|
|
6
|
+
<ObjectID>14201</ObjectID>
|
|
7
|
+
<ObjectURN>urn:oma:lwm2m:x:14201</ObjectURN>
|
|
8
|
+
<MultipleInstances>Multiple</MultipleInstances>
|
|
9
|
+
<Mandatory>Optional</Mandatory>
|
|
10
|
+
<Resources>
|
|
11
|
+
<Item ID="0">
|
|
12
|
+
<Name>Latitude</Name>
|
|
13
|
+
<Operations>R</Operations>
|
|
14
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
15
|
+
<Mandatory>Mandatory</Mandatory>
|
|
16
|
+
<Type>Float</Type>
|
|
17
|
+
<RangeEnumeration>-90..90</RangeEnumeration>
|
|
18
|
+
<Units>°</Units>
|
|
19
|
+
<Description><![CDATA[The decimal notation of latitude in degrees, e.g. -43.5723 [World Geodetic System 1984].]]></Description>
|
|
20
|
+
</Item>
|
|
21
|
+
<Item ID="1">
|
|
22
|
+
<Name>Longitude</Name>
|
|
23
|
+
<Operations>R</Operations>
|
|
24
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
25
|
+
<Mandatory>Mandatory</Mandatory>
|
|
26
|
+
<Type>Float</Type>
|
|
27
|
+
<RangeEnumeration>-180..180</RangeEnumeration>
|
|
28
|
+
<Units>°</Units>
|
|
29
|
+
<Description><![CDATA[The decimal notation of longitude in degrees, e.g. 153.21760 [World Geodetic System 1984].]]></Description>
|
|
30
|
+
</Item>
|
|
31
|
+
<Item ID="2">
|
|
32
|
+
<Name>Altitude</Name>
|
|
33
|
+
<Operations>R</Operations>
|
|
34
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
35
|
+
<Mandatory>Optional</Mandatory>
|
|
36
|
+
<Type>Float</Type>
|
|
37
|
+
<RangeEnumeration/>
|
|
38
|
+
<Units>m</Units>
|
|
39
|
+
<Description><![CDATA[The decimal notation of altitude in meters above sea level.]]></Description>
|
|
40
|
+
</Item>
|
|
41
|
+
<Item ID="3">
|
|
42
|
+
<Name>Radius</Name>
|
|
43
|
+
<Operations>R</Operations>
|
|
44
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
45
|
+
<Mandatory>Optional</Mandatory>
|
|
46
|
+
<Type>Float</Type>
|
|
47
|
+
<RangeEnumeration/>
|
|
48
|
+
<Units>m</Units>
|
|
49
|
+
<Description><![CDATA[The value in this resource indicates the radius of a circular area in meters. The circular area is used to describe uncertainty about a point for coordinates in a two-dimensional coordinate reference systems (CRS). The center point of a circular area is specified by using the Latitude and the Longitude Resources.]]></Description>
|
|
50
|
+
</Item>
|
|
51
|
+
<Item ID="4">
|
|
52
|
+
<Name>Speed</Name>
|
|
53
|
+
<Operations>R</Operations>
|
|
54
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
55
|
+
<Mandatory>Optional</Mandatory>
|
|
56
|
+
<Type>Float</Type>
|
|
57
|
+
<RangeEnumeration/>
|
|
58
|
+
<Units>m/s</Units>
|
|
59
|
+
<Description><![CDATA[Speed is the time rate of change in position.]]></Description>
|
|
60
|
+
</Item>
|
|
61
|
+
<Item ID="5">
|
|
62
|
+
<Name>Heading</Name>
|
|
63
|
+
<Operations>R</Operations>
|
|
64
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
65
|
+
<Mandatory>Optional</Mandatory>
|
|
66
|
+
<Type>Float</Type>
|
|
67
|
+
<RangeEnumeration>0..360</RangeEnumeration>
|
|
68
|
+
<Units>°</Units>
|
|
69
|
+
<Description><![CDATA[The angle of movement in degrees.]]></Description>
|
|
70
|
+
</Item>
|
|
71
|
+
<Item ID="6">
|
|
72
|
+
<Name>Source</Name>
|
|
73
|
+
<Operations>R</Operations>
|
|
74
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
75
|
+
<Mandatory>Mandatory</Mandatory>
|
|
76
|
+
<Type>String</Type>
|
|
77
|
+
<RangeEnumeration/>
|
|
78
|
+
<Units/>
|
|
79
|
+
<Description><![CDATA[The source of the geo location, e.g. GNSS, SCELL, MCELL, WIFI.]]></Description>
|
|
80
|
+
</Item>
|
|
81
|
+
<Item ID="99">
|
|
82
|
+
<Name>Timestamp</Name>
|
|
83
|
+
<Operations>R</Operations>
|
|
84
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
85
|
+
<Mandatory>Mandatory</Mandatory>
|
|
86
|
+
<Type>Time</Type>
|
|
87
|
+
<RangeEnumeration/>
|
|
88
|
+
<Units/>
|
|
89
|
+
<Description><![CDATA[The timestamp of when the location measurement was performed.]]></Description>
|
|
90
|
+
</Item>
|
|
91
|
+
</Resources>
|
|
92
|
+
<Description2/>
|
|
93
|
+
</Object>
|
|
94
|
+
</LWM2M>
|
package/lwm2m/14202.xml
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<LWM2M xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://openmobilealliance.org/tech/profiles/LWM2M-v1_1.xsd">
|
|
3
|
+
<Object ObjectType="MODefinition">
|
|
4
|
+
<Name>Battery and Power</Name>
|
|
5
|
+
<Description1><![CDATA[Information about the battery and power status of the device.]]></Description1>
|
|
6
|
+
<ObjectID>14202</ObjectID>
|
|
7
|
+
<ObjectURN>urn:oma:lwm2m:x:14202</ObjectURN>
|
|
8
|
+
<MultipleInstances>Multiple</MultipleInstances>
|
|
9
|
+
<Mandatory>Optional</Mandatory>
|
|
10
|
+
<Resources>
|
|
11
|
+
<Item ID="0">
|
|
12
|
+
<Name>State of charge</Name>
|
|
13
|
+
<Operations>R</Operations>
|
|
14
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
15
|
+
<Mandatory>Optional</Mandatory>
|
|
16
|
+
<Type>Integer</Type>
|
|
17
|
+
<RangeEnumeration>0..100</RangeEnumeration>
|
|
18
|
+
<Units>%</Units>
|
|
19
|
+
<Description><![CDATA[State of charge in percent. Examples: 23, 1, 100.]]></Description>
|
|
20
|
+
</Item>
|
|
21
|
+
<Item ID="1">
|
|
22
|
+
<Name>Voltage</Name>
|
|
23
|
+
<Operations>R</Operations>
|
|
24
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
25
|
+
<Mandatory>Optional</Mandatory>
|
|
26
|
+
<Type>Float</Type>
|
|
27
|
+
<RangeEnumeration/>
|
|
28
|
+
<Units>V</Units>
|
|
29
|
+
<Description><![CDATA[Battery voltage in Volt. Examples: 2.754, 3.3.]]></Description>
|
|
30
|
+
</Item>
|
|
31
|
+
<Item ID="2">
|
|
32
|
+
<Name>Charge current</Name>
|
|
33
|
+
<Operations>R</Operations>
|
|
34
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
35
|
+
<Mandatory>Optional</Mandatory>
|
|
36
|
+
<Type>Float</Type>
|
|
37
|
+
<RangeEnumeration/>
|
|
38
|
+
<Units>mA</Units>
|
|
39
|
+
<Description><![CDATA[Charge current in mA. Examples: 429, -244.]]></Description>
|
|
40
|
+
</Item>
|
|
41
|
+
<Item ID="3">
|
|
42
|
+
<Name>Battery temperature</Name>
|
|
43
|
+
<Operations>R</Operations>
|
|
44
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
45
|
+
<Mandatory>Optional</Mandatory>
|
|
46
|
+
<Type>Float</Type>
|
|
47
|
+
<RangeEnumeration/>
|
|
48
|
+
<Units>C</Units>
|
|
49
|
+
<Description><![CDATA[Battery temperature in Celsius. Examples: 21.7, 23.123.]]></Description>
|
|
50
|
+
</Item>
|
|
51
|
+
<Item ID="4">
|
|
52
|
+
<Name>Time to full</Name>
|
|
53
|
+
<Operations>R</Operations>
|
|
54
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
55
|
+
<Mandatory>Optional</Mandatory>
|
|
56
|
+
<Type>Integer</Type>
|
|
57
|
+
<RangeEnumeration/>
|
|
58
|
+
<Units>s</Units>
|
|
59
|
+
<Description><![CDATA[Time to full in seconds. Examples: 4652.]]></Description>
|
|
60
|
+
</Item>
|
|
61
|
+
<Item ID="5">
|
|
62
|
+
<Name>Time to empty</Name>
|
|
63
|
+
<Operations>R</Operations>
|
|
64
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
65
|
+
<Mandatory>Optional</Mandatory>
|
|
66
|
+
<Type>Integer</Type>
|
|
67
|
+
<RangeEnumeration/>
|
|
68
|
+
<Units>s</Units>
|
|
69
|
+
<Description><![CDATA[Time to empty in seconds. Examples: 4652.]]></Description>
|
|
70
|
+
</Item>
|
|
71
|
+
<Item ID="99">
|
|
72
|
+
<Name>Timestamp</Name>
|
|
73
|
+
<Operations>R</Operations>
|
|
74
|
+
<MultipleInstances>Single</MultipleInstances>
|
|
75
|
+
<Mandatory>Mandatory</Mandatory>
|
|
76
|
+
<Type>Time</Type>
|
|
77
|
+
<RangeEnumeration/>
|
|
78
|
+
<Units/>
|
|
79
|
+
<Description><![CDATA[The timestamp of when the measurement was performed.]]></Description>
|
|
80
|
+
</Item>
|
|
81
|
+
</Resources>
|
|
82
|
+
<Description2/>
|
|
83
|
+
</Object>
|
|
84
|
+
</LWM2M>
|