@mirta/globals 0.0.2

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 ADDED
@@ -0,0 +1,24 @@
1
+ This is free and unencumbered software released into the public domain.
2
+
3
+ Anyone is free to copy, modify, publish, use, compile, sell, or
4
+ distribute this software, either in source code form or as a compiled
5
+ binary, for any purpose, commercial or non-commercial, and by any
6
+ means.
7
+
8
+ In jurisdictions that recognize copyright laws, the author or authors
9
+ of this software dedicate any and all copyright interest in the
10
+ software to the public domain. We make this dedication for the benefit
11
+ of the public at large and to the detriment of our heirs and
12
+ successors. We intend this dedication to be an overt act of
13
+ relinquishment in perpetuity of all present and future rights to this
14
+ software under copyright law.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
19
+ IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
20
+ OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21
+ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22
+ OTHER DEALINGS IN THE SOFTWARE.
23
+
24
+ For more information, please refer to <https://unlicense.org>
package/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # @mirta/globals
2
+
3
+ [![en](https://img.shields.io/badge/lang-en-olivedrab.svg?style=flat-square)](https://github.com/wb-mirta/core/blob/latest/packages/mirta-globals/README.md)
4
+ [![ru](https://img.shields.io/badge/lang-ru-dimgray.svg?style=flat-square)](https://github.com/wb-mirta/core/blob/latest/packages/mirta-globals/README.ru.md)
5
+ [![NPM Version](https://img.shields.io/npm/v/@mirta/globals?style=flat-square)](https://npmjs.com/package/@mirta/globals)
6
+
7
+ Provides a complete set of necessary types enabling development of wb-rules in TypeScript.
8
+
9
+ ## Installation
10
+
11
+ ```sh
12
+ pnpm add -D @mirta/globals
13
+ ```
14
+ Add following lines to your `tsconfig.json`:
15
+
16
+ ```json
17
+ {
18
+ "compilerOptions": {
19
+ "baseUrl": ".",
20
+ "types": [
21
+ "@mirta/globals",
22
+ "node"
23
+ ]
24
+ }
25
+ }
26
+ ```
package/README.ru.md ADDED
@@ -0,0 +1,25 @@
1
+ # @mirta/globals
2
+
3
+ [![en](https://img.shields.io/badge/lang-en-dimgray.svg?style=flat-square)](https://github.com/wb-mirta/core/blob/latest/packages/mirta-globals/README.md)
4
+ [![ru](https://img.shields.io/badge/lang-ru-olivedrab.svg?style=flat-square)](https://github.com/wb-mirta/core/blob/latest/packages/mirta-globals/README.ru.md)
5
+ [![NPM Version](https://img.shields.io/npm/v/@mirta/globals?style=flat-square)](https://npmjs.com/package/@mirta/globals)
6
+
7
+ Содержит все необходимые типы для разработки правил wb-rules на TypeScript.
8
+
9
+ ## Установка
10
+
11
+ ```sh
12
+ pnpm add -D @mirta/globals
13
+ ```
14
+ Добавьте следующие строки в ваш `tsconfig.json`:
15
+
16
+ ```json
17
+ {
18
+ "compilerOptions": {
19
+ "types": [
20
+ "node"
21
+ "@mirta/globals",
22
+ ]
23
+ }
24
+ }
25
+ ```
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@mirta/globals",
3
+ "description": "Complete set of types for wb-rule development in TypeScript",
4
+ "version": "0.0.2",
5
+ "license": "Unlicense",
6
+ "keywords": [
7
+ "mirta",
8
+ "globals",
9
+ "wb-rules"
10
+ ],
11
+ "files": [
12
+ "types",
13
+ "LICENSE",
14
+ "README.md"
15
+ ],
16
+ "exports": {
17
+ ".": {
18
+ "types": "./types/index.d.ts"
19
+ }
20
+ },
21
+ "homepage": "https://github.com/wb-mirta/core/tree/latest/packages/mirta-globals#readme",
22
+ "repository": {
23
+ "type": "git",
24
+ "url": "git+https://github.com/wb-mirta/core.git",
25
+ "directory": "packages/mirta-globals"
26
+ },
27
+ "bugs": {
28
+ "url": "https://github.com/wb-mirta/core/issues"
29
+ },
30
+ "publishConfig": {
31
+ "access": "public"
32
+ }
33
+ }
@@ -0,0 +1,6 @@
1
+ /// <reference path="./wb-rules.d.ts" />
2
+
3
+ /** Признак сборки в режиме разработки. */
4
+ declare var __DEV__: boolean
5
+ /** Признак запуска в режиме тестирования. */
6
+ declare var __TEST__: boolean
@@ -0,0 +1,497 @@
1
+ /** Типы и интерфейсы правил wb-rules */
2
+ declare namespace WbRules {
3
+
4
+ /** Расширение для поддержки module.static */
5
+ type ModuleStatic = Record<string, unknown>
6
+
7
+ type LogFunc = (
8
+ message: string | undefined, ...args: (string | number | boolean)[]
9
+ ) => void
10
+
11
+ interface Log {
12
+ /**
13
+ * Запись в лог информационного сообщения, полезного в долгосрочной перспективе.
14
+ * @param message
15
+ * @param args
16
+ */
17
+ (message: string | undefined, ...args: (string | number | boolean)[]): void
18
+
19
+ /**
20
+ * Запись в лог сообщения, полезного при отладке в процессе разработки и не представляющего ценности в долгосрочной перспективе.
21
+ * @param message
22
+ * @param args
23
+ */
24
+ debug(message: unknown, ...args: (string | number | boolean)[]): void
25
+
26
+ /**
27
+ * Запись в лог информационного сообщения, полезного в долгосрочной перспективе.
28
+ * @param message
29
+ * @param args
30
+ */
31
+ info(message: string | undefined, ...args: (string | number | boolean)[]): void
32
+
33
+ /**
34
+ * Запись ненормального или неожиданного события в потоке приложения, но не прекращение выполнения.
35
+ * @param message
36
+ * @param args
37
+ */
38
+ warning(message: string | undefined, ...args: (string | number | boolean)[]): void
39
+
40
+ /**
41
+ * Запись события остановки выполнения из-за сбоя текущего действия.
42
+ * @param message
43
+ * @param args
44
+ */
45
+ error(message: string | undefined, ...args: (string | number | boolean)[]): void
46
+ }
47
+
48
+ type DevControl = Record<string, unknown>
49
+ type Dev = Record<string, DevControl | undefined>
50
+
51
+ interface Timer {
52
+ firing: boolean
53
+
54
+ stop(): void
55
+ }
56
+
57
+ type TimerCollection = Record<string, Timer>
58
+
59
+ /** Тип значения топика MQTT. */
60
+ type MqttValue = string | number | boolean
61
+
62
+ interface MqttMessage {
63
+ topic: string
64
+ value: MqttValue
65
+ }
66
+
67
+ /**
68
+ * Объект описания правила
69
+ */
70
+ interface RuleOptions {
71
+ /**
72
+ * Поле или список полей, которые необходимо отслеживать
73
+ */
74
+ whenChanged?: string[] | string
75
+
76
+ /**
77
+ * Правило срабатывает, когда значение, возвращаемое функцией, меняется с false на true.
78
+ */
79
+ asSoonAs?(): boolean
80
+
81
+ /**
82
+ * Функция, которая сигнализирует, что правило должно отработать
83
+ */
84
+ when?(): number | boolean
85
+
86
+ /**
87
+ * Функция, которая вызывается при срабатывании правила
88
+ * @param newValue Новое значение
89
+ * @param deviceId Устройство, сгенерировавшее событие
90
+ * @param controlId Поле, по которому произошло событие
91
+ */
92
+ then(
93
+ newValue?: MqttValue,
94
+ deviceId?: string,
95
+ controlId?: string
96
+ ): void
97
+ }
98
+
99
+ enum ControlType {
100
+ SWITCH = 'switch',
101
+ ALARM = 'alarm',
102
+ PUSHBUTTON = 'pushbutton',
103
+ RANGE = 'range',
104
+ RGB = 'rgb',
105
+ TEXT = 'text',
106
+ VALUE = 'value'
107
+ }
108
+
109
+ /**
110
+ * Объект настроек передаваемого в контрол значения.
111
+ */
112
+ interface ControlValueOptions {
113
+ /**
114
+ * Значение контрола
115
+ */
116
+ value: string | number | boolean
117
+
118
+ /**
119
+ * Уведомить правила об изменении значения,
120
+ * по умолчанию - `true`.
121
+ */
122
+ notify?: boolean
123
+ }
124
+
125
+ /**
126
+ * Контрол устройства
127
+ */
128
+ interface Control {
129
+ /**
130
+ * Устанавливает заголовок.
131
+ * @param title
132
+ */
133
+ setTitle(title: string): void
134
+
135
+ /**
136
+ * Устанавливает описание.
137
+ * @param description
138
+ */
139
+ setDescription(description: string): void
140
+
141
+ /**
142
+ * Устанавливает тип значения.
143
+ * @param type Тип значения.
144
+ * @see ControlType
145
+ */
146
+ setType(controlType: ControlType): void
147
+
148
+ setUnits(units: string): void
149
+
150
+ setReadonly(isReadonly: boolean): void
151
+
152
+ setMax(max: number): void
153
+
154
+ setMin(min: number): void
155
+
156
+ setError(order: number): void
157
+
158
+ setValue(value: MqttValue | ControlValueOptions): void
159
+
160
+ getId(): string
161
+
162
+ getTitle(): string
163
+
164
+ getDescription(): string
165
+
166
+ getType(): string
167
+
168
+ getUnits(): string
169
+
170
+ getReadonly(): boolean
171
+
172
+ getMax(): number
173
+
174
+ getMin(): number
175
+
176
+ getError(): string
177
+
178
+ getOrder(): number
179
+
180
+ getValue(): string | number | boolean
181
+ }
182
+
183
+ /**
184
+ * Конфигурация контрола.
185
+ */
186
+ interface ControlOptions {
187
+ /**
188
+ * имя, публикуемое в MQTT-топике
189
+ */
190
+ title?: string
191
+ /**
192
+ * тип, публикуемый в MQTT-топике
193
+ * @see ControlType
194
+ */
195
+ type: string
196
+ /**
197
+ * значение параметра по умолчанию
198
+ */
199
+ value: string | number | boolean
200
+ /**
201
+ * когда задано истинное значение, при запуске контроллера параметр всегда устанавливается в значение по умолчанию.
202
+ * Иначе он будет установлен в последнее сохранённое значение.
203
+ */
204
+ forceDefault?: boolean
205
+ /**
206
+ * когда задано истинное значение, параметр объявляется read-only
207
+ */
208
+ readonly?: boolean
209
+ precision?: number
210
+ /**
211
+ * когда задано истинное значение, при описании контрола в коде фактическое создание его в mqtt происходить
212
+ * не будет до тех пор, пока этому контролу не будет присвоено какое-то значение
213
+ * (например dev[deviceID][controlID] = "string")
214
+ */
215
+ lazyInit?: boolean
216
+ /**
217
+ * Порядок следования полей
218
+ */
219
+ order?: number
220
+ /**
221
+ * для параметра типа range может задавать его максимально допустимое значение
222
+ */
223
+ max?: number
224
+ /**
225
+ * для параметра типа range может задавать его минимально допустимое значение
226
+ */
227
+ min?: number
228
+ }
229
+
230
+ /**
231
+ * Интерфейс устройства
232
+ */
233
+ interface Device {
234
+ getId(): string
235
+
236
+ getCellId(cellName: string): string
237
+
238
+ addControl(cellName: string, description: ControlOptions): void
239
+
240
+ removeControl(cellName: string): void
241
+
242
+ getControl(cellName: string): Control
243
+
244
+ isControlExists(cellName: string): boolean
245
+
246
+ controlsList(): Control[]
247
+
248
+ isVirtual(): boolean
249
+ }
250
+
251
+ type ControlOptionsTree = Record<string, ControlOptions>
252
+
253
+ interface DeviceOptions {
254
+ title: string
255
+ cells: ControlOptionsTree
256
+ }
257
+
258
+ /**
259
+ * Функция, вызываемая при завершении процесса
260
+ * @param exitCode код возврата процесса
261
+ * @param capturedOutput захваченный stdout процесса в виде строки в случае, когда задана опция captureOutput
262
+ * @param capturedErrorOutput захваченный stderr процесса в виде строки в случае, когда задана опция captureErrorOutput
263
+ */
264
+ type ExitCallback = (
265
+ exitCode: number,
266
+ capturedOutput?: string,
267
+ capturedErrorOutput?: string
268
+ ) => void
269
+
270
+ interface SpawnOptions {
271
+ /**
272
+ * Если true, захватить stdout процесса и передать его в виде строки в exitCallback
273
+ */
274
+ captureOutput?: boolean
275
+ /**
276
+ * Если true, захватить stderr процесса и передать его в виде строки в exitCallback.
277
+ * Если данный параметр не задан, то stderr дочернего процесса направляется в stderr процесса wb-rules
278
+ */
279
+ captureErrorOutput?: boolean
280
+ /**
281
+ * Строка, которую следует использовать в качестве содержимого stdin процесса
282
+ */
283
+ input?: string
284
+
285
+ /**
286
+ * Функция, вызываемая при завершении процесса
287
+ */
288
+ exitCallback?: ExitCallback
289
+ }
290
+
291
+ interface ReadConfigOptions {
292
+ logErrorOnNoFile: boolean
293
+ }
294
+
295
+ interface StorageOptions {
296
+ global: boolean
297
+ }
298
+
299
+ type PersistentStorage = new (
300
+ name: string,
301
+ options: StorageOptions
302
+ ) => PersistentStorage
303
+ }
304
+
305
+ declare namespace NodeJS {
306
+ interface Module {
307
+ /**
308
+ * Хранит данные, общие для всех экземпляров данного модуля.
309
+ */
310
+ static: WbRules.ModuleStatic
311
+ }
312
+ }
313
+
314
+ declare var log: WbRules.Log
315
+
316
+ /**
317
+ * Объект доступа к MQTT-топикам устройства
318
+ */
319
+ declare var dev: WbRules.Dev
320
+
321
+ /**
322
+ * Объект доступа к именованным таймерам
323
+ */
324
+ declare var timers: WbRules.TimerCollection
325
+
326
+ /**
327
+ * Создаёт правило обработки.
328
+ * @param ruleName Название правила.
329
+ * @param options Конфигурация правила.
330
+ */
331
+ declare function defineRule(name: string, options: WbRules.RuleOptions): void
332
+ /**
333
+ * Создаёт анонимное правило обработки.
334
+ * @param options Конфигурация правила.
335
+ */
336
+ declare function defineRule(options: WbRules.RuleOptions): void
337
+
338
+ /**
339
+ * Создаёт виртуальное устройство.
340
+ * @param deviceId Идентификатор устройства.
341
+ * @param options Конфигурация устройства.
342
+ */
343
+ declare function defineVirtualDevice(
344
+ deviceId: string,
345
+ options: WbRules.DeviceOptions
346
+ ): WbRules.Device
347
+
348
+ /**
349
+ * Позволяет получить объект для работы с указанным устройством.
350
+ * @param deviceId Идентификатор устройства.
351
+ */
352
+ declare function getDevice(deviceId: string): WbRules.Device | undefined
353
+
354
+ /**
355
+ * Позволяет получить объект для работы с указанным контролом устройства.
356
+ * @param controlPath Строка в формате "deviceId/controlId"
357
+ */
358
+ declare function getControl(controlPath: string): WbRules.Control | undefined
359
+
360
+ /**
361
+ * Запускает периодический таймер с указанным интервалом.
362
+ *
363
+ * К таймеру можно обратиться через `timers.<name>` внутри when при работе с `defineRule`.
364
+ *
365
+ * @param name Идентификатор таймера в глобальном наборе `timers`.
366
+ * @param delay Интервал срабатывания, в миллисекундах
367
+ */
368
+ declare function startTicker(name: string, interval: number): void
369
+
370
+ /**
371
+ * Запускает однократный таймер с указанным именем,
372
+ * к которому можно обратиться через `timers.<name>`,
373
+ *
374
+ * см. [руководство по однократным таймерам](https://github.com/wirenboard/wb-rules?tab=readme-ov-file#однократные)
375
+ *
376
+ * @param name Идентификатор таймера в глобальном наборе `timers`.
377
+ * @param delay
378
+ *
379
+ * Используется при работе с определениями правил:
380
+ *
381
+ * @example
382
+ * ```ts
383
+ * defineRule('1', {
384
+ * asSoonAs: () => dev['test_buzzer/enabled'],
385
+ * then: () => {
386
+ * startTimer('one_second', 1000)
387
+ * dev['buzzer/enabled'] = true
388
+ * }
389
+ * })
390
+ *
391
+ * defineRule('2', {
392
+ * when: () => timers.one_second.firing,
393
+ * then: () => {
394
+ * dev['buzzer/enabled'] = false
395
+ * dev['test_buzzed/enabled'] = false
396
+ * }
397
+ * })
398
+ *
399
+ * ```
400
+ *
401
+ */
402
+ declare function startTimer(name: string, delay: number): void
403
+
404
+ /**
405
+ * Запуск внешних процессов
406
+ * @param cmd
407
+ * @param args
408
+ * @param options
409
+ */
410
+ declare function spawn(
411
+ cmd: string,
412
+ args: string[],
413
+ options: WbRules.SpawnOptions | WbRules.ExitCallback
414
+ ): void
415
+
416
+ declare function runShellCommand(
417
+ command: string,
418
+ options: WbRules.SpawnOptions | WbRules.ExitCallback
419
+ ): void
420
+
421
+ declare function readConfig(
422
+ fileName: string,
423
+ options?: WbRules.ReadConfigOptions
424
+ ): object
425
+
426
+ /**
427
+ *
428
+ * @param alias Альтернативное наименование для контрола.
429
+ * @param controlPath Путь к контролу устройства в формате `deviceId/controlId`
430
+ *
431
+ * @example
432
+ * ```ts
433
+ * defineAlias('heaterOn', 'Relays/Relay 1')
434
+ * ```
435
+ */
436
+ declare function defineAlias(alias: string, controlPath: string): void
437
+
438
+ /**
439
+ * Следует учесть, что функция format и xformat съедают одинарные квадратные скобки!
440
+ * Поэтому, если необходимо их вывести, то нужно дублировать.
441
+ */
442
+ interface String {
443
+ format(...args: (string | number | boolean)[]): string
444
+ xformat(...args: (string | number | boolean)[]): string
445
+ }
446
+
447
+ /**
448
+ * Подписаться на топик (допустимы символы # и +)
449
+ * @param topic
450
+ * @param callback
451
+ */
452
+ declare function trackMqtt(
453
+ topic: string,
454
+ callback: (message: WbRules.MqttMessage) => void
455
+ ): void
456
+
457
+ /**
458
+ * Публикация сообщений в MQTT
459
+ * Важно: не используйте publish() для изменения значения параметров устройств.
460
+ * @param topic
461
+ * @param payload
462
+ * @param QoS
463
+ * @param retain
464
+ */
465
+ declare function publish(
466
+ topic: string,
467
+ value: WbRules.MqttValue,
468
+ QoS?: number,
469
+ retain?: boolean
470
+ ): void
471
+
472
+ /**
473
+ * Класс оповещения
474
+ * @abstract
475
+ */
476
+ declare abstract class Notify {
477
+ /**
478
+ * Отправляет почту указанному адресату
479
+ * @static
480
+ * @param to адресат
481
+ * @param subject тема
482
+ * @param text содержимое
483
+ * @memberof Notify
484
+ */
485
+ static sendEmail(to: string, subject: string, text: string): void
486
+
487
+ /**
488
+ * Отправляет SMS на указанный номер
489
+ * Для отправки SMS используется ModemManager, а если он не установлен, то gammu.
490
+ * @static
491
+ * @param to номер адресата
492
+ * @param text содержимое
493
+ * @param command используя команду
494
+ * @memberof Notify
495
+ */
496
+ static sendSMS(to: string, text: string, command?: string): void
497
+ }