@wdywdy/electric-open-platform 0.0.0-stage → 1.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.
Files changed (84) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +585 -2
  3. package/dist/cjs/client.js +173 -0
  4. package/dist/cjs/client.js.map +1 -0
  5. package/dist/cjs/core/api.js +518 -0
  6. package/dist/cjs/core/api.js.map +1 -0
  7. package/dist/cjs/core/auth.js +293 -0
  8. package/dist/cjs/core/auth.js.map +1 -0
  9. package/dist/cjs/core/crypto.js +160 -0
  10. package/dist/cjs/core/crypto.js.map +1 -0
  11. package/dist/cjs/core/errors.js +114 -0
  12. package/dist/cjs/core/errors.js.map +1 -0
  13. package/dist/cjs/core/http.js +70 -0
  14. package/dist/cjs/core/http.js.map +1 -0
  15. package/dist/cjs/core/models.js +105 -0
  16. package/dist/cjs/core/models.js.map +1 -0
  17. package/dist/cjs/core/push.js +79 -0
  18. package/dist/cjs/core/push.js.map +1 -0
  19. package/dist/cjs/core/router.js +124 -0
  20. package/dist/cjs/core/router.js.map +1 -0
  21. package/dist/cjs/core/runtime.js +37 -0
  22. package/dist/cjs/core/runtime.js.map +1 -0
  23. package/dist/cjs/core/sign.js +75 -0
  24. package/dist/cjs/core/sign.js.map +1 -0
  25. package/dist/cjs/core/storage.js +152 -0
  26. package/dist/cjs/core/storage.js.map +1 -0
  27. package/dist/cjs/core/transport-fetch.js +57 -0
  28. package/dist/cjs/core/transport-fetch.js.map +1 -0
  29. package/dist/cjs/core/transport.js +41 -0
  30. package/dist/cjs/core/transport.js.map +1 -0
  31. package/dist/cjs/core/types.js +5 -0
  32. package/dist/cjs/core/types.js.map +1 -0
  33. package/dist/cjs/index.js +111 -0
  34. package/dist/cjs/index.js.map +1 -0
  35. package/dist/cjs/package.json +3 -0
  36. package/dist/esm/client.d.ts +73 -0
  37. package/dist/esm/client.js +169 -0
  38. package/dist/esm/client.js.map +1 -0
  39. package/dist/esm/core/api.d.ts +377 -0
  40. package/dist/esm/core/api.js +506 -0
  41. package/dist/esm/core/api.js.map +1 -0
  42. package/dist/esm/core/auth.d.ts +69 -0
  43. package/dist/esm/core/auth.js +289 -0
  44. package/dist/esm/core/auth.js.map +1 -0
  45. package/dist/esm/core/crypto.d.ts +24 -0
  46. package/dist/esm/core/crypto.js +154 -0
  47. package/dist/esm/core/crypto.js.map +1 -0
  48. package/dist/esm/core/errors.d.ts +86 -0
  49. package/dist/esm/core/errors.js +108 -0
  50. package/dist/esm/core/errors.js.map +1 -0
  51. package/dist/esm/core/http.d.ts +24 -0
  52. package/dist/esm/core/http.js +56 -0
  53. package/dist/esm/core/http.js.map +1 -0
  54. package/dist/esm/core/models.d.ts +441 -0
  55. package/dist/esm/core/models.js +102 -0
  56. package/dist/esm/core/models.js.map +1 -0
  57. package/dist/esm/core/push.d.ts +54 -0
  58. package/dist/esm/core/push.js +74 -0
  59. package/dist/esm/core/push.js.map +1 -0
  60. package/dist/esm/core/router.d.ts +44 -0
  61. package/dist/esm/core/router.js +120 -0
  62. package/dist/esm/core/router.js.map +1 -0
  63. package/dist/esm/core/runtime.d.ts +23 -0
  64. package/dist/esm/core/runtime.js +33 -0
  65. package/dist/esm/core/runtime.js.map +1 -0
  66. package/dist/esm/core/sign.d.ts +54 -0
  67. package/dist/esm/core/sign.js +67 -0
  68. package/dist/esm/core/sign.js.map +1 -0
  69. package/dist/esm/core/storage.d.ts +73 -0
  70. package/dist/esm/core/storage.js +141 -0
  71. package/dist/esm/core/storage.js.map +1 -0
  72. package/dist/esm/core/transport-fetch.d.ts +2 -0
  73. package/dist/esm/core/transport-fetch.js +54 -0
  74. package/dist/esm/core/transport-fetch.js.map +1 -0
  75. package/dist/esm/core/transport.d.ts +23 -0
  76. package/dist/esm/core/transport.js +36 -0
  77. package/dist/esm/core/transport.js.map +1 -0
  78. package/dist/esm/core/types.d.ts +76 -0
  79. package/dist/esm/core/types.js +2 -0
  80. package/dist/esm/core/types.js.map +1 -0
  81. package/dist/esm/index.d.ts +37 -0
  82. package/dist/esm/index.js +47 -0
  83. package/dist/esm/index.js.map +1 -0
  84. package/package.json +63 -4
@@ -0,0 +1,108 @@
1
+ /**
2
+ * Error model for the Mtsci (snd02) open platform.
3
+ *
4
+ * Every failure — transport, OAuth or business return code — surfaces as an
5
+ * `ElectricOpenPlatformError` so callers can branch on `code` instead of
6
+ * parsing `message` strings.
7
+ */
8
+ export const PlatformCodes = {
9
+ OK: '0',
10
+ NOT_LOGGED_IN: '-1',
11
+ FAILED: '1',
12
+ TOKEN_EXPIRED: '2',
13
+ BOX_OFFLINE: '1001',
14
+ ILLEGAL_PARAM: '1002',
15
+ ILLEGAL_OWNERSHIP: '1003',
16
+ REMOTE_CONTROL_FORBIDDEN: '1004',
17
+ INCOMPLETE_PROPERTY: '1005',
18
+ VERIFY_FAILED: '1006',
19
+ ALREADY_EXISTS: '1007',
20
+ NOT_FOUND: '1008',
21
+ OVER_LIMIT: '1009',
22
+ DUPLICATE_OPERATION: '1010',
23
+ };
24
+ const CODE_MESSAGES = {
25
+ '-1': '未登录或会话已过期',
26
+ '1': '接口调用失败',
27
+ '2': 'accessToken 已过期',
28
+ '1001': '设备不在线',
29
+ '1002': '不合法的参数',
30
+ '1003': '不合法的归属',
31
+ '1004': '不允许远程控制',
32
+ '1005': '不完整的设备属性',
33
+ '1006': '校验失败(例如密码错误)',
34
+ '1007': '资源已存在',
35
+ '1008': '相关资源不存在',
36
+ '1009': '资源超过最大限制',
37
+ '1010': '不能重复操作',
38
+ };
39
+ /** Failure classes that never come from the platform itself. */
40
+ export const TransportCodes = {
41
+ /** The device could not reach the server at all. */
42
+ NETWORK: 'E_NETWORK',
43
+ /** The server answered with a non-2xx status. */
44
+ HTTP: 'E_HTTP',
45
+ /** Response body was not the expected JSON envelope. */
46
+ PARSE: 'E_PARSE',
47
+ /** The plugin was used before `configure()` / `login()`. */
48
+ NOT_CONFIGURED: 'E_NOT_CONFIGURED',
49
+ /** Local guard rail rejected the call before hitting the network. */
50
+ INVALID_ARGUMENT: 'E_INVALID_ARGUMENT',
51
+ /** OAuth handshake (authverify2 / token / refresh) failed. */
52
+ OAUTH: 'E_OAUTH',
53
+ /** Daily per-interface quota exhausted (platform rejects with "限额"). */
54
+ QUOTA: 'E_QUOTA',
55
+ /**
56
+ * The method exists but this appKey is not authorized for it.
57
+ *
58
+ * The platform reports unprovisioned methods in two misleading ways:
59
+ * - `接口名称(X)无效!`
60
+ * - `无效的接口方法参数签名!` — which looks like a signing bug but, verified
61
+ * against the live server, is what you get for a method that is not
62
+ * enabled for the key. Only treat it as this code when the same key's
63
+ * other calls succeed, which the client knows.
64
+ */
65
+ NOT_PROVISIONED: 'E_NOT_PROVISIONED',
66
+ /** The call was aborted by the caller (AbortSignal). */
67
+ ABORTED: 'E_ABORTED',
68
+ };
69
+ export class ElectricOpenPlatformError extends Error {
70
+ constructor(code, message, options = {}) {
71
+ super(message || CODE_MESSAGES[code] || `调用失败 (code=${code})`);
72
+ this.name = 'ElectricOpenPlatformError';
73
+ this.code = code;
74
+ this.method = options.method;
75
+ this.details = options.details;
76
+ this.httpStatus = options.httpStatus;
77
+ if (options.cause !== undefined)
78
+ this.cause = options.cause;
79
+ }
80
+ /** True when the platform says the access token must be renewed. */
81
+ get isTokenExpired() {
82
+ return this.code === PlatformCodes.TOKEN_EXPIRED || this.code === PlatformCodes.NOT_LOGGED_IN;
83
+ }
84
+ /** True when a retry after a short delay is likely to succeed. */
85
+ get isRetryable() {
86
+ return (this.code === TransportCodes.NETWORK ||
87
+ this.code === PlatformCodes.BOX_OFFLINE ||
88
+ (this.httpStatus !== undefined && this.httpStatus >= 500));
89
+ }
90
+ toJSON() {
91
+ return {
92
+ name: this.name,
93
+ code: this.code,
94
+ message: this.message,
95
+ method: this.method,
96
+ httpStatus: this.httpStatus,
97
+ details: this.details,
98
+ };
99
+ }
100
+ }
101
+ export function isElectricOpenPlatformError(e) {
102
+ return e instanceof ElectricOpenPlatformError;
103
+ }
104
+ /** Human readable Chinese description for a platform code. */
105
+ export function describeCode(code) {
106
+ return CODE_MESSAGES[String(code)] || `未知返回码 (${code})`;
107
+ }
108
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/core/errors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { HttpRequest, HttpResponse, Transport } from './transport.js';
2
+ export type { HttpRequest, HttpResponse, Transport } from './transport.js';
3
+ export { parseBody, assertHttpOk, DEFAULT_TIMEOUT_MS } from './transport.js';
4
+ export { createFetchTransport } from './transport-fetch.js';
5
+ /** 当前实际使用的传输实现名称,供诊断使用。 */
6
+ export declare function currentTransportName(): string;
7
+ /** 当前传输实现的引用。 */
8
+ export declare function currentTransport(): Transport;
9
+ /** 调用方是否显式设置过传输实现。 */
10
+ export declare function hasExplicitTransport(): boolean;
11
+ /** 替换传输实现(插件在 configure 时按 config.transport / 已注入的实现决定)。 */
12
+ export declare function setTransport(transport: Transport): void;
13
+ /** 恢复默认的 fetch 实现(测试用)。 */
14
+ export declare function resetTransport(): void;
15
+ /**
16
+ * 按优先级挑选传输实现:
17
+ * `config.transport`(最高)> configure() 之前 setTransport 注入的实现 > 内置 fetch。
18
+ *
19
+ * 这里**不做任何宿主探测**:同一个包在 Node、浏览器、Electron 里行为一致,
20
+ * 差异只来自使用方显式注入的实现。
21
+ */
22
+ export declare function resolveTransport(explicitTransport?: Transport, preset?: Transport): Transport;
23
+ /** 用当前传输发送一次 form-urlencoded POST。 */
24
+ export declare function postForm(req: HttpRequest): Promise<HttpResponse>;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 当前传输实现的注册表 + `postForm` 兼容入口。
3
+ *
4
+ * 历史上所有调用都走 `postForm`,现在它转发到「当前选定的 Transport」。
5
+ * 这样:
6
+ * - 既有调用点与测试无需改动;
7
+ * - 传输实现由使用方通过 `config.transport` / `setTransport()` 注入;
8
+ * - 未注入时一律用内置 `fetch`,不按宿主环境猜。
9
+ */
10
+ import { ElectricOpenPlatformError, TransportCodes } from './errors.js';
11
+ import { createFetchTransport } from './transport-fetch.js';
12
+ export { parseBody, assertHttpOk, DEFAULT_TIMEOUT_MS } from './transport.js';
13
+ export { createFetchTransport } from './transport-fetch.js';
14
+ let current = createFetchTransport();
15
+ /** 是否由调用方显式 setTransport 指定过(区别于默认的 fetch)。 */
16
+ let explicit = false;
17
+ /** 当前实际使用的传输实现名称,供诊断使用。 */
18
+ export function currentTransportName() {
19
+ return current.name;
20
+ }
21
+ /** 当前传输实现的引用。 */
22
+ export function currentTransport() {
23
+ return current;
24
+ }
25
+ /** 调用方是否显式设置过传输实现。 */
26
+ export function hasExplicitTransport() {
27
+ return explicit;
28
+ }
29
+ /** 替换传输实现(插件在 configure 时按 config.transport / 已注入的实现决定)。 */
30
+ export function setTransport(transport) {
31
+ current = transport;
32
+ explicit = true;
33
+ }
34
+ /** 恢复默认的 fetch 实现(测试用)。 */
35
+ export function resetTransport() {
36
+ current = createFetchTransport();
37
+ explicit = false;
38
+ }
39
+ /**
40
+ * 按优先级挑选传输实现:
41
+ * `config.transport`(最高)> configure() 之前 setTransport 注入的实现 > 内置 fetch。
42
+ *
43
+ * 这里**不做任何宿主探测**:同一个包在 Node、浏览器、Electron 里行为一致,
44
+ * 差异只来自使用方显式注入的实现。
45
+ */
46
+ export function resolveTransport(explicitTransport, preset) {
47
+ return explicitTransport ?? preset ?? createFetchTransport();
48
+ }
49
+ /** 用当前传输发送一次 form-urlencoded POST。 */
50
+ export function postForm(req) {
51
+ if (!current) {
52
+ return Promise.reject(new ElectricOpenPlatformError(TransportCodes.NETWORK, '未配置网络传输实现'));
53
+ }
54
+ return current.postForm(req);
55
+ }
56
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/core/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAExE,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG5D,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D,IAAI,OAAO,GAAc,oBAAoB,EAAE,CAAC;AAChD,+CAA+C;AAC/C,IAAI,QAAQ,GAAG,KAAK,CAAC;AAErB,2BAA2B;AAC3B,MAAM,UAAU,oBAAoB;IAClC,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,iBAAiB;AACjB,MAAM,UAAU,gBAAgB;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,sBAAsB;AACtB,MAAM,UAAU,oBAAoB;IAClC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,YAAY,CAAC,SAAoB;IAC/C,OAAO,GAAG,SAAS,CAAC;IACpB,QAAQ,GAAG,IAAI,CAAC;AAClB,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,cAAc;IAC5B,OAAO,GAAG,oBAAoB,EAAE,CAAC;IACjC,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,iBAA6B,EAAE,MAAkB;IAChF,OAAO,iBAAiB,IAAI,MAAM,IAAI,oBAAoB,EAAE,CAAC;AAC/D,CAAC;AAED,sCAAsC;AACtC,MAAM,UAAU,QAAQ,CAAC,GAAgB;IACvC,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,OAAO,CAAC,MAAM,CACnB,IAAI,yBAAyB,CAAC,cAAc,CAAC,OAAO,EAAE,WAAW,CAAC,CACnE,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,441 @@
1
+ /**
2
+ * Typed models for the open platform's `data` payloads.
3
+ *
4
+ * Field names mirror the wire format exactly (including the odd ones such as
5
+ * `aTUp` or `mxgl`) so that mapping mistakes are caught at compile time rather
6
+ * than surfacing as `undefined` in the UI.
7
+ */
8
+ /** 设备类型 */
9
+ export declare enum EquipmentType {
10
+ MicroBreaker = 1,
11
+ ElectricalFire = 2,
12
+ LiquidLevel = 4,
13
+ Pressure = 5,
14
+ SmokeForSafe = 6,
15
+ GasForSafe = 7,
16
+ SmokeZac = 10,
17
+ TempHumidity = 11,
18
+ SmartMeter = 12,
19
+ GasZac = 13,
20
+ Lux = 14,
21
+ SmartWaterMeter = 16,
22
+ SmokeWanlin = 29,
23
+ TempWanlin = 39,
24
+ SmokeHaiman = 42,
25
+ GasHaiman = 45
26
+ }
27
+ export type ProjectStatus = 'INTERIM' | 'AUDITED' | 'REJECTED' | string;
28
+ export interface ProjectInfo {
29
+ projectCode: string;
30
+ projectName: string;
31
+ status: ProjectStatus;
32
+ provinceName?: string;
33
+ cityName?: string;
34
+ countyName?: string;
35
+ provinceId?: string;
36
+ cityId?: string;
37
+ countyId?: string;
38
+ street?: string;
39
+ imgUrl?: string;
40
+ longitude?: number;
41
+ latitude?: number;
42
+ linkMan?: string;
43
+ linkTel?: string;
44
+ }
45
+ /** -1 未连接;0 离线;1 在线 */
46
+ export type OnlineState = -1 | 0 | 1;
47
+ export interface Box {
48
+ mac: string;
49
+ projectCode: string;
50
+ equipmentType: EquipmentType | number;
51
+ aliasName: string;
52
+ build: string;
53
+ unit: string;
54
+ room: string;
55
+ linkman: string;
56
+ phone: string;
57
+ online: OnlineState;
58
+ onlineLastTime?: string;
59
+ protocol: 'HTTP' | 'UDP' | '' | string;
60
+ latitude?: number;
61
+ longitude?: number;
62
+ provinceName?: string;
63
+ cityName?: string;
64
+ countyName?: string;
65
+ street?: string;
66
+ extMeta?: string;
67
+ }
68
+ export interface PositionNode {
69
+ name: string;
70
+ childs?: PositionNode[];
71
+ /** Leave nodes may carry a mac. */
72
+ mac?: string;
73
+ boxes?: Box[];
74
+ }
75
+ /** lineType 220=单相 380=三相 120=E系列单相 180=E系列三相 IO=808 */
76
+ export type LineType = '220' | '380' | '120' | '180' | 'IO' | string;
77
+ /**
78
+ * One circuit ("线路/节点") snapshot from GET_BOX_CHANNELS_REALTIME.
79
+ *
80
+ * Single-phase devices fill the `a…` fields; three-phase devices fill `g…` plus
81
+ * per-phase `a…`/`b…`/`c…`; the 808 IO module fills `digitalIns`/`digitalOuts`.
82
+ */
83
+ export interface ChannelRealtime {
84
+ mac?: string;
85
+ addr: number;
86
+ title: string;
87
+ /** 线路有效性(与通信模块的连通性) */
88
+ validity: boolean;
89
+ /** 开关状态 true 合闸 / false 分闸 */
90
+ oc: boolean;
91
+ ocTime: string;
92
+ /** 是否可以远程分合闸 */
93
+ enableNetCtrl: boolean;
94
+ updateTime: string;
95
+ online: boolean;
96
+ /** 刻度电量 kWh */
97
+ power: number;
98
+ /** 过功门限 */
99
+ mxgg?: string | number;
100
+ /** 过流门限 */
101
+ mxgl?: string | number;
102
+ lineType: LineType;
103
+ /** 告警位 — deprecated by the platform, use GET_BOX_ALARM instead. */
104
+ alarm: number;
105
+ specification?: string;
106
+ /** -1 表示进线直连,非 -1 表示汇电目标节点号 */
107
+ gatherAddr: number;
108
+ control: boolean;
109
+ visibility: boolean;
110
+ mainLine?: string;
111
+ localLock: boolean;
112
+ remoteLock: boolean;
113
+ clearModel?: string;
114
+ aLd?: number;
115
+ aA?: number;
116
+ aT?: number;
117
+ aTUp?: number;
118
+ aV?: number;
119
+ aW?: number;
120
+ aPF?: number;
121
+ gLd?: number;
122
+ gA?: number;
123
+ gT?: number;
124
+ gV?: number;
125
+ gW?: number;
126
+ gPF?: number;
127
+ bA?: number;
128
+ bT?: number;
129
+ bTUp?: number;
130
+ bV?: number;
131
+ bW?: number;
132
+ bPF?: number;
133
+ cA?: number;
134
+ cT?: number;
135
+ cTUp?: number;
136
+ cV?: number;
137
+ cW?: number;
138
+ cPF?: number;
139
+ nA?: number;
140
+ nT?: number;
141
+ nTUp?: number;
142
+ digitalIns?: number[];
143
+ digitalOuts?: number[];
144
+ analogIns?: string[];
145
+ }
146
+ export interface BoxRealtime {
147
+ mac: string;
148
+ channelList: ChannelRealtime[];
149
+ }
150
+ export interface BoxChannel {
151
+ addr: number;
152
+ title: string;
153
+ oc: boolean;
154
+ ocTime: string;
155
+ updateTime: string;
156
+ }
157
+ export interface BoxChannels {
158
+ mac: string;
159
+ channels: BoxChannel[];
160
+ }
161
+ export type AlarmStatus = 0 | 1;
162
+ export interface AlarmRecord {
163
+ id: number;
164
+ autoid: number;
165
+ mac: string;
166
+ addr: number;
167
+ node: string;
168
+ /** 告警时间 yyyy-MM-dd HH:mm */
169
+ time: string;
170
+ info: string;
171
+ /** JSON string: { his, elecType, unit, threshold, value } */
172
+ valueDescribe: string;
173
+ status: AlarmStatus;
174
+ processStatus: 0 | 1 | 2 | 4;
175
+ typeNumber: number;
176
+ }
177
+ export interface PagedResult<T> {
178
+ total: number;
179
+ page: number;
180
+ totalPage: number;
181
+ datas: T[];
182
+ }
183
+ export declare const AlarmType: {
184
+ readonly ShortCircuit: 1;
185
+ readonly LeakageMonitor: 2;
186
+ readonly Overload: 3;
187
+ readonly Overcurrent: 4;
188
+ readonly Overvoltage: 5;
189
+ readonly Undervoltage: 6;
190
+ readonly Temperature: 7;
191
+ readonly Surge: 8;
192
+ readonly LeakageProtectOk: 9;
193
+ readonly LeakageSelfTestIncomplete: 10;
194
+ readonly Arc: 11;
195
+ readonly LeakageWarning: 12;
196
+ readonly CurrentWarning: 13;
197
+ readonly OvervoltageWarning: 14;
198
+ readonly UndervoltageWarning: 15;
199
+ readonly CommWarning: 16;
200
+ readonly PhaseLoss: 17;
201
+ readonly ThreePhaseUnbalance: 18;
202
+ readonly ThreePhaseSequence: 19;
203
+ readonly PowerLoss: 53;
204
+ readonly BoxOpen: 54;
205
+ readonly TemperatureWarning: 55;
206
+ readonly Humidity: 56;
207
+ readonly Input: 57;
208
+ readonly PowerNormal: 58;
209
+ readonly MalignantLoad: 62;
210
+ readonly Config: 1001;
211
+ readonly Offline: 1002;
212
+ readonly SwitchOffNotice: 1003;
213
+ readonly SwitchOnNotice: 1004;
214
+ readonly AbnormalOpen: 1005;
215
+ readonly LeakageProtection: 1016;
216
+ readonly Smoke: 2002;
217
+ readonly Gas: 2006;
218
+ readonly Pressure: 2003;
219
+ readonly LiquidLevel: 2004;
220
+ readonly DeviceFault: 9000;
221
+ readonly CommFault: 9001;
222
+ };
223
+ export type AlarmTypeNumber = (typeof AlarmType)[keyof typeof AlarmType];
224
+ export interface ParsedAlarmValue {
225
+ his?: boolean;
226
+ elecType?: 1 | 2 | 3 | 4 | 5;
227
+ unit?: string;
228
+ threshold?: number;
229
+ value?: number;
230
+ }
231
+ /** Daily / hourly / monthly statistics row. See GET_BOXES_DAY_STATS. */
232
+ export interface BoxStat {
233
+ mac?: string;
234
+ /** addr = 0 表示该设备总量 */
235
+ addr?: number;
236
+ /** 天区间用电量 kWh */
237
+ electricity?: number;
238
+ totalElectricity?: number;
239
+ /** 平均电流 A */
240
+ currentValue?: number;
241
+ /** 平均电压 V */
242
+ voltage?: number;
243
+ tempA?: number;
244
+ tempB?: number;
245
+ tempC?: number;
246
+ tempN?: number;
247
+ /** 漏电流峰值 mA */
248
+ leakageValue?: number;
249
+ }
250
+ export type BoxStatsByMac = Record<string, BoxStat[]>;
251
+ export type BoxStatsByMacAndPeriod = Record<string, Record<string, BoxStat[]>>;
252
+ export interface OnlineHistoryRecord {
253
+ online?: number;
254
+ time?: string;
255
+ [key: string]: unknown;
256
+ }
257
+ export interface BoxControlCommand {
258
+ OCSWITCH: {
259
+ value1: 'open' | 'close';
260
+ value2: string;
261
+ value3?: 'ABNORMAL_LOCK_CHECK';
262
+ };
263
+ SWITCHSET: {
264
+ value1: number;
265
+ value2: string;
266
+ value4?: number;
267
+ value5?: number;
268
+ };
269
+ SETAUTOLEAK: {
270
+ value1: 'true' | 'false';
271
+ value2: number;
272
+ value3: number;
273
+ value4: number;
274
+ };
275
+ SETLOGINPWD: {
276
+ value1: string;
277
+ value2: string;
278
+ force?: 'true' | 'false';
279
+ };
280
+ SETWIRELESS: {
281
+ value1: string;
282
+ value2: string;
283
+ value3: string;
284
+ value5: string;
285
+ force?: 'true' | 'false';
286
+ };
287
+ UPDATEDEVICES: Record<string, string | number>;
288
+ DELDEVICES: {
289
+ 'device.autoid': number;
290
+ };
291
+ DELDEVICESES: {
292
+ autoid: string;
293
+ };
294
+ UPDATETIMER: Record<string, string | number>;
295
+ DELTIMER: {
296
+ 'timer.autoid': number;
297
+ };
298
+ DELTIMERES: {
299
+ autoid: string;
300
+ };
301
+ SETWIRING: {
302
+ value1: number;
303
+ value2: number;
304
+ };
305
+ DELALARM: {
306
+ 'alarm.autoid': number;
307
+ };
308
+ DELALARMES: {
309
+ autoid: string;
310
+ };
311
+ SETVISIBILITY: {
312
+ value1: number;
313
+ value2: 0 | 1;
314
+ };
315
+ SETCONTROL: {
316
+ value1: number;
317
+ value2: 0 | 1;
318
+ };
319
+ REMOTE_SWITCH_LOCK: {
320
+ value1: number;
321
+ value2: 'true' | 'false';
322
+ };
323
+ ABNORMAL_SWITCH_UNLOCK: {
324
+ value1: number;
325
+ };
326
+ THIRD_DEVICE_OCSWITCH: {
327
+ value1: 'open' | 'close';
328
+ value2: string;
329
+ };
330
+ }
331
+ export type BoxControlCmd = keyof BoxControlCommand;
332
+ export interface TimerConfig {
333
+ autoid: number;
334
+ channel: string;
335
+ /** 如 "三四",空表示单次定时 */
336
+ weekday: string;
337
+ /** 循环: 时:分:秒;单次: 年-月-日 时:分:秒 */
338
+ time: string;
339
+ /** true 合闸 / false 分闸 / closeAndLock / unlockAndOpen */
340
+ status: 'true' | 'false' | 'closeAndLock' | 'unlockAndOpen' | string;
341
+ }
342
+ export interface LeakageCheckConfig {
343
+ autoid?: number;
344
+ enable?: boolean | string;
345
+ time?: string;
346
+ [key: string]: unknown;
347
+ }
348
+ export interface BoxProperty {
349
+ [key: string]: unknown;
350
+ }
351
+ export interface Scene {
352
+ sceneId: string;
353
+ sceneName?: string;
354
+ [key: string]: unknown;
355
+ }
356
+ export interface PushSubscription {
357
+ url: string;
358
+ projectCode: string[];
359
+ typeNumbers: (number | string)[];
360
+ equipmentTypes?: number[];
361
+ salt: string;
362
+ pushEnable: 0 | 1;
363
+ timeRanges: string[];
364
+ pushMode?: string;
365
+ failure?: {
366
+ peroidStartTime: string;
367
+ peroidEndTime: string;
368
+ lastFailReason: string;
369
+ failTimes: number;
370
+ };
371
+ }
372
+ /** Push type 1=告警 2=节点状态 3=事件通知 */
373
+ export declare enum PushType {
374
+ Alarm = 1,
375
+ ChannelStatus = 2,
376
+ Event = 3
377
+ }
378
+ /**
379
+ * 第三方设备类型(GET_THR_DEVICE_STATUS 的 equipmentType)。
380
+ * 注意:这些是「非微断」设备,微断(1)/电气火灾(2) 不走这个接口。
381
+ */
382
+ export declare enum ThirdPartyEquipmentType {
383
+ LiquidLevel = 4,
384
+ Pressure = 5,
385
+ SmokeForSafe = 6,
386
+ GasForSafe = 7,
387
+ SmokeZac = 10,
388
+ TempHumidity = 11,
389
+ SmartMeter = 12,
390
+ GasZac = 13,
391
+ Lux = 14,
392
+ SmartWaterMeter = 16,
393
+ SmokeWanlin = 29,
394
+ TempWanlin = 39,
395
+ SmokeHaiman = 42,
396
+ GasHaiman = 45
397
+ }
398
+ /**
399
+ * 第三方设备状态记录 GET_THR_DEVICE_STATUS.
400
+ *
401
+ * 平台按 `msgType` 分条返回,`data` 是**JSON 字符串**(需自行解析),
402
+ * 且不同设备类型的字段完全不同(感烟有 BatVol/DevInfo/NetBeats/Status,
403
+ * 水表/电表则是抄表读数)。用 {@link parseThirdPartyData} 安全解析。
404
+ */
405
+ export interface ThirdPartyDeviceStatus {
406
+ /** 设备型号,如 FS3031 */
407
+ devType: string;
408
+ /** 消息类型,如 BatVol / DevInfo / NetBeats / Status */
409
+ msgType: string;
410
+ /** JSON 字符串载荷 */
411
+ data: string;
412
+ mac: string;
413
+ }
414
+ /** 智能水表(CHaobiamao) 查询模式:0=实时抄表,1=时间范围 */
415
+ export declare enum MeterQueryType {
416
+ Realtime = 0,
417
+ Range = 1
418
+ }
419
+ /**
420
+ * 设备维保工单处理记录 GET_BOX_MAINTENANCE_HISTORY.
421
+ * 字段为可选,因为不同版本平台返回的集合略有差异。
422
+ */
423
+ export interface MaintenanceRecord {
424
+ /** 关联的报警 id */
425
+ alarmId?: string;
426
+ /** 维保单 id */
427
+ id?: string;
428
+ mac?: string;
429
+ projectCode?: string;
430
+ /** 处理人 */
431
+ handlerUserName?: string;
432
+ handlerUserPhone?: string;
433
+ /** 维保内容 */
434
+ maintenanceContent?: string;
435
+ /** 故障内容 */
436
+ malfunctionContent?: string;
437
+ /** 处理结果 */
438
+ handledResult?: string;
439
+ suggest?: string;
440
+ [key: string]: unknown;
441
+ }