@zwave-js/nvmedit 8.9.0-beta.4-pr-3789-c208add
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 +21 -0
- package/README.md +53 -0
- package/bin/nvmedit.js +2 -0
- package/build/cli.d.ts +3 -0
- package/build/cli.d.ts.map +1 -0
- package/build/cli.js +175 -0
- package/build/cli.js.map +1 -0
- package/build/consts.d.ts +4 -0
- package/build/consts.d.ts.map +1 -0
- package/build/consts.js +7 -0
- package/build/consts.js.map +1 -0
- package/build/convert.d.ts +86 -0
- package/build/convert.d.ts.map +1 -0
- package/build/convert.js +796 -0
- package/build/convert.js.map +1 -0
- package/build/files/ApplicationCCsFile.d.ts +22 -0
- package/build/files/ApplicationCCsFile.d.ts.map +1 -0
- package/build/files/ApplicationCCsFile.js +75 -0
- package/build/files/ApplicationCCsFile.js.map +1 -0
- package/build/files/ApplicationDataFile.d.ts +12 -0
- package/build/files/ApplicationDataFile.d.ts.map +1 -0
- package/build/files/ApplicationDataFile.js +31 -0
- package/build/files/ApplicationDataFile.js.map +1 -0
- package/build/files/ApplicationRFConfigFile.d.ts +21 -0
- package/build/files/ApplicationRFConfigFile.d.ts.map +1 -0
- package/build/files/ApplicationRFConfigFile.js +71 -0
- package/build/files/ApplicationRFConfigFile.js.map +1 -0
- package/build/files/ApplicationTypeFile.d.ts +24 -0
- package/build/files/ApplicationTypeFile.d.ts.map +1 -0
- package/build/files/ApplicationTypeFile.js +52 -0
- package/build/files/ApplicationTypeFile.js.map +1 -0
- package/build/files/ControllerInfoFile.d.ts +44 -0
- package/build/files/ControllerInfoFile.d.ts.map +1 -0
- package/build/files/ControllerInfoFile.js +136 -0
- package/build/files/ControllerInfoFile.js.map +1 -0
- package/build/files/NVMFile.d.ts +48 -0
- package/build/files/NVMFile.d.ts.map +1 -0
- package/build/files/NVMFile.js +129 -0
- package/build/files/NVMFile.js.map +1 -0
- package/build/files/NodeInfoFiles.d.ts +38 -0
- package/build/files/NodeInfoFiles.d.ts.map +1 -0
- package/build/files/NodeInfoFiles.js +146 -0
- package/build/files/NodeInfoFiles.js.map +1 -0
- package/build/files/ProtocolNodeMaskFiles.d.ts +48 -0
- package/build/files/ProtocolNodeMaskFiles.d.ts.map +1 -0
- package/build/files/ProtocolNodeMaskFiles.js +120 -0
- package/build/files/ProtocolNodeMaskFiles.js.map +1 -0
- package/build/files/RouteCacheFiles.d.ts +45 -0
- package/build/files/RouteCacheFiles.d.ts.map +1 -0
- package/build/files/RouteCacheFiles.js +164 -0
- package/build/files/RouteCacheFiles.js.map +1 -0
- package/build/files/SUCUpdateEntriesFile.d.ts +25 -0
- package/build/files/SUCUpdateEntriesFile.d.ts.map +1 -0
- package/build/files/SUCUpdateEntriesFile.js +82 -0
- package/build/files/SUCUpdateEntriesFile.js.map +1 -0
- package/build/files/VersionFiles.d.ts +27 -0
- package/build/files/VersionFiles.d.ts.map +1 -0
- package/build/files/VersionFiles.js +60 -0
- package/build/files/VersionFiles.js.map +1 -0
- package/build/files/index.d.ts +13 -0
- package/build/files/index.d.ts.map +1 -0
- package/build/files/index.js +25 -0
- package/build/files/index.js.map +1 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +22 -0
- package/build/index.js.map +1 -0
- package/build/nvm3/consts.d.ts +48 -0
- package/build/nvm3/consts.d.ts.map +1 -0
- package/build/nvm3/consts.js +59 -0
- package/build/nvm3/consts.js.map +1 -0
- package/build/nvm3/nvm.d.ts +31 -0
- package/build/nvm3/nvm.d.ts.map +1 -0
- package/build/nvm3/nvm.js +146 -0
- package/build/nvm3/nvm.js.map +1 -0
- package/build/nvm3/object.d.ts +26 -0
- package/build/nvm3/object.d.ts.map +1 -0
- package/build/nvm3/object.js +196 -0
- package/build/nvm3/object.js.map +1 -0
- package/build/nvm3/page.d.ts +26 -0
- package/build/nvm3/page.d.ts.map +1 -0
- package/build/nvm3/page.js +94 -0
- package/build/nvm3/page.js.map +1 -0
- package/build/nvm3/utils.d.ts +11 -0
- package/build/nvm3/utils.d.ts.map +1 -0
- package/build/nvm3/utils.js +103 -0
- package/build/nvm3/utils.js.map +1 -0
- package/build/nvm500/EntryParsers.d.ts +27 -0
- package/build/nvm500/EntryParsers.d.ts.map +1 -0
- package/build/nvm500/EntryParsers.js +82 -0
- package/build/nvm500/EntryParsers.js.map +1 -0
- package/build/nvm500/NVMParser.d.ts +93 -0
- package/build/nvm500/NVMParser.d.ts.map +1 -0
- package/build/nvm500/NVMParser.js +524 -0
- package/build/nvm500/NVMParser.js.map +1 -0
- package/build/nvm500/parsers/Bridge_6_6x.d.ts +3 -0
- package/build/nvm500/parsers/Bridge_6_6x.d.ts.map +1 -0
- package/build/nvm500/parsers/Bridge_6_6x.js +183 -0
- package/build/nvm500/parsers/Bridge_6_6x.js.map +1 -0
- package/build/nvm500/parsers/Bridge_6_7x.d.ts +3 -0
- package/build/nvm500/parsers/Bridge_6_7x.d.ts.map +1 -0
- package/build/nvm500/parsers/Bridge_6_7x.js +199 -0
- package/build/nvm500/parsers/Bridge_6_7x.js.map +1 -0
- package/build/nvm500/parsers/Bridge_6_8x.d.ts +3 -0
- package/build/nvm500/parsers/Bridge_6_8x.d.ts.map +1 -0
- package/build/nvm500/parsers/Bridge_6_8x.js +226 -0
- package/build/nvm500/parsers/Bridge_6_8x.js.map +1 -0
- package/build/nvm500/parsers/Static_6_6x.d.ts +3 -0
- package/build/nvm500/parsers/Static_6_6x.d.ts.map +1 -0
- package/build/nvm500/parsers/Static_6_6x.js +178 -0
- package/build/nvm500/parsers/Static_6_6x.js.map +1 -0
- package/build/nvm500/parsers/Static_6_7x.d.ts +3 -0
- package/build/nvm500/parsers/Static_6_7x.d.ts.map +1 -0
- package/build/nvm500/parsers/Static_6_7x.js +194 -0
- package/build/nvm500/parsers/Static_6_7x.js.map +1 -0
- package/build/nvm500/parsers/Static_6_8x.d.ts +3 -0
- package/build/nvm500/parsers/Static_6_8x.d.ts.map +1 -0
- package/build/nvm500/parsers/Static_6_8x.js +222 -0
- package/build/nvm500/parsers/Static_6_8x.js.map +1 -0
- package/build/nvm500/shared.d.ts +53 -0
- package/build/nvm500/shared.d.ts.map +1 -0
- package/build/nvm500/shared.js +57 -0
- package/build/nvm500/shared.js.map +1 -0
- package/build/shared.d.ts +1 -0
- package/build/shared.d.ts.map +1 -0
- package/build/shared.js +2 -0
- package/build/shared.js.map +1 -0
- package/package.json +61 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2018-2021 AlCalzone
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# Z-Wave JS: NVM editor
|
|
2
|
+
|
|
3
|
+
CLI utility to convert binary NVM backups from Z-Wave controllers into JSON and back. Can be used to edit a Z-Wave controller's memory or convert it between different firmware revisions.
|
|
4
|
+
**WARNING:** This is highly experimental. Use at your own risk!
|
|
5
|
+
|
|
6
|
+
(Probably) supports all NVM files in the NVM3 format, which is used starting with Z-Wave SDK 6.61+.
|
|
7
|
+
|
|
8
|
+
## Convert one NVM to be compatible with another one
|
|
9
|
+
|
|
10
|
+
**This is probably the command you're looking for.** It converts the format of an NVM backup between different Z-Wave modules.
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
npx @zwave-js/nvmedit convert --source <source> --target <target> --out <output>
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
`<source>` specifies the source NVM filename. This file will be converted to match the target NVM.
|
|
17
|
+
`<target>` specifies the target NVM filename. This file will used to determine how to convert the source NVM.
|
|
18
|
+
The resulting NVM will be written to `<output>`.
|
|
19
|
+
|
|
20
|
+
## Convert binary NVM file to JSON
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
npx @zwave-js/nvmedit nvm2json --in /path/to/nvm.bin --out /path/to/nvm.json [--verbose]
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
The `--verbose` flag will print additional output like memory page contents or parsed NVM objects to the console.
|
|
27
|
+
|
|
28
|
+
The `.bin` file must either contain a 700-series NVM (SDK version 7.x) or a 500-series NVM (SDK version 6.61+). The `.json` output format will depend on the SDK version.
|
|
29
|
+
|
|
30
|
+
## Convert JSON NVM file to binary
|
|
31
|
+
|
|
32
|
+
```
|
|
33
|
+
npx @zwave-js/nvmedit json2nvm --in /path/to/nvm.json --out /path/to/nvm.bin --version <ver.si.on>
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`<ver.si.on>` determines the output format of the NVM file and must be replaced with the target SDK version which must match your stick's firmware version
|
|
37
|
+
Only firmware version `7.x` is supported. Converting a 500-series `.json` to a 700-series `.json` must be done beforehand in a separate step.
|
|
38
|
+
|
|
39
|
+
**ATTENTION:** The input `.json` file must contain a `"meta"` section which contains some information about the target stick. If it is missing, you can use the `nvm2json` command to convert a backup of the target stick and copy the section from there.
|
|
40
|
+
|
|
41
|
+
## Convert 500-series JSON to 700-series JSON
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
npx @zwave-js/nvmedit 500to700 --in /path/to/nvm500.json --out /path/to/nvm700.json [--truncate]
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Some 500-series NVM backups contain more application data than the 700-series NVM has reserved for this field. The conversion routine will try to remove 0-bytes at the start and end, but if this is not enough, it will fail. Set the `--truncate` option to allow truncating potentially valid application data.
|
|
48
|
+
|
|
49
|
+
## Convert 700-series JSON to 500-series JSON
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
npx @zwave-js/nvmedit 700to500 --in /path/to/nvm700.json --out /path/to/nvm500.json
|
|
53
|
+
```
|
package/bin/nvmedit.js
ADDED
package/build/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,CAAC;AAW1B,OAAO,SAAS,CAAC"}
|
package/build/cli.js
ADDED
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const typeguards_1 = require("alcalzone-shared/typeguards");
|
|
7
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
8
|
+
require("reflect-metadata");
|
|
9
|
+
const yargs_1 = __importDefault(require("yargs"));
|
|
10
|
+
const convert_1 = require("./convert");
|
|
11
|
+
require("./index");
|
|
12
|
+
void yargs_1.default
|
|
13
|
+
.env("NVMEDIT")
|
|
14
|
+
.strict()
|
|
15
|
+
.usage("Z-Wave JS NVM converter utility\n\nUsage: $0 [options]")
|
|
16
|
+
.alias("h", "help")
|
|
17
|
+
.alias("v", "version")
|
|
18
|
+
.wrap(Math.min(100, yargs_1.default.terminalWidth()))
|
|
19
|
+
.options({
|
|
20
|
+
verbose: {
|
|
21
|
+
alias: "vv",
|
|
22
|
+
describe: "Print verbose output",
|
|
23
|
+
type: "boolean",
|
|
24
|
+
},
|
|
25
|
+
})
|
|
26
|
+
.command("nvm2json", "Convert an NVM backup to JSON", (yargs) => yargs.usage("$0 nvm2json --in <input> --out <output>").options({
|
|
27
|
+
in: {
|
|
28
|
+
describe: "NVM backup filename",
|
|
29
|
+
type: "string",
|
|
30
|
+
required: true,
|
|
31
|
+
},
|
|
32
|
+
out: {
|
|
33
|
+
describe: "JSON output filename",
|
|
34
|
+
type: "string",
|
|
35
|
+
required: true,
|
|
36
|
+
},
|
|
37
|
+
}), async (argv) => {
|
|
38
|
+
const buffer = await fs_extra_1.default.readFile(argv.in);
|
|
39
|
+
let json;
|
|
40
|
+
try {
|
|
41
|
+
json = (0, convert_1.nvmToJSON)(buffer, argv.verbose);
|
|
42
|
+
}
|
|
43
|
+
catch (e) {
|
|
44
|
+
try {
|
|
45
|
+
json = (0, convert_1.nvm500ToJSON)(buffer);
|
|
46
|
+
}
|
|
47
|
+
catch (ee) {
|
|
48
|
+
console.error(e);
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
await fs_extra_1.default.writeJSON(argv.out, json, { spaces: "\t" });
|
|
53
|
+
console.error(`NVM (JSON) written to ${argv.out}`);
|
|
54
|
+
process.exit(0);
|
|
55
|
+
})
|
|
56
|
+
.command("json2nvm", "Convert the JSON representation of an NVM to binary", (yargs) => yargs
|
|
57
|
+
.usage("$0 json2nvm --in <input> --out <output> --protocolVersion <version>")
|
|
58
|
+
.options({
|
|
59
|
+
in: {
|
|
60
|
+
describe: "JSON input filename",
|
|
61
|
+
type: "string",
|
|
62
|
+
required: true,
|
|
63
|
+
},
|
|
64
|
+
out: {
|
|
65
|
+
describe: "NVM output filename",
|
|
66
|
+
type: "string",
|
|
67
|
+
required: true,
|
|
68
|
+
},
|
|
69
|
+
protocolVersion: {
|
|
70
|
+
alias: "V",
|
|
71
|
+
describe: "target protocol version, determines the NVM format",
|
|
72
|
+
type: "string",
|
|
73
|
+
required: true,
|
|
74
|
+
},
|
|
75
|
+
}), async (argv) => {
|
|
76
|
+
const { protocolVersion } = argv;
|
|
77
|
+
const versionIs500 = /^\d\.\d+$/.test(protocolVersion);
|
|
78
|
+
const json = await fs_extra_1.default.readJson(argv.in);
|
|
79
|
+
const jsonIs500 = json.format === 500;
|
|
80
|
+
if (versionIs500 && !jsonIs500) {
|
|
81
|
+
console.error(`ERROR: Protocol version ${protocolVersion} looks like a 500-series version, but the JSON file does not belong to a 500-series NVM!
|
|
82
|
+
Convert it first using the 700to500 command.`);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
}
|
|
85
|
+
else if (jsonIs500 && !versionIs500) {
|
|
86
|
+
console.error(`ERROR: Protocol version ${protocolVersion} looks like a 700-series version, but the JSON file belong to a 500-series NVM!
|
|
87
|
+
Convert it first using the 500to700 command.`);
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
if (!(0, typeguards_1.isObject)(json.meta)) {
|
|
91
|
+
console.error(`ERROR: The JSON file does not contain the meta section, which is required for the conversion to a binary NVM!
|
|
92
|
+
Create a backup of the target stick, use the nvm2json command to convert it to JSON and copy the meta section from there.`);
|
|
93
|
+
process.exit(1);
|
|
94
|
+
}
|
|
95
|
+
const nvm = versionIs500
|
|
96
|
+
? (0, convert_1.jsonToNVM500)(json, protocolVersion)
|
|
97
|
+
: (0, convert_1.jsonToNVM)(json, protocolVersion);
|
|
98
|
+
await fs_extra_1.default.writeFile(argv.out, nvm);
|
|
99
|
+
console.error(`NVM (binary) written to ${argv.out}`);
|
|
100
|
+
process.exit(0);
|
|
101
|
+
})
|
|
102
|
+
.command("500to700", "Convert a 500-series JSON file into a 700-series JSON file", (yargs) => yargs
|
|
103
|
+
.usage("$0 500to700 --in <input> --out <output> [--truncate]")
|
|
104
|
+
.options({
|
|
105
|
+
in: {
|
|
106
|
+
describe: "500 series JSON input filename",
|
|
107
|
+
type: "string",
|
|
108
|
+
required: true,
|
|
109
|
+
},
|
|
110
|
+
out: {
|
|
111
|
+
describe: "700 series output filename",
|
|
112
|
+
type: "string",
|
|
113
|
+
required: true,
|
|
114
|
+
},
|
|
115
|
+
truncate: {
|
|
116
|
+
alias: "t",
|
|
117
|
+
describe: "Truncate application data if it is too large (> 512 bytes)",
|
|
118
|
+
type: "boolean",
|
|
119
|
+
required: false,
|
|
120
|
+
default: false,
|
|
121
|
+
},
|
|
122
|
+
}), async (argv) => {
|
|
123
|
+
const json500 = await fs_extra_1.default.readJson(argv.in);
|
|
124
|
+
const json700 = (0, convert_1.json500To700)(json500, argv.truncate);
|
|
125
|
+
await fs_extra_1.default.writeJSON(argv.out, json700, { spaces: "\t" });
|
|
126
|
+
console.error(`700-series NVM (JSON) written to ${argv.out}`);
|
|
127
|
+
process.exit(0);
|
|
128
|
+
})
|
|
129
|
+
.command("700to500", "Convert a 700-series JSON file into a 500-series JSON file", (yargs) => yargs.usage("$0 700to500 --in <input> --out <output>").options({
|
|
130
|
+
in: {
|
|
131
|
+
describe: "700 series JSON input filename",
|
|
132
|
+
type: "string",
|
|
133
|
+
required: true,
|
|
134
|
+
},
|
|
135
|
+
out: {
|
|
136
|
+
describe: "500 series output filename",
|
|
137
|
+
type: "string",
|
|
138
|
+
required: true,
|
|
139
|
+
},
|
|
140
|
+
}), async (argv) => {
|
|
141
|
+
const json700 = await fs_extra_1.default.readJson(argv.in);
|
|
142
|
+
const json500 = (0, convert_1.json700To500)(json700);
|
|
143
|
+
await fs_extra_1.default.writeJSON(argv.out, json500, { spaces: "\t" });
|
|
144
|
+
console.error(`500-series NVM (JSON) written to ${argv.out}`);
|
|
145
|
+
process.exit(0);
|
|
146
|
+
})
|
|
147
|
+
.command("convert", "Convert the format of an NVM backup between different Z-Wave modules", (yargs) => yargs
|
|
148
|
+
.usage("$0 convert --source <source> --target <target> --out <output>")
|
|
149
|
+
.options({
|
|
150
|
+
source: {
|
|
151
|
+
describe: "The source NVM filename. This file will be converted to match the target NVM.",
|
|
152
|
+
type: "string",
|
|
153
|
+
required: true,
|
|
154
|
+
},
|
|
155
|
+
target: {
|
|
156
|
+
describe: "The target NVM filename. This file will used to determine how to convert the source NVM.",
|
|
157
|
+
type: "string",
|
|
158
|
+
required: true,
|
|
159
|
+
},
|
|
160
|
+
out: {
|
|
161
|
+
describe: "The output filename where the convert NVM will be written.",
|
|
162
|
+
type: "string",
|
|
163
|
+
required: true,
|
|
164
|
+
},
|
|
165
|
+
}), async (argv) => {
|
|
166
|
+
const source = await fs_extra_1.default.readFile(argv.source);
|
|
167
|
+
const target = await fs_extra_1.default.readFile(argv.target);
|
|
168
|
+
const output = (0, convert_1.migrateNVM)(source, target);
|
|
169
|
+
await fs_extra_1.default.writeFile(argv.out, output);
|
|
170
|
+
console.error(`Converted NVM written to ${argv.out}`);
|
|
171
|
+
process.exit(0);
|
|
172
|
+
})
|
|
173
|
+
.demandCommand(1, "Please specify a command")
|
|
174
|
+
.parseAsync();
|
|
175
|
+
//# sourceMappingURL=cli.js.map
|
package/build/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.d.ts","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAC1C,eAAO,MAAM,qBAAqB,QAA8B,CAAC;AACjE,eAAO,MAAM,eAAe,KAAK,CAAC"}
|
package/build/consts.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SUC_MAX_UPDATES = exports.SUC_UPDATE_ENTRY_SIZE = exports.SUC_UPDATE_NODEPARM_MAX = void 0;
|
|
4
|
+
exports.SUC_UPDATE_NODEPARM_MAX = 20;
|
|
5
|
+
exports.SUC_UPDATE_ENTRY_SIZE = 2 + exports.SUC_UPDATE_NODEPARM_MAX;
|
|
6
|
+
exports.SUC_MAX_UPDATES = 64;
|
|
7
|
+
//# sourceMappingURL=consts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"consts.js","sourceRoot":"","sources":["../src/consts.ts"],"names":[],"mappings":";;;AAAa,QAAA,uBAAuB,GAAG,EAAE,CAAC;AAC7B,QAAA,qBAAqB,GAAG,CAAC,GAAG,+BAAuB,CAAC;AACpD,QAAA,eAAe,GAAG,EAAE,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { CommandClasses, NodeProtocolInfo } from "@zwave-js/core";
|
|
3
|
+
import { Route, SUCUpdateEntry } from "./files";
|
|
4
|
+
import { NVM3Objects, NVMMeta } from "./nvm3/nvm";
|
|
5
|
+
import type { NVM3Object } from "./nvm3/object";
|
|
6
|
+
import { NVM500JSON } from "./nvm500/NVMParser";
|
|
7
|
+
export interface NVMJSON {
|
|
8
|
+
format: number;
|
|
9
|
+
meta?: NVMMeta;
|
|
10
|
+
controller: NVMJSONController;
|
|
11
|
+
nodes: Record<number, NVMJSONNode>;
|
|
12
|
+
}
|
|
13
|
+
export interface NVMJSONController {
|
|
14
|
+
protocolVersion: string;
|
|
15
|
+
applicationVersion: string;
|
|
16
|
+
homeId: string;
|
|
17
|
+
nodeId: number;
|
|
18
|
+
lastNodeId: number;
|
|
19
|
+
staticControllerNodeId: number;
|
|
20
|
+
sucLastIndex: number;
|
|
21
|
+
controllerConfiguration: number;
|
|
22
|
+
sucUpdateEntries: SUCUpdateEntry[];
|
|
23
|
+
sucAwarenessPushNeeded?: number | null;
|
|
24
|
+
maxNodeId: number;
|
|
25
|
+
reservedId: number;
|
|
26
|
+
systemState: number;
|
|
27
|
+
lastNodeIdLR?: number | null;
|
|
28
|
+
maxNodeIdLR?: number | null;
|
|
29
|
+
reservedIdLR?: number | null;
|
|
30
|
+
primaryLongRangeChannelId?: number | null;
|
|
31
|
+
dcdcConfig?: number | null;
|
|
32
|
+
rfConfig?: NVMJSONControllerRFConfig | null;
|
|
33
|
+
preferredRepeaters?: number[] | null;
|
|
34
|
+
isListening: boolean;
|
|
35
|
+
optionalFunctionality: boolean;
|
|
36
|
+
genericDeviceClass: number;
|
|
37
|
+
specificDeviceClass: number;
|
|
38
|
+
commandClasses: {
|
|
39
|
+
includedInsecurely: CommandClasses[];
|
|
40
|
+
includedSecurelyInsecureCCs: CommandClasses[];
|
|
41
|
+
includedSecurelySecureCCs: CommandClasses[];
|
|
42
|
+
};
|
|
43
|
+
applicationData?: string | null;
|
|
44
|
+
}
|
|
45
|
+
export interface NVMJSONControllerRFConfig {
|
|
46
|
+
rfRegion: number;
|
|
47
|
+
txPower: number;
|
|
48
|
+
measured0dBm: number;
|
|
49
|
+
enablePTI: number | null;
|
|
50
|
+
maxTXPower: number | null;
|
|
51
|
+
}
|
|
52
|
+
export interface NVMJSONNodeWithInfo extends Omit<NodeProtocolInfo, "hasSpecificDeviceClass"> {
|
|
53
|
+
isVirtual: boolean;
|
|
54
|
+
genericDeviceClass: number;
|
|
55
|
+
specificDeviceClass: number | null;
|
|
56
|
+
neighbors: number[];
|
|
57
|
+
sucUpdateIndex: number;
|
|
58
|
+
appRouteLock: boolean;
|
|
59
|
+
routeSlaveSUC: boolean;
|
|
60
|
+
sucPendingUpdate: boolean;
|
|
61
|
+
pendingDiscovery: boolean;
|
|
62
|
+
lwr?: Route | null;
|
|
63
|
+
nlwr?: Route | null;
|
|
64
|
+
}
|
|
65
|
+
export interface NVMJSONVirtualNode {
|
|
66
|
+
isVirtual: true;
|
|
67
|
+
}
|
|
68
|
+
export declare type NVMJSONNode = NVMJSONNodeWithInfo | NVMJSONVirtualNode;
|
|
69
|
+
export declare function nodeHasInfo(node: NVMJSONNode): node is NVMJSONNodeWithInfo;
|
|
70
|
+
/** Converts a compressed set of NVM objects to a JSON representation */
|
|
71
|
+
export declare function nvmObjectsToJSON(applicationObjects: ReadonlyMap<number, NVM3Object>, protocolObjects: ReadonlyMap<number, NVM3Object>): NVMJSON;
|
|
72
|
+
export declare function jsonToNVMObjects_v0(json: NVMJSON, major: number, minor: number, patch: number): NVM3Objects;
|
|
73
|
+
export declare function jsonToNVMObjects_v1_to_v3(format: 1 | 2 | 3, json: NVMJSON, major: number, minor: number, patch: number): NVM3Objects;
|
|
74
|
+
/** Reads an NVM buffer and returns its JSON representation */
|
|
75
|
+
export declare function nvmToJSON(buffer: Buffer, debugLogs?: boolean): Required<NVMJSON>;
|
|
76
|
+
/** Reads an NVM buffer of a 500-series stick and returns its JSON representation */
|
|
77
|
+
export declare function nvm500ToJSON(buffer: Buffer): Required<NVM500JSON>;
|
|
78
|
+
/** Takes a JSON represented NVM and converts it to binary */
|
|
79
|
+
export declare function jsonToNVM(json: Required<NVMJSON>, protocolVersion: string): Buffer;
|
|
80
|
+
/** Takes a JSON represented 500 series NVM and converts it to binary */
|
|
81
|
+
export declare function jsonToNVM500(json: Required<NVM500JSON>, protocolVersion: string): Buffer;
|
|
82
|
+
export declare function json500To700(json: NVM500JSON, truncateApplicationData?: boolean): NVMJSON;
|
|
83
|
+
export declare function json700To500(json: NVMJSON): NVM500JSON;
|
|
84
|
+
/** Converts the given source NVM into a format that is compatible with the given target NVM */
|
|
85
|
+
export declare function migrateNVM(source: Buffer, target: Buffer): Buffer;
|
|
86
|
+
//# sourceMappingURL=convert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../src/convert.ts"],"names":[],"mappings":"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"}
|