@hello.nrfcloud.com/proto-map 5.6.2 → 6.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/README.md +0 -16
- package/api/Context.ts +1 -1
- package/api/{ResourceUpdate.spec.ts → ObjectUpdate.spec.ts} +5 -5
- package/api/{ResourceUpdate.ts → ObjectUpdate.ts} +4 -4
- package/dist/api/Context.js +1 -1
- package/dist/api/DeviceId.js +7 -7
- package/dist/api/Devices.js +11 -11
- package/dist/api/History.js +10 -10
- package/dist/api/History.spec.js +17 -17
- package/dist/api/LwM2M.js +11 -11
- package/dist/api/ObjectUpdate.js +17 -0
- package/dist/api/ObjectUpdate.spec.js +26 -0
- package/dist/api/ShareDeviceOwnershipConfirmed.js +4 -4
- package/dist/api/ShareDeviceRequest.js +4 -4
- package/dist/api/Timestamp.js +3 -3
- package/dist/api/Timestamp.spec.js +9 -9
- package/dist/api/index.js +8 -8
- package/dist/generator/addDocBlock.js +2 -2
- package/dist/generator/generateLwM2MDefinitions.js +27 -27
- package/dist/generator/generateLwM2MDefinitions.spec.js +32 -32
- package/dist/generator/generateLwm2mTimestampResources.js +7 -7
- package/dist/generator/generateModels.js +26 -111
- package/dist/generator/generateType.js +21 -21
- package/dist/generator/generateValidator.js +29 -29
- package/dist/generator/generateValidators.js +9 -9
- package/dist/generator/lwm2m.js +23 -23
- package/dist/generator/models.js +14 -96
- package/dist/generator/printNode.js +2 -2
- package/dist/generator/tokenizeName.js +2 -2
- package/dist/generator/tokenizeName.spec.js +20 -20
- package/dist/generator/types.js +37 -37
- package/dist/lwm2m/LWM2MObjectDefinition.js +30 -30
- package/dist/lwm2m/check-lwm2m-rules.js +34 -34
- package/dist/lwm2m/definitions.js +4 -4
- package/dist/lwm2m/fromXML2JSON.js +4 -4
- package/dist/lwm2m/instanceTs.js +2 -2
- package/dist/lwm2m/instanceTs.spec.js +10 -10
- package/dist/lwm2m/isRegisteredLwM2MObject.js +2 -2
- package/dist/lwm2m/isRegisteredLwM2MObject.spec.js +12 -12
- package/dist/lwm2m/parseRangeEnumeration.js +1 -1
- package/dist/lwm2m/parseRangeEnumeration.spec.js +11 -11
- package/dist/lwm2m/unwrapNestedArray.js +2 -2
- package/dist/lwm2m/unwrapNestedArray.spec.js +155 -155
- package/dist/lwm2m/validate.js +1 -1
- package/dist/lwm2m/validation.js +16 -16
- package/dist/markdown/getCodeBlock.js +3 -29
- package/dist/markdown/parseREADME.js +5 -5
- package/dist/models/check-model-rules.js +16 -106
- package/dist/models/models.js +6 -115
- package/dist/models/types.js +0 -12
- package/dist/senml/SenMLSchema.js +16 -16
- package/dist/senml/SenMLSchema.spec.js +11 -11
- package/dist/senml/hasValue.js +2 -2
- package/dist/senml/hasValue.spec.js +4 -4
- package/dist/senml/lwm2mToSenML.js +8 -8
- package/dist/senml/lwm2mToSenML.spec.js +42 -42
- package/dist/senml/parseResourceId.js +1 -1
- package/dist/senml/parseResourceId.spec.js +6 -6
- package/dist/senml/senMLtoLwM2M.js +14 -14
- package/dist/senml/senMLtoLwM2M.spec.js +53 -53
- package/dist/senml/validateSenML.js +2 -2
- package/dist/senml/validateSenML.spec.js +11 -11
- package/models/README.md +0 -4
- package/models/check-model-rules.ts +1 -90
- package/models/models.ts +1 -8
- package/models/types.ts +0 -16
- package/package.json +5 -10
- package/dist/api/ResourceUpdate.js +0 -17
- package/dist/api/ResourceUpdate.spec.js +0 -26
- package/dist/generator/isDir.js +0 -163
- package/dist/generator/isDir.spec.js +0 -212
- package/dist/markdown/getFrontMatter.js +0 -15
- package/dist/models/asset_tracker_v2+AWS/examples/examples.spec.js +0 -489
- package/models/PCA20035+solar/README.md +0 -10
- package/models/PCA20035+solar/transforms/airQuality.md +0 -48
- package/models/PCA20035+solar/transforms/battery.md +0 -46
- package/models/PCA20035+solar/transforms/button.md +0 -45
- package/models/PCA20035+solar/transforms/deviceInfo.md +0 -72
- package/models/PCA20035+solar/transforms/gain.md +0 -45
- package/models/PCA20035+solar/transforms/geolocationFromGroundfix.md +0 -67
- package/models/PCA20035+solar/transforms/geolocationFromMessage.md +0 -80
- package/models/PCA20035+solar/transforms/humidity.md +0 -43
- package/models/PCA20035+solar/transforms/networkInfo.md +0 -84
- package/models/PCA20035+solar/transforms/pressure.md +0 -43
- package/models/PCA20035+solar/transforms/temperature.md +0 -43
- package/models/asset_tracker_v2+AWS/README.md +0 -6
- package/models/asset_tracker_v2+AWS/examples/examples.spec.ts +0 -229
- package/models/asset_tracker_v2+AWS/examples/shadow/example-1.json +0 -24
- package/models/asset_tracker_v2+AWS/examples/shadow/example-2.json +0 -30
- package/models/asset_tracker_v2+AWS/examples/shadow/example-3.json +0 -37
- package/models/asset_tracker_v2+AWS/examples/shadow/example-4.json +0 -48
- package/models/asset_tracker_v2+AWS/examples/shadow/example-5.json +0 -43
- package/models/asset_tracker_v2+AWS/transforms/GNSS.md +0 -66
- package/models/asset_tracker_v2+AWS/transforms/battery-voltage.md +0 -50
- package/models/asset_tracker_v2+AWS/transforms/device-info.md +0 -61
- package/models/asset_tracker_v2+AWS/transforms/env.md +0 -69
- package/models/asset_tracker_v2+AWS/transforms/fuel-gauge.md +0 -62
- package/models/asset_tracker_v2+AWS/transforms/roam.md +0 -100
- package/models/asset_tracker_v2+AWS/transforms/solar.md +0 -58
|
@@ -1,33 +1,10 @@
|
|
|
1
|
-
import { remark } from
|
|
1
|
+
import { remark } from 'remark';
|
|
2
2
|
export var parseMarkdown2 = remark();
|
|
3
|
-
var isCodeBlock = function(lang) {
|
|
4
|
-
return function(child) {
|
|
5
|
-
return child.type === "code" && child.lang === lang;
|
|
6
|
-
};
|
|
7
|
-
};
|
|
8
|
-
var isHeadingWithTitle = function(title) {
|
|
9
|
-
return function(child) {
|
|
10
|
-
var _child_children_;
|
|
11
|
-
return child.type === "heading" && ((_child_children_ = child.children[0]) === null || _child_children_ === void 0 ? void 0 : _child_children_.type) === "text" && child.children[0].value === title;
|
|
12
|
-
};
|
|
13
|
-
};
|
|
14
3
|
var isHeading = function(child) {
|
|
15
|
-
return child.type ===
|
|
4
|
+
return child.type === 'heading';
|
|
16
5
|
};
|
|
17
6
|
var isParagraph = function(child) {
|
|
18
|
-
return child.type ===
|
|
19
|
-
};
|
|
20
|
-
var codeBlockWithHeading = function(children) {
|
|
21
|
-
return function(lang, title) {
|
|
22
|
-
var block = children.find(function(child, index, array) {
|
|
23
|
-
if (!isCodeBlock(lang)(child)) return false;
|
|
24
|
-
var prevChild = array[index - 1];
|
|
25
|
-
if (prevChild === undefined) return false;
|
|
26
|
-
return isHeadingWithTitle(title)(prevChild);
|
|
27
|
-
});
|
|
28
|
-
if (block === undefined) throw new Error("Could not find ".concat(lang, ' codeblock with title "').concat(title, '"!'));
|
|
29
|
-
return block.value;
|
|
30
|
-
};
|
|
7
|
+
return child.type === 'paragraph';
|
|
31
8
|
};
|
|
32
9
|
var headingWithLevel = function(children, level) {
|
|
33
10
|
return children.filter(isHeading).find(function(param) {
|
|
@@ -35,9 +12,6 @@ var headingWithLevel = function(children, level) {
|
|
|
35
12
|
return depth === level;
|
|
36
13
|
});
|
|
37
14
|
};
|
|
38
|
-
export var getCodeBlock = function(markdown) {
|
|
39
|
-
return codeBlockWithHeading(remark().parse(markdown).children);
|
|
40
|
-
};
|
|
41
15
|
export var getHeading = function(markdown, level) {
|
|
42
16
|
return headingWithLevel(remark().parse(markdown).children, level);
|
|
43
17
|
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getHeading, getParagraphsAfterHeading } from
|
|
1
|
+
import { getHeading, getParagraphsAfterHeading } from './getCodeBlock.js';
|
|
2
2
|
export var parseREADME = function(markdown) {
|
|
3
3
|
var h1 = getHeading(markdown, 1);
|
|
4
4
|
if (h1 === undefined) throw new Error("No H1 defined!");
|
|
@@ -10,10 +10,10 @@ export var parseREADME = function(markdown) {
|
|
|
10
10
|
};
|
|
11
11
|
};
|
|
12
12
|
var nodeToString = function(node) {
|
|
13
|
-
if (
|
|
14
|
-
if (
|
|
15
|
-
return
|
|
13
|
+
if ('value' in node) return node.value;
|
|
14
|
+
if ('children' in node) return node.children.map(nodeToString).join('');
|
|
15
|
+
return '';
|
|
16
16
|
};
|
|
17
17
|
var toOneLine = function(s) {
|
|
18
|
-
return s.trim().replaceAll(
|
|
18
|
+
return s.trim().replaceAll('\n', ' ');
|
|
19
19
|
};
|
|
@@ -1,125 +1,35 @@
|
|
|
1
|
-
import chalk from
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
import { validateSenML } from "../senml/validateSenML.js";
|
|
11
|
-
import { isRegisteredLwM2MObject } from "../lwm2m/isRegisteredLwM2MObject.js";
|
|
12
|
-
import { hasValue } from "../senml/hasValue.js";
|
|
13
|
-
import { parseREADME } from "markdown/parseREADME.js";
|
|
14
|
-
console.log(chalk.gray("Models rules check"));
|
|
15
|
-
console.log("");
|
|
16
|
-
var modelsDir = path.join(process.cwd(), "models");
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import assert from 'node:assert/strict';
|
|
3
|
+
import { readFile, readdir, stat } from 'node:fs/promises';
|
|
4
|
+
import path from 'node:path';
|
|
5
|
+
import { ModelIDRegExp } from './types.js';
|
|
6
|
+
import { parseREADME } from 'markdown/parseREADME.js';
|
|
7
|
+
console.log(chalk.gray('Models rules check'));
|
|
8
|
+
console.log('');
|
|
9
|
+
var modelsDir = path.join(process.cwd(), 'models');
|
|
17
10
|
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
18
11
|
try {
|
|
19
12
|
for(var _iterator = (await readdir(modelsDir))[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
20
13
|
var model = _step.value;
|
|
21
14
|
var modelDir = path.join(modelsDir, model);
|
|
22
15
|
if (!(await stat(modelDir)).isDirectory()) continue;
|
|
23
|
-
console.log(chalk.white(
|
|
24
|
-
assert.match(model, ModelIDRegExp,
|
|
25
|
-
console.log(chalk.green(
|
|
16
|
+
console.log(chalk.white('·'), chalk.white.bold(model));
|
|
17
|
+
assert.match(model, ModelIDRegExp, 'Model identifiers must consist of numbers, letters, dash, plus, and underscore only');
|
|
18
|
+
console.log(chalk.green('✔'), chalk.gray('Model name is correct'));
|
|
26
19
|
// A README.md should exist
|
|
27
20
|
try {
|
|
28
|
-
await stat(path.join(modelDir,
|
|
21
|
+
await stat(path.join(modelDir, 'README.md'));
|
|
29
22
|
} catch (e) {
|
|
30
23
|
throw new Error("No README.md defined for model ".concat(model, "!"));
|
|
31
24
|
}
|
|
32
|
-
console.log(chalk.green(
|
|
25
|
+
console.log(chalk.green('✔'), chalk.gray("README.md exists"));
|
|
33
26
|
try {
|
|
34
|
-
parseREADME(await readFile(path.join(modelDir,
|
|
27
|
+
parseREADME(await readFile(path.join(modelDir, 'README.md'), 'utf-8'));
|
|
35
28
|
} catch (err) {
|
|
36
29
|
console.error(err);
|
|
37
30
|
throw new Error("README is not valid for ".concat(model, "!"));
|
|
38
31
|
}
|
|
39
|
-
console.log(chalk.green(
|
|
40
|
-
// Validate jsonata expressions
|
|
41
|
-
var hasTransforms = false;
|
|
42
|
-
var transformsFolder = path.join(modelDir, "transforms");
|
|
43
|
-
try {
|
|
44
|
-
await stat(transformsFolder);
|
|
45
|
-
hasTransforms = true;
|
|
46
|
-
console.log(" ", chalk.gray("Transforms:"));
|
|
47
|
-
} catch (e) {
|
|
48
|
-
console.log(" ", chalk.gray("No transforms found."));
|
|
49
|
-
}
|
|
50
|
-
if (hasTransforms) {
|
|
51
|
-
var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
|
|
52
|
-
try {
|
|
53
|
-
for(var _iterator1 = (await readdir(transformsFolder)).filter(function(f) {
|
|
54
|
-
return f.endsWith(".md");
|
|
55
|
-
})[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
|
|
56
|
-
var transform = _step1.value;
|
|
57
|
-
console.log(" ", chalk.white("\xb7"), chalk.white.bold(transform));
|
|
58
|
-
var markdown = await readFile(path.join(modelDir, "transforms", transform), "utf-8");
|
|
59
|
-
// Validate front-matter
|
|
60
|
-
var type = getFrontMatter(markdown, FrontMatter).type;
|
|
61
|
-
console.log(" ", chalk.green("✔"), chalk.gray("Type ".concat(type, " is valid")));
|
|
62
|
-
var findBlock = getCodeBlock(markdown);
|
|
63
|
-
var matchExpression = findBlock("jsonata", "Match Expression");
|
|
64
|
-
var transformExpression = findBlock("jsonata", "Transform Expression");
|
|
65
|
-
var inputExample = JSON.parse(findBlock("json", "Input Example"));
|
|
66
|
-
var resultExample = JSON.parse(findBlock("json", "Result Example"));
|
|
67
|
-
var selectResult = await jsonata(matchExpression).evaluate(inputExample);
|
|
68
|
-
if (selectResult !== true) {
|
|
69
|
-
throw new Error("The select expression did not evaluate to true with the given example.");
|
|
70
|
-
}
|
|
71
|
-
console.log(" ", chalk.green("✔"), chalk.gray("Select expression evaluated to true for the example input"));
|
|
72
|
-
var transformResult = await jsonata(// For testing purposes this function call result is hardcoded
|
|
73
|
-
transformExpression.replace("$millis()", "1699999999999")).evaluate(inputExample);
|
|
74
|
-
var maybeValidSenML = validateSenML(transformResult.filter(hasValue));
|
|
75
|
-
if ("errors" in maybeValidSenML) {
|
|
76
|
-
console.error(maybeValidSenML.errors);
|
|
77
|
-
throw new Error("The JSONata expression must produce valid SenML");
|
|
78
|
-
}
|
|
79
|
-
assert.deepEqual(maybeValidSenML.value, resultExample);
|
|
80
|
-
console.log(" ", chalk.green("✔"), chalk.gray("Transformation result is valid SenML"));
|
|
81
|
-
assert.deepEqual(maybeValidSenML.value, resultExample);
|
|
82
|
-
console.log(" ", chalk.green("✔"), chalk.gray("The transformation result matches the example"));
|
|
83
|
-
var _iteratorNormalCompletion2 = true, _didIteratorError2 = false, _iteratorError2 = undefined;
|
|
84
|
-
try {
|
|
85
|
-
// Validate
|
|
86
|
-
for(var _iterator2 = senMLtoLwM2M(maybeValidSenML.value)[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true){
|
|
87
|
-
var object = _step2.value;
|
|
88
|
-
if (!isRegisteredLwM2MObject(object, console.error)) {
|
|
89
|
-
throw new Error("The LwM2M object must follow LwM2M schema definition");
|
|
90
|
-
}
|
|
91
|
-
console.log(" ", chalk.green("✔"), chalk.gray("SenML object is valid LwM2M"));
|
|
92
|
-
}
|
|
93
|
-
} catch (err) {
|
|
94
|
-
_didIteratorError2 = true;
|
|
95
|
-
_iteratorError2 = err;
|
|
96
|
-
} finally{
|
|
97
|
-
try {
|
|
98
|
-
if (!_iteratorNormalCompletion2 && _iterator2.return != null) {
|
|
99
|
-
_iterator2.return();
|
|
100
|
-
}
|
|
101
|
-
} finally{
|
|
102
|
-
if (_didIteratorError2) {
|
|
103
|
-
throw _iteratorError2;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
} catch (err) {
|
|
109
|
-
_didIteratorError1 = true;
|
|
110
|
-
_iteratorError1 = err;
|
|
111
|
-
} finally{
|
|
112
|
-
try {
|
|
113
|
-
if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
|
|
114
|
-
_iterator1.return();
|
|
115
|
-
}
|
|
116
|
-
} finally{
|
|
117
|
-
if (_didIteratorError1) {
|
|
118
|
-
throw _iteratorError1;
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
32
|
+
console.log(chalk.green('✔'), chalk.gray("README.md is valid"));
|
|
123
33
|
}
|
|
124
34
|
} catch (err) {
|
|
125
35
|
_didIteratorError = true;
|
package/dist/models/models.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* The Model IDs defined in this repo.
|
|
3
|
+
*/ function _define_property(obj, key, value) {
|
|
2
4
|
if (key in obj) {
|
|
3
5
|
Object.defineProperty(obj, key, {
|
|
4
6
|
value: value,
|
|
@@ -11,127 +13,16 @@ function _define_property(obj, key, value) {
|
|
|
11
13
|
}
|
|
12
14
|
return obj;
|
|
13
15
|
}
|
|
14
|
-
import { TransformType } from "./types.js";
|
|
15
16
|
export var ModelID;
|
|
16
17
|
(function(ModelID) {
|
|
17
|
-
ModelID["PCA20035_solar"] = "PCA20035+solar";
|
|
18
|
-
ModelID["Asset_tracker_v2_AWS"] = "asset_tracker_v2+AWS";
|
|
19
18
|
ModelID["Kartverket_vasstandsdata"] = "kartverket-vasstandsdata";
|
|
20
19
|
})(ModelID || (ModelID = {}));
|
|
21
|
-
var _obj;
|
|
22
20
|
/**
|
|
23
21
|
* The models defined for hello.nrfcloud.com
|
|
24
|
-
*/ export var models = (
|
|
25
|
-
"id": "PCA20035+solar",
|
|
26
|
-
"transforms": [
|
|
27
|
-
{
|
|
28
|
-
"type": TransformType.Messages,
|
|
29
|
-
"match": "appId = 'AIR_QUAL'",
|
|
30
|
-
"transform": '[\n {"bn": "14205/0/", "n": "10", "v": $number(data), "bt": ts }\n]'
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"type": TransformType.Messages,
|
|
34
|
-
"match": "appId = 'BATTERY'",
|
|
35
|
-
"transform": '[\n {"bn": "14202/0/", "n": "0", "v": $number(data), "bt": ts }\n]'
|
|
36
|
-
},
|
|
37
|
-
{
|
|
38
|
-
"type": TransformType.Messages,
|
|
39
|
-
"match": "appId = 'BUTTON'",
|
|
40
|
-
"transform": '[\n {"bn": "14220/0/", "n": "0", "v": $number(data), "bt": ts }\n]'
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
"type": TransformType.Messages,
|
|
44
|
-
"match": "appId = 'DEVICE' and $exists(data.deviceInfo)",
|
|
45
|
-
"transform": '[\n {"bn": "14204/0/", "n": "0", "vs": data.deviceInfo.imei, "bt": ts },\n {"n": "1", "vs": data.deviceInfo.iccid },\n {"n": "2", "vs": data.deviceInfo.modemFirmware },\n {"n": "3", "vs": data.deviceInfo.appVersion },\n {"n": "4", "vs": data.deviceInfo.board },\n {"n": "5", "vs": data.deviceInfo.bat }\n]'
|
|
46
|
-
},
|
|
47
|
-
{
|
|
48
|
-
"type": TransformType.Messages,
|
|
49
|
-
"match": "appId = 'SOLAR'",
|
|
50
|
-
"transform": '[\n {"bn": "14210/0/", "n": "0", "v": $number(data), "bt": ts }\n]'
|
|
51
|
-
},
|
|
52
|
-
{
|
|
53
|
-
"type": TransformType.Messages,
|
|
54
|
-
"match": "appId = 'GROUND_FIX' and $exists(data.lat) and $exists(data.lon) and $exists(data.uncertainty) and $exists(data.fulfilledWith)",
|
|
55
|
-
"transform": '[\n {"bn": "14201/1/", "n": "0", "v": data.lat, "bt": $millis() },\n {"n": "1", "v": data.lon },\n {"n": "3", "v": data.uncertainty },\n {"n": "6", "vs": data.fulfilledWith }\n]'
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"type": TransformType.Messages,
|
|
59
|
-
"match": "appId = 'GNSS'",
|
|
60
|
-
"transform": '[\n {"bn": "14201/0/", "n": "0", "v": data.lat, "bt": ts },\n {"n": "1", "v": data.lng },\n {"n": "2", "v": data.alt },\n {"n": "3", "v": data.acc },\n {"n": "4", "v": data.spd },\n {"n": "5", "v": data.hdg },\n {"n": "6", "vs": "GNSS" }\n]'
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"type": TransformType.Messages,
|
|
64
|
-
"match": "appId = 'HUMID'",
|
|
65
|
-
"transform": '[\n {"bn": "14205/0/", "n": "1", "v": $number(data), "bt": ts }\n]'
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"type": TransformType.Messages,
|
|
69
|
-
"match": "appId = 'DEVICE' and $exists(data.networkInfo)",
|
|
70
|
-
"transform": '[\n {"bn": "14203/0/", "n": "0", "vs": data.networkInfo.networkMode, "bt": ts },\n {"n": "1", "v": data.networkInfo.currentBand },\n {"n": "2", "v": data.networkInfo.rsrp },\n {"n": "3", "v": data.networkInfo.areaCode },\n {"n": "4", "v": data.networkInfo.cellID },\n {"n": "5", "v": data.networkInfo.mccmnc },\n {"n": "6", "vs": data.networkInfo.ipAddress },\n {"n": "11", "v": data.networkInfo.eest }\n]'
|
|
71
|
-
},
|
|
72
|
-
{
|
|
73
|
-
"type": TransformType.Messages,
|
|
74
|
-
"match": "appId = 'AIR_PRESS'",
|
|
75
|
-
"transform": '[\n {"bn": "14205/0/", "n": "2", "v": $number(data)*10, "bt": ts }\n]'
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
"type": TransformType.Messages,
|
|
79
|
-
"match": "appId = 'TEMP'",
|
|
80
|
-
"transform": '[\n {"bn": "14205/0/", "n": "0", "v": $number(data), "bt": ts }\n]'
|
|
81
|
-
}
|
|
82
|
-
],
|
|
83
|
-
"about": {
|
|
84
|
-
"title": "Thingy:91 with Solar Shield",
|
|
85
|
-
"description": "The Nordic Thingy:91 Solar Shield is a plug-and-play prototyping platform. Powerfoyle solar cell is mounted onto the Thingy to quickly get started exploring the endless possibilities with solar powered IoT applications and to develop products with eternal life or even battery-free products.\nThe Thingy:91 runs the asset_tracker_v2 application and sends messages to nRF Cloud using MQTT."
|
|
86
|
-
}
|
|
87
|
-
}), _define_property(_obj, "asset_tracker_v2+AWS", {
|
|
88
|
-
"id": "asset_tracker_v2+AWS",
|
|
89
|
-
"transforms": [
|
|
90
|
-
{
|
|
91
|
-
"type": TransformType.Shadow,
|
|
92
|
-
"match": "$exists(state.reported.gnss)",
|
|
93
|
-
"transform": '[\n {"bn": "14201/0/", "n": "0", "v": state.reported.gnss.v.lat, "bt": state.reported.gnss.ts },\n {"n": "1", "v": state.reported.gnss.v.lng },\n {"n": "2", "v": state.reported.gnss.v.alt },\n {"n": "3", "v": state.reported.gnss.v.acc },\n {"n": "4", "v": state.reported.gnss.v.spd },\n {"n": "5", "v": state.reported.gnss.v.hdg },\n {"n": "6", "vs": "GNSS" }\n]'
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
"type": TransformType.Shadow,
|
|
97
|
-
"match": "$exists(state.reported.bat)",
|
|
98
|
-
"transform": '[\n {"bn": "14202/0/", "n": "1", "v": state.reported.bat.v/1000, "bt": state.reported.bat.ts }\n]'
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
"type": TransformType.Shadow,
|
|
102
|
-
"match": "$exists(state.reported.dev)",
|
|
103
|
-
"transform": '[\n {"bn": "14204/0/", "n": "0", "vs": state.reported.dev.v.imei, "bt": state.reported.dev.ts },\n {"n": "1", "vs": state.reported.dev.v.iccid },\n {"n": "2", "vs": state.reported.dev.v.modV },\n {"n": "3", "vs": state.reported.dev.v.appV },\n {"n": "4", "vs": state.reported.dev.v.brdV }\n]'
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
"type": TransformType.Shadow,
|
|
107
|
-
"match": "$exists(state.reported.env)",
|
|
108
|
-
"transform": '[\n {"bn": "14205/0/", "n": "0", "v": state.reported.env.v.temp, "bt": state.reported.env.ts },\n {"n": "1", "v": state.reported.env.v.hum },\n {"n": "2", "v": state.reported.env.v.atmp },\n {"n": "10", "v": state.reported.env.v.bsec_iaq }\n]'
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"type": TransformType.Shadow,
|
|
112
|
-
"match": "$exists(state.reported.fg)",
|
|
113
|
-
"transform": '[\n {"bn": "14202/0/", "n": "0", "v": state.reported.fg.v.SoC, "bt": state.reported.fg.ts },\n {"n": "1", "v": state.reported.fg.v.V/1000 },\n {"n": "2", "v": state.reported.fg.v.I },\n {"n": "3", "v": state.reported.fg.v.T = null ? null : state.reported.fg.v.T/10 },\n {"n": "4", "v": state.reported.fg.v.TTF },\n {"n": "5", "v": state.reported.fg.v.TTE }\n]'
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
"type": TransformType.Shadow,
|
|
117
|
-
"match": "$exists(state.reported.roam)",
|
|
118
|
-
"transform": '[\n {"bn": "14203/0/", "n": "0", "vs": state.reported.roam.v.nw, "bt": state.reported.roam.ts },\n {"n": "1", "v": state.reported.roam.v.band },\n {"bn": "14203/0/", "n": "2", "v": state.reported.roam.v.rsrp, "bt": state.reported.roam.ts },\n {"n": "3", "v": state.reported.roam.v.area },\n {"n": "4", "v": state.reported.roam.v.cell },\n {"n": "5", "v": state.reported.roam.v.mccmnc },\n {"n": "6", "vs": state.reported.roam.v.ip },\n {"bn": "14203/0/", "n": "11", "v": state.reported.roam.v.eest, "bt": state.reported.roam.ts }\n]'
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
"type": TransformType.Shadow,
|
|
122
|
-
"match": "$exists(state.reported.sol)",
|
|
123
|
-
"transform": '[\n {"bn": "14210/0/", "n": "0", "v": state.reported.sol.v.gain, "bt": state.reported.sol.ts },\n {"n": "1", "v": state.reported.sol.v.bat }\n]'
|
|
124
|
-
}
|
|
125
|
-
],
|
|
126
|
-
"about": {
|
|
127
|
-
"title": "asset_tracker_v2 on AWS",
|
|
128
|
-
"description": "This implements the conversion for the asset_tracker_v2 message protocol when connected to AWS IoT."
|
|
129
|
-
}
|
|
130
|
-
}), _define_property(_obj, "kartverket-vasstandsdata", {
|
|
22
|
+
*/ export var models = _define_property({}, "kartverket-vasstandsdata", {
|
|
131
23
|
"id": "kartverket-vasstandsdata",
|
|
132
|
-
"transforms": [],
|
|
133
24
|
"about": {
|
|
134
25
|
"title": "Kartverket Vasstandsdata",
|
|
135
|
-
"description": "A simulated device reporting the current sea level as provided by the Kartverket's (Norwegian Mapping Authority) API for vasstandsdata (API for water level data).\nReports sea water level using the Object 14230.\nThe data is licensed by the Norwegian Mapping Authority
|
|
26
|
+
"description": "A simulated device reporting the current sea level as provided by the Kartverket's (Norwegian Mapping Authority) API for vasstandsdata (API for water level data).\nReports sea water level using the Object 14230.\nThe data is licensed by the Norwegian Mapping Authority\u2019s under the Creative Commons Attribution 4.0 International (CC BY 4.0) license."
|
|
136
27
|
}
|
|
137
|
-
})
|
|
28
|
+
});
|
package/dist/models/types.js
CHANGED
|
@@ -1,13 +1 @@
|
|
|
1
|
-
import { Type } from "@sinclair/typebox";
|
|
2
1
|
export var ModelIDRegExp = /^[A-Za-z0-9+_-]+$/;
|
|
3
|
-
export var TransformType;
|
|
4
|
-
(function(TransformType) {
|
|
5
|
-
TransformType["Shadow"] = "shadow";
|
|
6
|
-
TransformType["Messages"] = "messages";
|
|
7
|
-
})(TransformType || (TransformType = {}));
|
|
8
|
-
export var FrontMatter = Type.Object({
|
|
9
|
-
type: Type.Union([
|
|
10
|
-
Type.Literal("shadow"),
|
|
11
|
-
Type.Literal("messages")
|
|
12
|
-
])
|
|
13
|
-
});
|
|
@@ -1,22 +1,22 @@
|
|
|
1
|
-
import { Type } from
|
|
1
|
+
import { Type } from '@sinclair/typebox';
|
|
2
2
|
var ResourceIDPart = Type.RegExp(/^[0-9/]+$/, {
|
|
3
|
-
title:
|
|
4
|
-
description:
|
|
3
|
+
title: 'ResourceIDPart',
|
|
4
|
+
description: 'Combines `bn` and `n` to a fully qualified resource identifier in the form of `/<object ID>/<object instance ID>/<resource ID>/0`. (Multiple resource instances are not supported right now.).',
|
|
5
5
|
examples: [
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
'/',
|
|
7
|
+
'/14201/0/',
|
|
8
|
+
'5'
|
|
9
9
|
]
|
|
10
10
|
});
|
|
11
11
|
var BaseValue = Type.Number({
|
|
12
|
-
title:
|
|
12
|
+
title: 'Base Value'
|
|
13
13
|
});
|
|
14
14
|
var Value = Type.Number({
|
|
15
|
-
title:
|
|
15
|
+
title: 'Value'
|
|
16
16
|
});
|
|
17
17
|
var Time = Type.Integer({
|
|
18
18
|
minimum: 0,
|
|
19
|
-
title:
|
|
19
|
+
title: 'Time'
|
|
20
20
|
});
|
|
21
21
|
/**
|
|
22
22
|
* Defines a SenML type with some unsupported elements removed: Sum, Base Sum, Update Time
|
|
@@ -32,8 +32,8 @@ var Time = Type.Integer({
|
|
|
32
32
|
n: ResourceIDPart,
|
|
33
33
|
blv: Type.String({
|
|
34
34
|
minLength: 1,
|
|
35
|
-
description:
|
|
36
|
-
default:
|
|
35
|
+
description: 'The LwM2M object version used',
|
|
36
|
+
default: '1.0'
|
|
37
37
|
}),
|
|
38
38
|
bt: Type.Optional(Time)
|
|
39
39
|
})
|
|
@@ -56,23 +56,23 @@ var Time = Type.Integer({
|
|
|
56
56
|
Type.Object({
|
|
57
57
|
vs: Type.String({
|
|
58
58
|
minLength: 1,
|
|
59
|
-
title:
|
|
59
|
+
title: 'String Value'
|
|
60
60
|
})
|
|
61
61
|
}),
|
|
62
62
|
Type.Object({
|
|
63
63
|
vb: Type.Boolean({
|
|
64
|
-
title:
|
|
64
|
+
title: 'Boolean Value'
|
|
65
65
|
})
|
|
66
66
|
}),
|
|
67
67
|
Type.Object({
|
|
68
68
|
vd: Type.String({
|
|
69
|
-
title:
|
|
70
|
-
description:
|
|
69
|
+
title: 'Data Value.',
|
|
70
|
+
description: 'Octets in the Data Value are base64 encoded with the URL-safe alphabet as defined in Section 5 of [RFC4648], with padding omitted.'
|
|
71
71
|
})
|
|
72
72
|
})
|
|
73
73
|
])
|
|
74
74
|
], {
|
|
75
|
-
description:
|
|
75
|
+
description: 'SenML schema for conversion results. This is limited to properties useful for the hello.nrfcloud.com/map application.'
|
|
76
76
|
});
|
|
77
77
|
export var SenML = Type.Array(Measurement, {
|
|
78
78
|
minItems: 1
|
|
@@ -1,23 +1,23 @@
|
|
|
1
|
-
import { describe, it } from
|
|
2
|
-
import { SenML } from
|
|
3
|
-
import assert from
|
|
4
|
-
import { validate } from
|
|
5
|
-
void describe(
|
|
6
|
-
void it(
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import { SenML } from './SenMLSchema.js';
|
|
3
|
+
import assert from 'node:assert/strict';
|
|
4
|
+
import { validate } from '../validate.js';
|
|
5
|
+
void describe('SenMLType', function() {
|
|
6
|
+
void it('it should validate a SenML payload', function() {
|
|
7
7
|
var example = [
|
|
8
8
|
{
|
|
9
|
-
bn:
|
|
10
|
-
n:
|
|
9
|
+
bn: '14201/0/',
|
|
10
|
+
n: '0',
|
|
11
11
|
v: 33.98755678796222,
|
|
12
12
|
bt: 1698155694999
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
|
-
n:
|
|
15
|
+
n: '1',
|
|
16
16
|
v: -84.506132079174634
|
|
17
17
|
}
|
|
18
18
|
];
|
|
19
19
|
var res = validate(SenML)(example);
|
|
20
|
-
assert.equal(
|
|
21
|
-
assert.deepEqual(
|
|
20
|
+
assert.equal('errors' in res, false);
|
|
21
|
+
assert.deepEqual('value' in res && res.value, example);
|
|
22
22
|
});
|
|
23
23
|
});
|
package/dist/senml/hasValue.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export var hasValue = function(m) {
|
|
2
2
|
if (m === null) return false;
|
|
3
|
-
if (typeof m !==
|
|
3
|
+
if (typeof m !== 'object') return false;
|
|
4
4
|
var _ref, _ref1, _ref2, _ref3;
|
|
5
|
-
var v = (_ref3 = (_ref2 = (_ref1 = (_ref =
|
|
5
|
+
var v = (_ref3 = (_ref2 = (_ref1 = (_ref = 'bv' in m ? m.bv : undefined) !== null && _ref !== void 0 ? _ref : 'v' in m ? m.v : undefined) !== null && _ref1 !== void 0 ? _ref1 : 'vs' in m ? m.vs : undefined) !== null && _ref2 !== void 0 ? _ref2 : 'vb' in m ? m.vb : undefined) !== null && _ref3 !== void 0 ? _ref3 : 'vd' in m ? m.vd : undefined;
|
|
6
6
|
if (v === null || v === undefined) return false;
|
|
7
7
|
return true;
|
|
8
8
|
};
|
|
@@ -44,10 +44,10 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
44
44
|
if (n === "Map" || n === "Set") return Array.from(n);
|
|
45
45
|
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
46
46
|
}
|
|
47
|
-
import { describe, it } from
|
|
48
|
-
import assert from
|
|
49
|
-
import { hasValue } from
|
|
50
|
-
void describe(
|
|
47
|
+
import { describe, it } from 'node:test';
|
|
48
|
+
import assert from 'node:assert/strict';
|
|
49
|
+
import { hasValue } from './hasValue.js';
|
|
50
|
+
void describe('hasValue() should determine whether an object has a value', function() {
|
|
51
51
|
var _loop = function(_i, _iter) {
|
|
52
52
|
var _iter__i = _sliced_to_array(_iter[_i], 2), record = _iter__i[0], expected = _iter__i[1];
|
|
53
53
|
void it("should determine that ".concat(JSON.stringify(record), " has a value: ").concat(JSON.stringify(expected)), function() {
|
|
@@ -84,10 +84,10 @@ function _unsupported_iterable_to_array(o, minLen) {
|
|
|
84
84
|
if (n === "Map" || n === "Set") return Array.from(n);
|
|
85
85
|
if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
|
|
86
86
|
}
|
|
87
|
-
import { instanceTs } from
|
|
88
|
-
import { timestampResources } from
|
|
89
|
-
import { definitions } from
|
|
90
|
-
import { ResourceType } from
|
|
87
|
+
import { instanceTs } from '../lwm2m/instanceTs.js';
|
|
88
|
+
import { timestampResources } from '../lwm2m/timestampResources.js';
|
|
89
|
+
import { definitions } from '../lwm2m/definitions.js';
|
|
90
|
+
import { ResourceType } from '../lwm2m/LWM2MObjectInfo.js';
|
|
91
91
|
/**
|
|
92
92
|
* Convert LwM2M Object Instances to senML
|
|
93
93
|
*/ export var lwm2mToSenML = function(lwm2m) {
|
|
@@ -122,15 +122,15 @@ var toKey = function(def, resourceId) {
|
|
|
122
122
|
var _def_Resources_resourceId;
|
|
123
123
|
switch((_def_Resources_resourceId = def.Resources[resourceId]) === null || _def_Resources_resourceId === void 0 ? void 0 : _def_Resources_resourceId.Type){
|
|
124
124
|
case ResourceType.String:
|
|
125
|
-
return
|
|
125
|
+
return 'vs';
|
|
126
126
|
case ResourceType.Boolean:
|
|
127
|
-
return
|
|
127
|
+
return 'vb';
|
|
128
128
|
case ResourceType.Float:
|
|
129
129
|
case ResourceType.Integer:
|
|
130
130
|
case ResourceType.Time:
|
|
131
|
-
return
|
|
131
|
+
return 'v';
|
|
132
132
|
case ResourceType.Opaque:
|
|
133
|
-
return
|
|
133
|
+
return 'vd';
|
|
134
134
|
default:
|
|
135
135
|
throw new Error("Unknown ResourceID ".concat(resourceId, " for LwM2M Object ").concat(def.ObjectID, "!"));
|
|
136
136
|
}
|