@wms-js/cli 0.1.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.
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,290 @@
1
+ import { RadioController, Commands, weatherStationMatcher, networkParamsMatcher, deviceScanMatcher, waveRequestMatcher, networkJoinMatcher } from "@wms-js/lib";
2
+ import { NodeSerialDriver } from "./node-serial.js";
3
+ function timestamp() {
4
+ const d = new Date();
5
+ const hh = String(d.getHours()).padStart(2, "0");
6
+ const mm = String(d.getMinutes()).padStart(2, "0");
7
+ const ss = String(d.getSeconds()).padStart(2, "0");
8
+ return `[${hh}:${mm}:${ss}]`;
9
+ }
10
+ function usage() {
11
+ console.error(`Usage: tsx packages/cli/src/index.ts --port <path> ( --channel <n> | --discover ) [options]
12
+
13
+ Options:
14
+ --port <path> Serial port path (e.g. /dev/ttyUSB0)
15
+ --channel <n> Radio channel (11-26)
16
+ --pan-id <XXXX> PAN ID in hex, defaults to FFFF
17
+ --key <hex> 32-char hex encryption key (optional, for encrypted networks)
18
+ --discover Listen for a remote pairing broadcast to detect and switch to
19
+ the remote's network (ignores --channel, --pan-id, --key)
20
+ --wave <serial> 6-char serial number — send a wave request to a device, print
21
+ the response code, then exit
22
+ --stop <serial> 6-char serial number — send a stop command to the device, then exit
23
+ --move <serial> <position>
24
+ Send a move-to-position command (position 0-100), then exit
25
+ --help Show this help
26
+ `);
27
+ process.exit(1);
28
+ }
29
+ function parseArgs() {
30
+ const args = process.argv.slice(2);
31
+ if (args.length === 0 || args.includes("--help"))
32
+ usage();
33
+ let port = "";
34
+ let channel = 0;
35
+ let panId = "FFFF";
36
+ let key;
37
+ let discover = false;
38
+ let wave;
39
+ let stop;
40
+ let move;
41
+ let channelSet = false;
42
+ let panIdSet = false;
43
+ for (let i = 0; i < args.length; i++) {
44
+ switch (args[i]) {
45
+ case "--port":
46
+ port = args[++i] ?? "";
47
+ break;
48
+ case "--channel":
49
+ channel = Number(args[++i]);
50
+ channelSet = true;
51
+ break;
52
+ case "--pan-id":
53
+ panId = args[++i] ?? "FFFF";
54
+ panIdSet = true;
55
+ break;
56
+ case "--key":
57
+ key = args[++i];
58
+ break;
59
+ case "--discover":
60
+ discover = true;
61
+ break;
62
+ case "--wave":
63
+ wave = args[++i] ?? "";
64
+ break;
65
+ case "--stop":
66
+ stop = args[++i] ?? "";
67
+ break;
68
+ case "--move":
69
+ move = { serial: args[++i] ?? "", position: Number(args[++i]) };
70
+ break;
71
+ default:
72
+ console.error(`Unknown option: ${args[i]}`);
73
+ usage();
74
+ }
75
+ }
76
+ if (!port) {
77
+ console.error("Error: --port is required");
78
+ usage();
79
+ }
80
+ if (discover) {
81
+ if (channel === 0)
82
+ channel = 18;
83
+ }
84
+ else if (channel < 11 || channel > 26) {
85
+ console.error("Error: --channel must be between 11 and 26");
86
+ usage();
87
+ }
88
+ if (!/^[0-9A-Fa-f]{4}$/.test(panId)) {
89
+ console.error("Error: --pan-id must be a 4-digit hex value (e.g. FFFF)");
90
+ usage();
91
+ }
92
+ if (wave !== undefined && !/^[0-9A-Fa-f]{6}$/.test(wave)) {
93
+ console.error("Error: --wave must be a 6-character hex serial number");
94
+ usage();
95
+ }
96
+ if (stop !== undefined && !/^[0-9A-Fa-f]{6}$/.test(stop)) {
97
+ console.error("Error: --stop must be a 6-character hex serial number");
98
+ usage();
99
+ }
100
+ if (move !== undefined) {
101
+ if (!/^[0-9A-Fa-f]{6}$/.test(move.serial)) {
102
+ console.error("Error: --move serial must be a 6-character hex serial number");
103
+ usage();
104
+ }
105
+ if (move.position < 0 || move.position > 100) {
106
+ console.error("Error: --move position must be 0-100");
107
+ usage();
108
+ }
109
+ }
110
+ if (key !== undefined && !/^[0-9A-Fa-f]{32}$/.test(key)) {
111
+ console.error("Error: --key must be a 32-character hex string");
112
+ usage();
113
+ }
114
+ if (discover && channelSet) {
115
+ console.error("Error: --discover mode does not accept --channel");
116
+ usage();
117
+ }
118
+ if (discover && panIdSet) {
119
+ console.error("Error: --discover mode does not accept --pan-id");
120
+ usage();
121
+ }
122
+ if (discover && key !== undefined) {
123
+ console.error("Error: --discover mode does not accept --key");
124
+ usage();
125
+ }
126
+ return { port, channel, panId: panId.toUpperCase(), key, discover, wave, stop, move };
127
+ }
128
+ async function main() {
129
+ const { port, channel, panId, key, discover, wave, stop, move } = parseArgs();
130
+ const driver = new NodeSerialDriver();
131
+ const radio = new RadioController(driver);
132
+ const commands = new Commands(radio);
133
+ const originalWrite = driver.write.bind(driver);
134
+ driver.write = async (data) => {
135
+ const frame = new TextDecoder().decode(data);
136
+ const inner = frame.startsWith("{") && frame.endsWith("}")
137
+ ? frame.slice(1, -1)
138
+ : frame;
139
+ console.log(`${timestamp()} [>>] {${inner}}`);
140
+ await originalWrite(data);
141
+ };
142
+ radio.onError((error) => {
143
+ console.error(`${timestamp()} [ERR] ${error.message}`);
144
+ });
145
+ signalTraps(() => radio.close());
146
+ console.log(`${timestamp()} [INF] Opening ${port} at 128000 baud`);
147
+ await radio.open(port);
148
+ console.log(`${timestamp()} [INF] Serial port opened`);
149
+ try {
150
+ const name = await commands.getName();
151
+ console.log(`${timestamp()} [INF] Stick name: ${name}`);
152
+ }
153
+ catch (e) {
154
+ console.error(`${timestamp()} [ERR] Failed to get stick name: ${e.message}`);
155
+ await radio.close();
156
+ process.exit(1);
157
+ }
158
+ try {
159
+ await commands.setNetworkParameters({
160
+ receiveBroadcasts: true,
161
+ channel,
162
+ panId,
163
+ });
164
+ console.log(`${timestamp()} [INF] Network configured: channel ${channel}, PAN ID ${panId}`);
165
+ if (discover) {
166
+ console.log(`${timestamp()} [INF] Discovery mode: press the L button on a remote to scan`);
167
+ console.log(`${timestamp()} [INF] The remote will broadcast its network parameters`);
168
+ }
169
+ }
170
+ catch (e) {
171
+ console.error(`${timestamp()} [ERR] Failed to configure network: ${e.message}`);
172
+ await radio.close();
173
+ process.exit(1);
174
+ }
175
+ if (key) {
176
+ try {
177
+ await commands.setEncryptionKey(key);
178
+ console.log(`${timestamp()} [INF] Encryption key set`);
179
+ }
180
+ catch (e) {
181
+ console.error(`${timestamp()} [ERR] Failed to set encryption key: ${e.message}`);
182
+ await radio.close();
183
+ process.exit(1);
184
+ }
185
+ }
186
+ if (wave) {
187
+ try {
188
+ const result = await commands.waveDevice(wave);
189
+ const code = result.code ? ` code=${result.code}` : "";
190
+ console.log(`${timestamp()} [WAV] ${result.serialNumber} wave ack${code}`);
191
+ }
192
+ catch (e) {
193
+ console.error(`${timestamp()} [ERR] ${e.message}`);
194
+ }
195
+ await radio.close();
196
+ process.exit(0);
197
+ }
198
+ if (stop) {
199
+ try {
200
+ await commands.stopDevice(stop);
201
+ console.log(`${timestamp()} [MOV] ${stop} stopped`);
202
+ }
203
+ catch (e) {
204
+ console.error(`${timestamp()} [ERR] ${e.message}`);
205
+ }
206
+ await radio.close();
207
+ process.exit(0);
208
+ }
209
+ if (move) {
210
+ try {
211
+ await commands.moveToPosition(move.serial, move.position);
212
+ console.log(`${timestamp()} [MOV] ${move.serial} moved to ${move.position}%`);
213
+ }
214
+ catch (e) {
215
+ console.error(`${timestamp()} [ERR] ${e.message}`);
216
+ }
217
+ await radio.close();
218
+ process.exit(0);
219
+ }
220
+ radio.onBroadcast(async (frame) => {
221
+ console.log(`${timestamp()} [<<] {${frame}}`);
222
+ const ws = weatherStationMatcher(frame);
223
+ if (ws) {
224
+ console.log(`${timestamp()} [WS] ${ws.serialNumber} wind=${ws.windSpeed} km/h`);
225
+ }
226
+ const np = networkParamsMatcher(frame);
227
+ if (np) {
228
+ if (discover) {
229
+ const ch = np.channel;
230
+ console.log(`${timestamp()} [NET] Switching to channel ${ch}, PAN ID ${np.panId}`);
231
+ try {
232
+ await commands.setNetworkParameters({
233
+ receiveBroadcasts: true,
234
+ channel: ch,
235
+ panId: np.panId,
236
+ });
237
+ console.log(`${timestamp()} [NET] Switch succeeded`);
238
+ }
239
+ catch (e) {
240
+ console.error(`${timestamp()} [NET] Switch failed: ${e.message}`);
241
+ }
242
+ }
243
+ else {
244
+ console.log(`${timestamp()} [NET] ${np.serialNumber} PAN ID=${np.panId} channel=${np.channel}`);
245
+ }
246
+ }
247
+ const sq = deviceScanMatcher(frame);
248
+ if (sq) {
249
+ console.log(`${timestamp()} [SCN] ${sq.serialNumber} PAN ID=${sq.panId} → answering`);
250
+ const cmd = `R01${sq.serialNumber}7021FFFF02`;
251
+ radio.send(cmd, {
252
+ ackMatcher: () => null,
253
+ ackTimeoutMs: 0,
254
+ responseWindowMs: 0,
255
+ });
256
+ }
257
+ const wr = waveRequestMatcher(frame);
258
+ if (wr) {
259
+ console.log(`${timestamp()} [WAV] ${wr.serialNumber} wave request received`);
260
+ }
261
+ const nj = networkJoinMatcher(frame);
262
+ if (nj) {
263
+ console.log(`${timestamp()} [KEY] Remote serial: ${nj.serialNumber}`);
264
+ console.log(`${timestamp()} [KEY] PAN ID: ${nj.panId}`);
265
+ console.log(`${timestamp()} [KEY] Channel: ${nj.channel}`);
266
+ console.log(`${timestamp()} [KEY] Encryption key: ${nj.key}`);
267
+ await radio.close();
268
+ process.exit(0);
269
+ }
270
+ });
271
+ console.log(`${timestamp()} [INF] Listening for broadcasts (Ctrl+C to stop)...`);
272
+ }
273
+ function signalTraps(cleanup) {
274
+ let cleaning = false;
275
+ async function shutdown() {
276
+ if (cleaning)
277
+ return;
278
+ cleaning = true;
279
+ console.log(`\n${timestamp()} [INF] Shutting down...`);
280
+ await cleanup();
281
+ process.exit(0);
282
+ }
283
+ process.on("SIGINT", () => { shutdown().catch(() => process.exit(1)); });
284
+ process.on("SIGTERM", () => { shutdown().catch(() => process.exit(1)); });
285
+ }
286
+ main().catch((err) => {
287
+ console.error(`${timestamp()} [ERR] ${err.message}`);
288
+ process.exit(1);
289
+ });
290
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type SerialDriver } from "@wms-js/lib";
2
+ export declare class NodeSerialDriver implements SerialDriver {
3
+ private port;
4
+ private dataHandlers;
5
+ private errorHandlers;
6
+ private closeHandlers;
7
+ private _path;
8
+ get path(): string;
9
+ open(path: string): Promise<void>;
10
+ close(): Promise<void>;
11
+ write(data: Uint8Array): Promise<void>;
12
+ onData(handler: (data: Uint8Array) => void): () => void;
13
+ onError(handler: (error: Error) => void): () => void;
14
+ onClose(handler: () => void): () => void;
15
+ }
@@ -0,0 +1,81 @@
1
+ import { SerialPort } from "serialport";
2
+ export class NodeSerialDriver {
3
+ port = null;
4
+ dataHandlers = new Set();
5
+ errorHandlers = new Set();
6
+ closeHandlers = new Set();
7
+ _path = "";
8
+ get path() {
9
+ return this._path;
10
+ }
11
+ async open(path) {
12
+ this._path = path;
13
+ this.port = new SerialPort({
14
+ path,
15
+ baudRate: 128000,
16
+ autoOpen: false,
17
+ });
18
+ await new Promise((resolve, reject) => {
19
+ if (!this.port)
20
+ return reject(new Error("port not created"));
21
+ this.port.on("open", () => resolve());
22
+ this.port.on("error", (err) => reject(err));
23
+ this.port.open((err) => {
24
+ if (err)
25
+ reject(err);
26
+ });
27
+ });
28
+ this.port.on("data", (data) => {
29
+ for (const handler of this.dataHandlers) {
30
+ handler(new Uint8Array(data));
31
+ }
32
+ });
33
+ this.port.on("error", (err) => {
34
+ for (const handler of this.errorHandlers) {
35
+ handler(err);
36
+ }
37
+ });
38
+ this.port.on("close", () => {
39
+ for (const handler of this.closeHandlers) {
40
+ handler();
41
+ }
42
+ });
43
+ }
44
+ async close() {
45
+ if (this.port) {
46
+ this.port.removeAllListeners();
47
+ await new Promise((resolve) => {
48
+ this.port.close(() => resolve());
49
+ });
50
+ this.port = null;
51
+ }
52
+ this.dataHandlers.clear();
53
+ this.errorHandlers.clear();
54
+ this.closeHandlers.clear();
55
+ }
56
+ async write(data) {
57
+ if (!this.port)
58
+ throw new Error("Serial port not open");
59
+ await new Promise((resolve, reject) => {
60
+ this.port.write(Buffer.from(data), (err) => {
61
+ if (err)
62
+ reject(err);
63
+ else
64
+ resolve();
65
+ });
66
+ });
67
+ }
68
+ onData(handler) {
69
+ this.dataHandlers.add(handler);
70
+ return () => { this.dataHandlers.delete(handler); };
71
+ }
72
+ onError(handler) {
73
+ this.errorHandlers.add(handler);
74
+ return () => { this.errorHandlers.delete(handler); };
75
+ }
76
+ onClose(handler) {
77
+ this.closeHandlers.add(handler);
78
+ return () => { this.closeHandlers.delete(handler); };
79
+ }
80
+ }
81
+ //# sourceMappingURL=node-serial.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-serial.js","sourceRoot":"","sources":["../src/node-serial.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@wms-js/cli",
3
+ "version": "0.1.0",
4
+ "license": "MIT",
5
+ "type": "module",
6
+ "bin": {
7
+ "wms-js": "./dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist",
11
+ "package.json"
12
+ ],
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "start": "tsx src/index.ts",
19
+ "prepublishOnly": "tsc"
20
+ },
21
+ "dependencies": {
22
+ "@wms-js/lib": "*",
23
+ "serialport": "13.0.0"
24
+ },
25
+ "devDependencies": {
26
+ "@types/node": "25.9.3"
27
+ }
28
+ }