@hello.nrfcloud.com/proto-map 5.6.3 → 7.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/dist/generator/generateModels.js +0 -85
- package/dist/generator/models.js +1 -83
- package/dist/markdown/getCodeBlock.js +0 -26
- package/dist/models/check-model-rules.js +1 -91
- package/dist/models/models.js +5 -114
- package/dist/models/types.js +0 -12
- package/dist/senml/lwm2mToSenML.js +52 -26
- package/dist/senml/lwm2mToSenML.spec.js +3 -1
- package/dist/senml/senMLtoLwM2M.js +24 -12
- package/dist/senml/senMLtoLwM2M.spec.js +8 -4
- 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 +2 -3
- package/senml/lwm2mToSenML.spec.ts +7 -1
- package/senml/lwm2mToSenML.ts +42 -22
- package/senml/senMLtoLwM2M.spec.ts +8 -4
- package/senml/senMLtoLwM2M.ts +33 -16
- 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,72 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: messages
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Device info
|
|
6
|
-
|
|
7
|
-
## Match Expression
|
|
8
|
-
|
|
9
|
-
```jsonata
|
|
10
|
-
appId = 'DEVICE' and $exists(data.deviceInfo)
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Transform Expression
|
|
14
|
-
|
|
15
|
-
```jsonata
|
|
16
|
-
[
|
|
17
|
-
{"bn": "14204/0/", "n": "0", "vs": data.deviceInfo.imei, "bt": ts },
|
|
18
|
-
{"n": "1", "vs": data.deviceInfo.iccid },
|
|
19
|
-
{"n": "2", "vs": data.deviceInfo.modemFirmware },
|
|
20
|
-
{"n": "3", "vs": data.deviceInfo.appVersion },
|
|
21
|
-
{"n": "4", "vs": data.deviceInfo.board },
|
|
22
|
-
{"n": "5", "vs": data.deviceInfo.bat }
|
|
23
|
-
]
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## Input Example
|
|
27
|
-
|
|
28
|
-
```json
|
|
29
|
-
{
|
|
30
|
-
"appId": "DEVICE",
|
|
31
|
-
"messageType": "DATA",
|
|
32
|
-
"ts": 1676369307189,
|
|
33
|
-
"data": {
|
|
34
|
-
"deviceInfo": {
|
|
35
|
-
"imei": "350457794611739",
|
|
36
|
-
"iccid": "8931080620054223678",
|
|
37
|
-
"modemFirmware": "mfw_nrf9160_1.3.3",
|
|
38
|
-
"board": "thingy91_nrf9160",
|
|
39
|
-
"appVersion": "0.0.0-development"
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Result Example
|
|
46
|
-
|
|
47
|
-
```json
|
|
48
|
-
[
|
|
49
|
-
{
|
|
50
|
-
"bn": "14204/0/",
|
|
51
|
-
"n": "0",
|
|
52
|
-
"vs": "350457794611739",
|
|
53
|
-
"bt": 1676369307189
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
"n": "1",
|
|
57
|
-
"vs": "8931080620054223678"
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"n": "2",
|
|
61
|
-
"vs": "mfw_nrf9160_1.3.3"
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"n": "3",
|
|
65
|
-
"vs": "0.0.0-development"
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"n": "4",
|
|
69
|
-
"vs": "thingy91_nrf9160"
|
|
70
|
-
}
|
|
71
|
-
]
|
|
72
|
-
```
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: messages
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Solar Charge gain
|
|
6
|
-
|
|
7
|
-
The gain measured from the solar shield.
|
|
8
|
-
|
|
9
|
-
## Match Expression
|
|
10
|
-
|
|
11
|
-
```jsonata
|
|
12
|
-
appId = 'SOLAR'
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Transform Expression
|
|
16
|
-
|
|
17
|
-
```jsonata
|
|
18
|
-
[
|
|
19
|
-
{"bn": "14210/0/", "n": "0", "v": $number(data), "bt": ts }
|
|
20
|
-
]
|
|
21
|
-
```
|
|
22
|
-
|
|
23
|
-
## Input Example
|
|
24
|
-
|
|
25
|
-
```json
|
|
26
|
-
{
|
|
27
|
-
"appId": "SOLAR",
|
|
28
|
-
"messageType": "DATA",
|
|
29
|
-
"ts": 1681985624779,
|
|
30
|
-
"data": "3.123456"
|
|
31
|
-
}
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## Result Example
|
|
35
|
-
|
|
36
|
-
```json
|
|
37
|
-
[
|
|
38
|
-
{
|
|
39
|
-
"bn": "14210/0/",
|
|
40
|
-
"n": "0",
|
|
41
|
-
"v": 3.123456,
|
|
42
|
-
"bt": 1681985624779
|
|
43
|
-
}
|
|
44
|
-
]
|
|
45
|
-
```
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: messages
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Geo Location from ground fix
|
|
6
|
-
|
|
7
|
-
Uses the ground fix response from nRF Cloud location services for a device geo
|
|
8
|
-
location.
|
|
9
|
-
|
|
10
|
-
The geo location is written to instance `1` of the object `14201`.
|
|
11
|
-
|
|
12
|
-
## Match Expression
|
|
13
|
-
|
|
14
|
-
```jsonata
|
|
15
|
-
appId = 'GROUND_FIX' and $exists(data.lat) and $exists(data.lon) and $exists(data.uncertainty) and $exists(data.fulfilledWith)
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## Transform Expression
|
|
19
|
-
|
|
20
|
-
```jsonata
|
|
21
|
-
[
|
|
22
|
-
{"bn": "14201/1/", "n": "0", "v": data.lat, "bt": $millis() },
|
|
23
|
-
{"n": "1", "v": data.lon },
|
|
24
|
-
{"n": "3", "v": data.uncertainty },
|
|
25
|
-
{"n": "6", "vs": data.fulfilledWith }
|
|
26
|
-
]
|
|
27
|
-
```
|
|
28
|
-
|
|
29
|
-
## Input Example
|
|
30
|
-
|
|
31
|
-
```json
|
|
32
|
-
{
|
|
33
|
-
"appId": "GROUND_FIX",
|
|
34
|
-
"messageType": "DATA",
|
|
35
|
-
"data": {
|
|
36
|
-
"lat": 59.3381238,
|
|
37
|
-
"lon": 18.00908089,
|
|
38
|
-
"uncertainty": 883.66,
|
|
39
|
-
"fulfilledWith": "MCELL"
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## Result Example
|
|
45
|
-
|
|
46
|
-
```json
|
|
47
|
-
[
|
|
48
|
-
{
|
|
49
|
-
"bn": "14201/1/",
|
|
50
|
-
"n": "0",
|
|
51
|
-
"v": 59.3381238,
|
|
52
|
-
"bt": 1699999999999
|
|
53
|
-
},
|
|
54
|
-
{
|
|
55
|
-
"n": "1",
|
|
56
|
-
"v": 18.00908089
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
"n": "3",
|
|
60
|
-
"v": 883.66
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"n": "6",
|
|
64
|
-
"vs": "MCELL"
|
|
65
|
-
}
|
|
66
|
-
]
|
|
67
|
-
```
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: messages
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Geo Location from a device message
|
|
6
|
-
|
|
7
|
-
## Match Expression
|
|
8
|
-
|
|
9
|
-
```jsonata
|
|
10
|
-
appId = 'GNSS'
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Transform Expression
|
|
14
|
-
|
|
15
|
-
```jsonata
|
|
16
|
-
[
|
|
17
|
-
{"bn": "14201/0/", "n": "0", "v": data.lat, "bt": ts },
|
|
18
|
-
{"n": "1", "v": data.lng },
|
|
19
|
-
{"n": "2", "v": data.alt },
|
|
20
|
-
{"n": "3", "v": data.acc },
|
|
21
|
-
{"n": "4", "v": data.spd },
|
|
22
|
-
{"n": "5", "v": data.hdg },
|
|
23
|
-
{"n": "6", "vs": "GNSS" }
|
|
24
|
-
]
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
## Input Example
|
|
28
|
-
|
|
29
|
-
```json
|
|
30
|
-
{
|
|
31
|
-
"appId": "GNSS",
|
|
32
|
-
"messageType": "DATA",
|
|
33
|
-
"ts": 1690820492999,
|
|
34
|
-
"data": {
|
|
35
|
-
"lng": 10.437692463102255,
|
|
36
|
-
"lat": 63.43308707524497,
|
|
37
|
-
"acc": 4.703136444091797,
|
|
38
|
-
"alt": 138.33331298828125,
|
|
39
|
-
"spd": 0.02938256226480007,
|
|
40
|
-
"hdg": 185.11207580566406
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
```
|
|
44
|
-
|
|
45
|
-
## Result Example
|
|
46
|
-
|
|
47
|
-
```json
|
|
48
|
-
[
|
|
49
|
-
{
|
|
50
|
-
"bn": "14201/0/",
|
|
51
|
-
"n": "0",
|
|
52
|
-
"v": 63.43308707524497,
|
|
53
|
-
"bt": 1690820492999
|
|
54
|
-
},
|
|
55
|
-
{
|
|
56
|
-
"n": "1",
|
|
57
|
-
"v": 10.437692463102255
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"n": "2",
|
|
61
|
-
"v": 138.33331298828125
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"n": "3",
|
|
65
|
-
"v": 4.703136444091797
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"n": "4",
|
|
69
|
-
"v": 0.02938256226480007
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
"n": "5",
|
|
73
|
-
"v": 185.11207580566406
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"n": "6",
|
|
77
|
-
"vs": "GNSS"
|
|
78
|
-
}
|
|
79
|
-
]
|
|
80
|
-
```
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: messages
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Environment sensor: humidity
|
|
6
|
-
|
|
7
|
-
## Match Expression
|
|
8
|
-
|
|
9
|
-
```jsonata
|
|
10
|
-
appId = 'HUMID'
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Transform Expression
|
|
14
|
-
|
|
15
|
-
```jsonata
|
|
16
|
-
[
|
|
17
|
-
{"bn": "14205/0/", "n": "1", "v": $number(data), "bt": ts }
|
|
18
|
-
]
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Input Example
|
|
22
|
-
|
|
23
|
-
```json
|
|
24
|
-
{
|
|
25
|
-
"appId": "HUMID",
|
|
26
|
-
"messageType": "DATA",
|
|
27
|
-
"ts": 1681985384511,
|
|
28
|
-
"data": "23.16"
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Result Example
|
|
33
|
-
|
|
34
|
-
```json
|
|
35
|
-
[
|
|
36
|
-
{
|
|
37
|
-
"bn": "14205/0/",
|
|
38
|
-
"n": "1",
|
|
39
|
-
"v": 23.16,
|
|
40
|
-
"bt": 1681985384511
|
|
41
|
-
}
|
|
42
|
-
]
|
|
43
|
-
```
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: messages
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Network info
|
|
6
|
-
|
|
7
|
-
## Match Expression
|
|
8
|
-
|
|
9
|
-
```jsonata
|
|
10
|
-
appId = 'DEVICE' and $exists(data.networkInfo)
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Transform Expression
|
|
14
|
-
|
|
15
|
-
```jsonata
|
|
16
|
-
[
|
|
17
|
-
{"bn": "14203/0/", "n": "0", "vs": data.networkInfo.networkMode, "bt": ts },
|
|
18
|
-
{"n": "1", "v": data.networkInfo.currentBand },
|
|
19
|
-
{"n": "2", "v": data.networkInfo.rsrp },
|
|
20
|
-
{"n": "3", "v": data.networkInfo.areaCode },
|
|
21
|
-
{"n": "4", "v": data.networkInfo.cellID },
|
|
22
|
-
{"n": "5", "v": data.networkInfo.mccmnc },
|
|
23
|
-
{"n": "6", "vs": data.networkInfo.ipAddress },
|
|
24
|
-
{"n": "11", "v": data.networkInfo.eest }
|
|
25
|
-
]
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
## Input Example
|
|
29
|
-
|
|
30
|
-
```json
|
|
31
|
-
{
|
|
32
|
-
"appId": "DEVICE",
|
|
33
|
-
"messageType": "DATA",
|
|
34
|
-
"ts": 1676369307222,
|
|
35
|
-
"data": {
|
|
36
|
-
"networkInfo": {
|
|
37
|
-
"currentBand": 20,
|
|
38
|
-
"networkMode": "LTE-M",
|
|
39
|
-
"rsrp": -79,
|
|
40
|
-
"areaCode": 6,
|
|
41
|
-
"mccmnc": 24001,
|
|
42
|
-
"cellID": 56879116,
|
|
43
|
-
"ipAddress": "10.160.243.113"
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
## Result Example
|
|
50
|
-
|
|
51
|
-
```json
|
|
52
|
-
[
|
|
53
|
-
{
|
|
54
|
-
"bn": "14203/0/",
|
|
55
|
-
"n": "0",
|
|
56
|
-
"vs": "LTE-M",
|
|
57
|
-
"bt": 1676369307222
|
|
58
|
-
},
|
|
59
|
-
{
|
|
60
|
-
"n": "1",
|
|
61
|
-
"v": 20
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
"n": "2",
|
|
65
|
-
"v": -79
|
|
66
|
-
},
|
|
67
|
-
{
|
|
68
|
-
"n": "3",
|
|
69
|
-
"v": 6
|
|
70
|
-
},
|
|
71
|
-
{
|
|
72
|
-
"n": "4",
|
|
73
|
-
"v": 56879116
|
|
74
|
-
},
|
|
75
|
-
{
|
|
76
|
-
"n": "5",
|
|
77
|
-
"v": 24001
|
|
78
|
-
},
|
|
79
|
-
{
|
|
80
|
-
"n": "6",
|
|
81
|
-
"vs": "10.160.243.113"
|
|
82
|
-
}
|
|
83
|
-
]
|
|
84
|
-
```
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: messages
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Environment sensor: atmospheric pressure
|
|
6
|
-
|
|
7
|
-
## Match Expression
|
|
8
|
-
|
|
9
|
-
```jsonata
|
|
10
|
-
appId = 'AIR_PRESS'
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Transform Expression
|
|
14
|
-
|
|
15
|
-
```jsonata
|
|
16
|
-
[
|
|
17
|
-
{"bn": "14205/0/", "n": "2", "v": $number(data)*10, "bt": ts }
|
|
18
|
-
]
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Input Example
|
|
22
|
-
|
|
23
|
-
```json
|
|
24
|
-
{
|
|
25
|
-
"appId": "AIR_PRESS",
|
|
26
|
-
"messageType": "DATA",
|
|
27
|
-
"ts": 1681985384511,
|
|
28
|
-
"data": "102.31"
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Result Example
|
|
33
|
-
|
|
34
|
-
```json
|
|
35
|
-
[
|
|
36
|
-
{
|
|
37
|
-
"bn": "14205/0/",
|
|
38
|
-
"n": "2",
|
|
39
|
-
"v": 1023.1,
|
|
40
|
-
"bt": 1681985384511
|
|
41
|
-
}
|
|
42
|
-
]
|
|
43
|
-
```
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
type: messages
|
|
3
|
-
---
|
|
4
|
-
|
|
5
|
-
# Environment sensor: temperature
|
|
6
|
-
|
|
7
|
-
## Match Expression
|
|
8
|
-
|
|
9
|
-
```jsonata
|
|
10
|
-
appId = 'TEMP'
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## Transform Expression
|
|
14
|
-
|
|
15
|
-
```jsonata
|
|
16
|
-
[
|
|
17
|
-
{"bn": "14205/0/", "n": "0", "v": $number(data), "bt": ts }
|
|
18
|
-
]
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
## Input Example
|
|
22
|
-
|
|
23
|
-
```json
|
|
24
|
-
{
|
|
25
|
-
"appId": "TEMP",
|
|
26
|
-
"messageType": "DATA",
|
|
27
|
-
"ts": 1676366336476,
|
|
28
|
-
"data": "25.73"
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Result Example
|
|
33
|
-
|
|
34
|
-
```json
|
|
35
|
-
[
|
|
36
|
-
{
|
|
37
|
-
"bn": "14205/0/",
|
|
38
|
-
"n": "0",
|
|
39
|
-
"v": 25.73,
|
|
40
|
-
"bt": 1676366336476
|
|
41
|
-
}
|
|
42
|
-
]
|
|
43
|
-
```
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
# `asset_tracker_v2` on AWS
|
|
2
|
-
|
|
3
|
-
This implements the conversion for the
|
|
4
|
-
[`asset_tracker_v2`](https://github.com/nrfconnect/sdk-nrf/tree/v2.5-branch/applications/asset_tracker_v2)
|
|
5
|
-
[message protocol](https://nordicsemiconductor.github.io/asset-tracker-cloud-docs/v2.2.x/)
|
|
6
|
-
when connected to AWS IoT.
|
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
import { describe, it } from 'node:test'
|
|
2
|
-
import {
|
|
3
|
-
senMLtoLwM2M,
|
|
4
|
-
type LwM2MObjectInstance,
|
|
5
|
-
} from '../../../senml/senMLtoLwM2M.js'
|
|
6
|
-
import { TransformType, type Transform } from '../../types.js'
|
|
7
|
-
import jsonata from 'jsonata'
|
|
8
|
-
import { arrayContaining, check } from 'tsmatchers'
|
|
9
|
-
import { models } from '../../../models/models.js'
|
|
10
|
-
|
|
11
|
-
void describe('asset_tracker_v2+AWS examples', () => {
|
|
12
|
-
for (const [input, expected] of [
|
|
13
|
-
[
|
|
14
|
-
'./shadow/example-1.json',
|
|
15
|
-
[
|
|
16
|
-
{
|
|
17
|
-
ObjectID: 14202,
|
|
18
|
-
Resources: {
|
|
19
|
-
1: 4.398,
|
|
20
|
-
99: new Date(1699050063028),
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
ObjectID: 14205,
|
|
25
|
-
Resources: {
|
|
26
|
-
0: 27.06,
|
|
27
|
-
1: 31.125,
|
|
28
|
-
2: 97.748,
|
|
29
|
-
99: new Date(1699050061608),
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
ObjectID: 14203,
|
|
34
|
-
Resources: {
|
|
35
|
-
11: 8,
|
|
36
|
-
99: new Date(1699050062990),
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
],
|
|
40
|
-
],
|
|
41
|
-
[
|
|
42
|
-
'./shadow/example-2.json',
|
|
43
|
-
[
|
|
44
|
-
{
|
|
45
|
-
ObjectID: 14201,
|
|
46
|
-
Resources: {
|
|
47
|
-
0: 33.98771459323253,
|
|
48
|
-
1: -84.50632147267358,
|
|
49
|
-
2: 241.9342498779297,
|
|
50
|
-
3: 11.317643165588379,
|
|
51
|
-
4: 0.03478508070111275,
|
|
52
|
-
5: 90.31222534179688,
|
|
53
|
-
6: 'GNSS',
|
|
54
|
-
99: new Date(1699049744000),
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
ObjectID: 14202,
|
|
59
|
-
Resources: {
|
|
60
|
-
1: 4.414,
|
|
61
|
-
99: new Date(1699049729959),
|
|
62
|
-
},
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
{
|
|
66
|
-
ObjectID: 14205,
|
|
67
|
-
Resources: {
|
|
68
|
-
0: 21.915307998657227,
|
|
69
|
-
1: 34.569278717041016,
|
|
70
|
-
2: 98.846,
|
|
71
|
-
10: 148,
|
|
72
|
-
99: new Date(1699049729518),
|
|
73
|
-
},
|
|
74
|
-
},
|
|
75
|
-
],
|
|
76
|
-
],
|
|
77
|
-
[
|
|
78
|
-
'./shadow/example-3.json',
|
|
79
|
-
[
|
|
80
|
-
{
|
|
81
|
-
ObjectID: 14203,
|
|
82
|
-
Resources: {
|
|
83
|
-
2: -95,
|
|
84
|
-
11: 7,
|
|
85
|
-
99: new Date(1699049610301),
|
|
86
|
-
},
|
|
87
|
-
},
|
|
88
|
-
],
|
|
89
|
-
],
|
|
90
|
-
[
|
|
91
|
-
'./shadow/example-4.json',
|
|
92
|
-
[
|
|
93
|
-
{
|
|
94
|
-
ObjectID: 14204,
|
|
95
|
-
Resources: {
|
|
96
|
-
0: '358299840016535',
|
|
97
|
-
1: '89450421180216254864',
|
|
98
|
-
2: 'mfw_nrf91x1_2.0.0-77.beta',
|
|
99
|
-
3: '0.0.0-development',
|
|
100
|
-
4: 'thingy91x_nrf9161',
|
|
101
|
-
99: new Date(1699284007851),
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
ObjectID: 14202,
|
|
106
|
-
Resources: {
|
|
107
|
-
0: 99,
|
|
108
|
-
1: 4.179,
|
|
109
|
-
2: 0,
|
|
110
|
-
3: 25.7,
|
|
111
|
-
99: new Date(1699049685992),
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
],
|
|
115
|
-
],
|
|
116
|
-
[
|
|
117
|
-
'./shadow/example-5.json',
|
|
118
|
-
[
|
|
119
|
-
{
|
|
120
|
-
ObjectID: 14202,
|
|
121
|
-
Resources: {
|
|
122
|
-
0: 89,
|
|
123
|
-
1: 4.161,
|
|
124
|
-
99: new Date(1701900277007),
|
|
125
|
-
},
|
|
126
|
-
},
|
|
127
|
-
],
|
|
128
|
-
],
|
|
129
|
-
] as [string, Array<LwM2MObjectInstance>][]) {
|
|
130
|
-
void it(input, async () => {
|
|
131
|
-
const result = await transformShadowUpdateToLwM2M(
|
|
132
|
-
(models['asset_tracker_v2+AWS']?.transforms ?? []).filter(
|
|
133
|
-
({ type }) => type === TransformType.Shadow,
|
|
134
|
-
),
|
|
135
|
-
)(
|
|
136
|
-
await import(input, {
|
|
137
|
-
assert: { type: 'json' },
|
|
138
|
-
}),
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
for (const expectedObject of expected) {
|
|
142
|
-
check(result).is(arrayContaining(expectedObject))
|
|
143
|
-
}
|
|
144
|
-
})
|
|
145
|
-
}
|
|
146
|
-
})
|
|
147
|
-
|
|
148
|
-
/**
|
|
149
|
-
* Very simple implementation of a converter.
|
|
150
|
-
*/
|
|
151
|
-
const transformShadowUpdateToLwM2M = (transforms: Transform[]) => {
|
|
152
|
-
// Turn the JSONata in the transforms into executable functions
|
|
153
|
-
const transformFns: Array<{
|
|
154
|
-
match: ReturnType<typeof jsonata>
|
|
155
|
-
matchExpression: string
|
|
156
|
-
transform: ReturnType<typeof jsonata>
|
|
157
|
-
transformExpression: string
|
|
158
|
-
}> = []
|
|
159
|
-
|
|
160
|
-
for (const {
|
|
161
|
-
match: matchExpression,
|
|
162
|
-
transform: transformExpression,
|
|
163
|
-
} of transforms) {
|
|
164
|
-
let match: ReturnType<typeof jsonata>
|
|
165
|
-
let transform: ReturnType<typeof jsonata>
|
|
166
|
-
try {
|
|
167
|
-
match = jsonata(matchExpression)
|
|
168
|
-
} catch {
|
|
169
|
-
throw new Error(`Failed to parse match expression '${matchExpression}'`)
|
|
170
|
-
}
|
|
171
|
-
try {
|
|
172
|
-
transform = jsonata(transformExpression)
|
|
173
|
-
} catch {
|
|
174
|
-
throw new Error(
|
|
175
|
-
`Failed to parse match expression '${transformExpression}'`,
|
|
176
|
-
)
|
|
177
|
-
}
|
|
178
|
-
transformFns.push({
|
|
179
|
-
match,
|
|
180
|
-
matchExpression,
|
|
181
|
-
transform,
|
|
182
|
-
transformExpression,
|
|
183
|
-
})
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
return async (input: {
|
|
187
|
-
state: {
|
|
188
|
-
reported?: Record<string, unknown>
|
|
189
|
-
desired?: Record<string, unknown>
|
|
190
|
-
}
|
|
191
|
-
}): Promise<Array<LwM2MObjectInstance>> =>
|
|
192
|
-
Promise.all(
|
|
193
|
-
transformFns.map(
|
|
194
|
-
async ({ match, matchExpression, transform, transformExpression }) => {
|
|
195
|
-
// Check if the `matched` JSONata returns `true`.
|
|
196
|
-
try {
|
|
197
|
-
const matched = await match.evaluate(input)
|
|
198
|
-
if (typeof matched !== 'boolean') return null
|
|
199
|
-
if (matched === false) return null
|
|
200
|
-
} catch (err) {
|
|
201
|
-
console.error(err)
|
|
202
|
-
console.error(
|
|
203
|
-
`Failed to match ${JSON.stringify(
|
|
204
|
-
input,
|
|
205
|
-
)} using expression '${matchExpression}'!`,
|
|
206
|
-
)
|
|
207
|
-
return false
|
|
208
|
-
}
|
|
209
|
-
// Transform
|
|
210
|
-
try {
|
|
211
|
-
return await transform.evaluate(input)
|
|
212
|
-
} catch (err) {
|
|
213
|
-
console.error(err)
|
|
214
|
-
console.error(
|
|
215
|
-
`Failed to transform ${JSON.stringify(
|
|
216
|
-
input,
|
|
217
|
-
)} using expression '${transformExpression}'!`,
|
|
218
|
-
)
|
|
219
|
-
return null
|
|
220
|
-
}
|
|
221
|
-
},
|
|
222
|
-
),
|
|
223
|
-
)
|
|
224
|
-
.then((result) => result.flat())
|
|
225
|
-
// Ignore unmatched transforms
|
|
226
|
-
.then((result) => result.filter((item) => item !== null))
|
|
227
|
-
// Convert it to LwM2M
|
|
228
|
-
.then(senMLtoLwM2M)
|
|
229
|
-
}
|