@mirta/globals 0.3.1 → 0.3.3

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/eslint/index.d.ts CHANGED
@@ -2,6 +2,7 @@ declare interface GlobalsMirta {
2
2
  readonly '__DEV__': false
3
3
  readonly '__TEST__': false
4
4
  readonly 'log': false
5
+ readonly 'debug': false
5
6
  readonly 'dev': false
6
7
  readonly 'cron': false
7
8
  readonly 'timers': false
@@ -20,6 +21,7 @@ declare interface GlobalsMirta {
20
21
  readonly 'StorableObject': false
21
22
  readonly 'PersistentStorage': false
22
23
  readonly 'Notify': false
24
+ readonly 'Alarms': false
23
25
  }
24
26
 
25
27
  declare const globals: GlobalsMirta
package/eslint/index.js CHANGED
@@ -2,6 +2,7 @@ export default {
2
2
  '__DEV__': 'readonly',
3
3
  '__TEST__': 'readonly',
4
4
  'log': 'readonly',
5
+ 'debug': 'readonly',
5
6
  'dev': 'readonly',
6
7
  'cron': 'readonly',
7
8
  'timers': 'readonly',
@@ -20,4 +21,5 @@ export default {
20
21
  'StorableObject': 'readonly',
21
22
  'PersistentStorage': 'readonly',
22
23
  'Notify': 'readonly',
24
+ 'Alarms': 'readonly',
23
25
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@mirta/globals",
3
3
  "description": "Complete set of types for wb-rule development in TypeScript",
4
- "version": "0.3.1",
4
+ "version": "0.3.3",
5
5
  "license": "Unlicense",
6
6
  "keywords": [
7
7
  "mirta",
@@ -0,0 +1,276 @@
1
+ declare namespace WbRules {
2
+
3
+ /**
4
+ * Определения типов для сервиса оповещений.
5
+ *
6
+ * @since 0.3.3
7
+ *
8
+ **/
9
+ namespace Alarms {
10
+
11
+ /**
12
+ * Позволяет задать способ оповещения через SMS.
13
+ *
14
+ * @since 0.3.3
15
+ *
16
+ **/
17
+ interface SmsRecipient {
18
+
19
+ /** Конфигурация отправки SMS. */
20
+ type: 'sms'
21
+
22
+ /** Номер телефона получателя SMS. */
23
+ to: string
24
+
25
+ /**
26
+ * Команда для отправки SMS. Поле можно оставить пустым, чтобы использовать gammu.
27
+ *
28
+ * В команде нужно указать как минимум один плейсхолдер `{}` - для номера. Тогда
29
+ * текст будет отправлен в stdin.
30
+ *
31
+ * Если указать 2 плейсхолдера - то в первый запишется номер, во второй - текст.
32
+ *
33
+ * @examples
34
+ * ```sh
35
+ * /path/to/sender.py --number {}
36
+ * ```
37
+ * ```sh
38
+ * /path/to/sender.py --number {} --text "{}"
39
+ * ```
40
+ **/
41
+ command?: string
42
+ }
43
+
44
+ /**
45
+ * Позволяет задать способ оповещения через E-mail.
46
+ *
47
+ * @since 0.3.3
48
+ *
49
+ **/
50
+ interface EmailRecipient {
51
+
52
+ /** Конфигурация отправки на адрес электронной почты. */
53
+ type: 'email'
54
+
55
+ /** Адрес электронной почты получателя. */
56
+ to: string
57
+
58
+ /**
59
+ * Тема письма (необязательное поле).
60
+ *
61
+ * Если в теме письма использовать плейсхолдер `{}`, он заменится на текст сообщения.
62
+ *
63
+ * @example
64
+ * ```txt
65
+ * Alarm: {}
66
+ * ```
67
+ **/
68
+ subject?: string
69
+ }
70
+
71
+ /**
72
+ * Позволяет задать способ оповещения через Telegram.
73
+ *
74
+ * @since 0.3.3
75
+ *
76
+ **/
77
+ interface TelegramRecipient {
78
+
79
+ /** Конфигурация отправки в Telegram. */
80
+ type: 'telegram'
81
+
82
+ /** Токен вашего бота Telegram. */
83
+ token: string
84
+
85
+ /** Уникальный идентификатор целевого чата или username целевого канала (в формате `@channelusername`). */
86
+ chatId: string
87
+ }
88
+
89
+ /**
90
+ * Позволяет настроить один из вариантов
91
+ * оповещения - через SMS, E-Mail или Telegram.
92
+ *
93
+ * Конкретный состав полей меняется в зависимости от значения поля `type`.
94
+ *
95
+ * @since 0.3.3
96
+ *
97
+ **/
98
+ type Recipient = SmsRecipient | EmailRecipient | TelegramRecipient
99
+
100
+ /**
101
+ * Базовый компонент аларма - содержит общие свойства.
102
+ *
103
+ * Используется в составе типа {@link Alarm}.
104
+ *
105
+ * @since 0.3.3
106
+ *
107
+ **/
108
+ interface AlarmBase {
109
+
110
+ /** Название аларма. */
111
+ name: string
112
+
113
+ /** Наблюдаемые устройство и контрол в формате `deviceId/controlId`. */
114
+ cell: string
115
+
116
+ /**
117
+ * Сообщение, отправляемое при срабатывании аларма.
118
+ *
119
+ * Для подстановки текущего значения контрола используется плейсхолдер `{}`.
120
+ *
121
+ * Если сообщение не указано, оно генерируется автоматически на основе
122
+ * текущего значения контрола.
123
+ *
124
+ **/
125
+ alarmMessage?: string
126
+
127
+ /**
128
+ * Сообщение, отправляемое при деактивации аларма.
129
+ *
130
+ * Для подстановки текущего значения контрола используется плейсхолдер `{}`.
131
+ *
132
+ * Если сообщение не указано, оно генерируется автоматически на основе
133
+ * текущего значения контрола.
134
+ *
135
+ **/
136
+ noAlarmMessage?: string
137
+
138
+ /**
139
+ * Интервал (в секундах) повторной отправки сообщения во время активности аларма.
140
+ *
141
+ * Если временной интервал не установлен, сообщения направляются
142
+ * только при срабатывании, а также при деактивации аларма.
143
+ *
144
+ **/
145
+ interval?: number
146
+
147
+ /**
148
+ * Задержка срабатывания аларма (в миллисекундах).
149
+ *
150
+ * Если значение указано, то аларм сработает только когда условие срабатывания
151
+ * будет непрерывно выполняться в течение заданного интервала.
152
+ *
153
+ **/
154
+ alarmDelayMs?: number
155
+
156
+ /**
157
+ * Задержка деактивации аларма (в миллисекундах).
158
+ *
159
+ * Если значение указано, то аларм будет деактивирован только когда условие срабатывания
160
+ * прекратит непрерывно выполняться в течение заданного интервала.
161
+ *
162
+ **/
163
+ noAlarmDelayMs?: number
164
+
165
+ /**
166
+ * Максимальное количество отправленных сообщений.
167
+ *
168
+ * Если указано, то за каждый период срабатывания аларма
169
+ * отправляется не больше заданного количества сообщений.
170
+ *
171
+ **/
172
+ maxCount?: number
173
+ }
174
+
175
+ /**
176
+ * Компонент аларма, реализующий возможность контроля за соответствием указанному значению.
177
+ *
178
+ * Используется в составе типа {@link Alarm}.
179
+ *
180
+ * @since 0.3.3
181
+ *
182
+ **/
183
+ interface ValueAlarm {
184
+
185
+ /**
186
+ * Ожидаемое значение.
187
+ *
188
+ * Аларм сработает, если значение контрола отличается от `expectedValue`.
189
+ *
190
+ * Когда значение контрола снова становится равным `expectedValue`,
191
+ * аларм деактивируется.
192
+ *
193
+ **/
194
+ expectedValue: MqttValue
195
+ }
196
+
197
+ /**
198
+ * Компонент аларма, реализующий возможность контроля за соответствием
199
+ * значения контрола допустимому диапазону.
200
+ *
201
+ * Используется в составе типа {@link Alarm}.
202
+ *
203
+ * @since 0.3.3
204
+ *
205
+ **/
206
+ interface RangeAlarm {
207
+
208
+ /**
209
+ * Сервисное поле.
210
+ *
211
+ * Предотвращает смешивание с {@link ValueAlarm} внутри обобщённого типа {@link Alarm}.
212
+ *
213
+ **/
214
+ expectedValue: never
215
+
216
+ /**
217
+ * Минимально допустимое значение.
218
+ *
219
+ * Если отслеживаемое значение контрола опускается ниже minValue, происходит срабатывание аларма.
220
+ *
221
+ **/
222
+ minValue: number
223
+
224
+ /**
225
+ * Максимально допустимое значение.
226
+ *
227
+ * Если отслеживаемое значение контрола поднимается выше maxValue, происходит срабатывание аларма.
228
+ *
229
+ **/
230
+ maxValue: number
231
+ }
232
+
233
+ /**
234
+ * Позволяет задать устройство и контрол для отслеживания, а также настроить параметры реагирования.
235
+ *
236
+ * @since 0.3.3
237
+ *
238
+ **/
239
+ type Alarm = AlarmBase & (ValueAlarm | AtLeastOne<RangeAlarm>)
240
+
241
+ /**
242
+ * Конфигурация блока алармов.
243
+ *
244
+ * @since 0.3.3
245
+ *
246
+ **/
247
+ interface Config {
248
+
249
+ /** Название MQTT-устройства блока алармов. */
250
+ deviceName: string
251
+
252
+ /** Отображаемое название устройства блока алармов. */
253
+ deviceTitle: string
254
+
255
+ /** Список получателей. */
256
+ recipients: Recipient[]
257
+
258
+ /** Список алармов. */
259
+ alarms: Alarm[]
260
+ }
261
+ }
262
+
263
+ /**
264
+ * Интерфейс для типизации сервиса оповещений.
265
+ *
266
+ **/
267
+ interface Alarms {
268
+
269
+ /**
270
+ * Загружает конфигурацию для блока алармов.
271
+ *
272
+ * @param config Объект конфигурации или путь к файлу конфигурации в формате JSON.
273
+ */
274
+ load(config: string | Alarms.Config): void
275
+ }
276
+ }
@@ -1,3 +1,5 @@
1
+ /// <reference path="./wb-rules/alarms.d.ts" />
2
+
1
3
  /**
2
4
  * Используется для нормализации составных типов.
3
5
  *
@@ -16,56 +18,147 @@
16
18
  * // }
17
19
  * ```
18
20
  * @since 0.0.4
21
+ *
19
22
  **/
20
23
  declare type Expand<T> = { [K in keyof T]: T[K] } & {}
21
24
 
25
+ /**
26
+ * Разрешает частичное заполнение полей объекта, но требует наличия хотя бы одного поля.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * interface SafeRange {
31
+ * minValue: number
32
+ * maxValue: number
33
+ * }
34
+ *
35
+ * // Корректное объявление
36
+ * const a: AtLeastOne<SafeRange> = {
37
+ * minValue: 0
38
+ * }
39
+ *
40
+ * // Ошибка - требуется хотя бы одно из обязательных полей
41
+ * const b: AtLeastOne<SafeRange> = { }
42
+ * ```
43
+ * @since 0.3.3
44
+ *
45
+ **/
46
+ declare type AtLeastOne<T, U = { [K in keyof T]: Pick<T, K> }> = Partial<T> & U[keyof U]
47
+
22
48
  /** Типы и интерфейсы правил wb-rules */
23
49
  declare namespace WbRules {
24
50
 
25
51
  /** Расширение для поддержки module.static */
26
52
  type ModuleStatic = Record<string, unknown>
27
53
 
28
- type LogFunc = (
29
- message: string | undefined, ...args: (string | number | boolean)[]
30
- ) => void
54
+ /**
55
+ * Набор методов для логирования.
56
+ *
57
+ * @since 0.3.2
58
+ *
59
+ **/
60
+ interface LogMethods {
31
61
 
32
- interface Log {
33
62
  /**
34
63
  * Запись в лог информационного сообщения, полезного в долгосрочной перспективе.
35
- * @param message
36
- * @param args
37
- */
38
- (message: string | undefined, ...args: (string | number | boolean)[]): void
64
+ * Используется форматированный вывод.
65
+ *
66
+ * @param format Форматируемый шаблон сообщения.
67
+ * @param args Параметры для заполнения формата.
68
+ *
69
+ * @example
70
+ * ```ts
71
+ * log.info('Свет в комнате включён на {} мин.', 30)
72
+ * ```
73
+ **/
74
+ info(format: string, ...args: unknown[]): void
39
75
 
40
76
  /**
41
- * Запись в лог сообщения, полезного при отладке в процессе разработки и не представляющего ценности в долгосрочной перспективе.
42
- * @param message
43
- * @param args
44
- */
45
- debug(message: unknown, ...args: (string | number | boolean)[]): void
77
+ * Запись в лог произвольного значения, полезного в долгосрочной перспективе.
78
+ * @param value Значение для записи в лог.
79
+ *
80
+ **/
81
+ info(value: unknown): void
46
82
 
47
83
  /**
48
- * Запись в лог информационного сообщения, полезного в долгосрочной перспективе.
49
- * @param message
50
- * @param args
51
- */
52
- info(message: string | undefined, ...args: (string | number | boolean)[]): void
84
+ * Запись в лог сообщения, полезного при отладке и не имеющего долгосрочной ценности.
85
+ *
86
+ * @param format Форматируемый шаблон сообщения.
87
+ * @param args Параметры для заполнения формата.
88
+ *
89
+ * @example
90
+ * ```ts
91
+ * log.debug('Значение сенсора "{}": температура {} °C, влажность {} %', 'bathroom', 25, 40)
92
+ **/
93
+ debug(format: string, ...args: unknown[]): void
53
94
 
54
95
  /**
55
- * Запись ненормального или неожиданного события в потоке приложения, но не прекращение выполнения.
56
- * @param message
57
- * @param args
58
- */
59
- warning(message: string | undefined, ...args: (string | number | boolean)[]): void
96
+ * Запись в лог произвольного значения, полезного при отладке и не имеющего долгосрочной ценности.
97
+ *
98
+ * @param value Значение для записи в лог.
99
+ *
100
+ * @example
101
+ * ```ts
102
+ * log.debug(JSON.stringify({ location: 'bathroom', temperature: 25, humidity: 40 }))
103
+ * ```
104
+ **/
105
+ debug(value: unknown): void
60
106
 
61
107
  /**
62
- * Запись события остановки выполнения из-за сбоя текущего действия.
63
- * @param message
64
- * @param args
65
- */
66
- error(message: string | undefined, ...args: (string | number | boolean)[]): void
108
+ * Запись в лог предупреждения о ненормальном или неожиданном событии,
109
+ * не приводящем к остановке программы.
110
+ *
111
+ * Используется форматированный вывод.
112
+ *
113
+ * @param format Форматируемый шаблон сообщения.
114
+ * @param args Параметры для заполнения формата.
115
+ *
116
+ * @example
117
+ * ```ts
118
+ * log.warning('Движение в охраняемой зоне: {}', 'hallway_sensor_1')
119
+ * ```
120
+ **/
121
+ warning(format: string, ...args: unknown[]): void
122
+
123
+ /**
124
+ * Запись в лог предупреждения о ненормальном или неожиданном значении,
125
+ * не приводящем к остановке программы.
126
+ *
127
+ * @param value Значение для записи в лог.
128
+ *
129
+ **/
130
+ warning(value: unknown): void
131
+
132
+ /**
133
+ * Запись в лог критического события, приведшего к сбою и остановке выполнения.
134
+ * Используется форматированный вывод.
135
+ *
136
+ * @param format Форматируемый шаблон сообщения.
137
+ * @param args Параметры для заполнения формата.
138
+ *
139
+ * @example
140
+ * ```ts
141
+ * log.error('Перегев тёплого пола: {} °C, выключение', 30)
142
+ * ```
143
+ **/
144
+ error(format: string, ...args: unknown[]): void
145
+
146
+ /**
147
+ * Запись в лог критического значения, приведшего к сбою и остановке выполнения.
148
+ *
149
+ * @param value Значение для записи в лог.
150
+ *
151
+ **/
152
+ error(value: unknown): void
67
153
  }
68
154
 
155
+ /** @deprecated since version 0.3.2 */
156
+ type LogFunc = (format: string, ...args: unknown[]) => void
157
+
158
+ type Log = LogMethods['info'] & LogMethods
159
+
160
+ type Debug = LogMethods['debug']
161
+
69
162
  interface CronEntry {
70
163
  spec: string
71
164
  }
@@ -384,6 +477,62 @@ declare namespace WbRules {
384
477
  order?: number
385
478
  }>
386
479
 
480
+ /**
481
+ * Опции контрола типа `text`.
482
+ *
483
+ * @since 0.3.2
484
+ *
485
+ **/
486
+ type TextControlOptions = Extract<ControlOptions, { type: 'text' }>
487
+
488
+ /**
489
+ * Опции контрола типа `value`.
490
+ *
491
+ * @since 0.3.2
492
+ *
493
+ **/
494
+ type ValueControlOptions = Extract<ControlOptions, { type: 'value' }>
495
+
496
+ /**
497
+ * Опции контрола типа `range`.
498
+ *
499
+ * @since 0.3.2
500
+ *
501
+ **/
502
+ type RangeControlOptions = Extract<ControlOptions, { type: 'range' }>
503
+
504
+ /**
505
+ * Опции контрола типа `switch`.
506
+ *
507
+ * @since 0.3.2
508
+ *
509
+ **/
510
+ type SwitchControlOptions = Extract<ControlOptions, { type: 'switch' }>
511
+
512
+ /**
513
+ * Опции контрола типа `pushbutton`.
514
+ *
515
+ * @since 0.3.2
516
+ *
517
+ **/
518
+ type PushButtonControlOptions = Extract<ControlOptions, { type: 'pushbutton' }>
519
+
520
+ /**
521
+ * Опции контрола типа `rgb`.
522
+ *
523
+ * @since 0.3.2
524
+ *
525
+ **/
526
+ type RgbControlOptions = Extract<ControlOptions, { type: 'rgb' }>
527
+
528
+ /**
529
+ * Опции контрола типа `alarm`.
530
+ *
531
+ * @since 0.3.2
532
+ *
533
+ **/
534
+ type AlarmControlOptions = Extract<ControlOptions, { type: 'alarm' }>
535
+
387
536
  /**
388
537
  * Интерфейс устройства
389
538
  */
@@ -476,6 +625,41 @@ declare namespace WbRules {
476
625
  interface StorageOptions {
477
626
  global: boolean
478
627
  }
628
+
629
+ interface Notify {
630
+ /**
631
+ * Отправляет электронное письмо указанному адресату.
632
+ *
633
+ * @param to Адресат.
634
+ * @param subject Тема письма.
635
+ * @param text Текст письма.
636
+ *
637
+ **/
638
+ sendEmail(to: string, subject: string, text: string): void
639
+
640
+ /**
641
+ * Отправляет SMS на указанный номер
642
+ * Для отправки SMS используется ModemManager, а если он не установлен, то gammu.
643
+ *
644
+ * @param to Номер адресата.
645
+ * @param text Текст сообщения.
646
+ * @param command Используя команду.
647
+ *
648
+ **/
649
+ sendSMS(to: string, text: string, command?: string): void
650
+
651
+ /**
652
+ * Отправляет сообщение в указанный чат или канал Telegram.
653
+ *
654
+ * @param token Токен вашего бота Telegram.
655
+ * @param chatId Уникальный идентификатор целевого чата или username целевого канала (в формате `@channelusername`).
656
+ * @param text Текст сообщения.
657
+ *
658
+ * @since 0.3.2
659
+ *
660
+ **/
661
+ sendTelegramMessage(token: string, chatId: string, text: string): void
662
+ }
479
663
  }
480
664
 
481
665
  declare namespace NodeJS {
@@ -495,6 +679,14 @@ declare var __filename: string
495
679
  /** Используется для вывода сообщений в журнал контроллера и отладочную консоль. */
496
680
  declare var log: WbRules.Log
497
681
 
682
+ /**
683
+ * Используется для вывода отладочных сообщений в журнал контроллера и отладочную консоль.
684
+ *
685
+ * @since 0.3.2
686
+ *
687
+ **/
688
+ declare var debug: WbRules.Debug
689
+
498
690
  /** Объект доступа к MQTT-топикам устройства. */
499
691
  declare var dev: WbRules.Dev
500
692
 
@@ -730,28 +922,34 @@ declare class PersistentStorage {
730
922
  }
731
923
 
732
924
  /**
733
- * Класс оповещения
734
- * @abstract
735
- */
736
- declare abstract class Notify {
737
- /**
738
- * Отправляет почту указанному адресату
739
- * @static
740
- * @param to адресат
741
- * @param subject тема
742
- * @param text содержимое
743
- * @memberof Notify
744
- */
745
- static sendEmail(to: string, subject: string, text: string): void
925
+ * Сервис уведомлений Notify — инструмент для отправки произвольных
926
+ * сообщений по разным каналам коммуникации (почта, SMS, Telegram).
927
+ *
928
+ **/
929
+ declare var Notify: WbRules.Notify
746
930
 
747
- /**
748
- * Отправляет SMS на указанный номер
749
- * Для отправки SMS используется ModemManager, а если он не установлен, то gammu.
750
- * @static
751
- * @param to номер адресата
752
- * @param text содержимое
753
- * @param command используя команду
754
- * @memberof Notify
755
- */
756
- static sendSMS(to: string, text: string, command?: string): void
757
- }
931
+ /**
932
+ * Сервис оповещений Alarms инструмент для автоматической отправки
933
+ * шаблонных сообщений по разным каналам коммуникации (почта, SMS, Telegram)
934
+ * при обнаружении отклонения от нормы в значениях отслеживаемых контролов.
935
+ *
936
+ * @example
937
+ * Загрузка конфигурации из JSON-файла:
938
+ * ```ts
939
+ * Alarms.load('/etc/wb-rules/alarms.conf')
940
+ * ```
941
+ * @example
942
+ * Непосредственная настройка блока алармов через объект конфигурации:
943
+ * ```ts
944
+ * Alarms.load({
945
+ * deviceName: 'example_alarms',
946
+ * deviceTitle: 'Example Alarms',
947
+ * recipients: [],
948
+ * alarms: []
949
+ * })
950
+ * ```
951
+ *
952
+ * @since 0.3.3
953
+ *
954
+ **/
955
+ declare var Alarms: WbRules.Alarms