Version 1.2 by admin on 2026/05/30 23:27

Hide last authors
pugachevskaya_elena 1.1 1 (% style="text-align: left;" %)
2 Одной из отличительных особенностей всех продуктов комплекса НЕЙРОСС и, в частности, IP-контроллеров [[БОРЕЙ>>doc:borey3.WebHome]] и других является возможность модификации и расширения алгоритмов работы продукта посредством //скриптов автоматизации//. С помощью скрипта возможно, например, изменить или полностью заменить алгоритм доступа в контроллере БОРЕЙ. Или реализовать логику сопряжения со внешней информационной системой по протоколу HTTP. Или управлять исполнительными устройствами по заданному алгоритму.
3
4 (% style="text-align: left;" %)
5 В данном документе приведены общие сведения о скриптах автоматизации, их возможностях и руководство программиста по написанию таких скриптов.
6
7 {{info title="ВНИМАНИЕ"}}
8 Скрипт автоматизации может существенно изменить «заводскую» логику работы продукта. Потому разработку скрипта рекомендуется проводить только опытному пользователю. Производитель продукта не несёт ответственности за несоответствие реальных и заявленных свойств продукта в случае, если такое расхождение возникло вследствие внесения изменений в скрипт автоматизации.
9 {{/info}}
10
11 (% style="text-align: left;" %)
12 == {{id name="РуководствопоскриптамLua-Оглавление"/}}Оглавление ==
13
14 {{toc depth="4"/}}
15
16 (% style="text-align: left;" %)
17 == {{id name="РуководствопоскриптамLua-Общиесведения"/}}Общие сведения ==
18
19 (% style="text-align: left;" %)
20 Скрипт автоматизации — текстовый сценарий, выполнение которого осуществляется программными средствами продукта.
21
22 (% style="text-align: left;" %)
23 Данный сценарий всегда один. Он может быть пустым — в таком случае скрипт не делает ничего. В скрипте могут быть команды управления — они выполняются по мере выполнения скрипта.
24
25 (% style="text-align: left;" %)
26 Скрипт автоматизации должен быть написан на [[языке Lua>>url:http://www.lua.org/||shape="rect"]] (версия 5.1). Разработчику доступны стандартные средства языка (операторы, структуры данных и др.), часть функций стандартной библиотеки (см. далее), а также наборы констант и функций, определённых в //прикладных Lua-модулях //продукта. Прикладные Lua-модули специально разработаны для упрощения написания скриптов и двустороннего взаимодействия с программными средствами продукта — чтобы можно было из скрипта вызывать какие-либо функции продукта или, наоборот, передавать управление в скрипт в процессе функционирования продукта.
27
28 {{info}}
29 В разных продуктах могут быть доступны разные прикладные модули. Так, модуль управления доступом {{code language="none"}}pacs.lua{{/code}} недоступен (не работает) в ИГНИС и, наоборот, функции ИГНИС в модуле {{code language="none"}}ignis.lua{{/code}} не работают в контроллере БОРЕЙ.
30 {{/info}}
31
32 (% style="text-align: left;" %)
33 Скрипт автоматизации выполняется в «песочнице» — защищённом окружении. Если в ходе работы скрипта возникает ошибка, то выполнение скрипта просто прерывается — нарушается работа функций, так или иначе связанных со скриптами (например, алгоритмов доступа), НО общая работоспособность продукта сохраняется, на стабильность работы программных средств поведение скрипта не влияет.
34
35 {{error title="ВНИМАНИЕ"}}
36 В случае IP-контроллеров (БОРЕЙ, ИГНИС и пр.) скрипт автоматизации является изменяемыми данными также, как любые другие конфигурационные данные продукта (как, например, настройки сетевых интерфейсов или параметры доступа). Потому после внесения изменений в скрипт, успешной отладки и апробации сценария ОБЯЗАТЕЛЬНО создавайте резервную копию. Резервная копия будет содержать скрипт автоматизации, и в случае, если файловая система на SD-карте вдруг будет повреждена, скрипт будет восстановлен вместе с остальными конфигурационными данными из резервной копии.
37 {{/error}}
38
39 (% style="text-align: left;" %)
40 == {{id name="РуководствопоскриптамLua-Какредактироватьскрипт"/}}Как редактировать скрипт ==
41
42 (% style="text-align: left;" %)
43 Для удобство редактирования и отладки скрипта автоматизации предназначен текстовый online-редактор, доступный в наших продуктах по адресу {{code language="none"}}http://[ip-address]/lua-editor/{{/code}} или ##http:~/~/[ip-address]/(% style="color: rgb(51,51,51);" %)internal/(%%)lua-editor/##.
44
45 (% style="text-align: left;" %)
46 1. В левом блоке — текст скрипта автоматизации. Внесите в него изменения, для сохранения нажмите на кнопку «Сохранить» внизу.
47 1. В правом блоке можно просматривать lua-код модулей и сниппеты — примеры скриптов автоматизации. Для просмотра сниппета или модуля выберите его в раскрывающемся списке под правым блоком.
48 11. Lua-код модулей обычно содержит определение констант, структур, функций, а также обеспечивает удобную для разработчика «обёртку» на доступными функциями основных программных средств.
49 **ЗАМЕЧАНИЕ**: в списке обычно можно посмотреть Lua-код всех модулей всех продуктов, их можно подключить к скрипту автоматизации, но фактически «отсутствующий» модуль просто не будет работать.
50 11. Сниппеты — блоки кода, из которых можно почерпнуть идеи при разработке скрипта. Или можно скопировать «куски» сниппета в свой скрипт. Библиотека сниппетов постоянно пополняется разработчиками с добавлением примеров создания скриптов автоматизации.
51 1. При сохранении скрипта автоматизации выполнение текущего скрипта будет автоматически прервано. После чего будет запущен новый скрипт.
52
53 {{error title="ВНИМАНИЕ"}}
54 При сохранении скрипта автоматизации полностью перезапускается вся виртуальная Lua-машина, в следствие чего перезапускаются и системные Lua-скрипты — такие, например, как алгоритмы управления доступом и другие.
55 {{/error}}
56
57 (% style="text-align: left;" %)
58 Скриншот редактора скриптов приведён на изображении ниже.
59
60 (% style="text-align: left;" %)
61 [[image:attach:lua-editor.png||queryparams="effects=border-simple,shadow-kn" height="250"]]
62
63 (% style="text-align: left;" %)
64 == {{id name="РуководствопоскриптамLua-Какотлаживатьскрипт"/}}Как отлаживать скрипт ==
65
66 (% style="text-align: left;" %)
67 Сообщения об ошибках в Lua-скрипте, а также отладочные сообщения, выводимые из скрипта с помощью модуля log.lua, записываются в журнал аудита. Просмотр этих сообщений в реальном времени возможен при помощи веб-приложения «Журнал аудита», доступного с веб-страницы Рабочий стол.
68
69 (% style="text-align: left;" %)
70 1. Авторизуйтесь в веб-интерфейсе и перейдите на Рабочий стол.
71 1. Перейдите в веб-приложение «Журнал аудита».
72 1. На второй вкладке «Фильтры» выберите в списке логгер web.
73 1. В настройках фильтрации укажите следующие строки (первая строка:
74 11. {{code language="none"}}* — OFF{{/code}}
75 11. {{code language="none"}}LuaManager — DEBUG{{/code}}
76 11. {{code language="none"}}lua_scall — DEBUG{{/code}}
77 11. {{code language="none"}}neyross::LogLuaModule — DEBUG{{/code}}
78 1. Пример корректно настроенного логгера:
79 [[image:attach:log-configuration.png||queryparams="effects=border-simple,shadow-kn" height="250"]]
80 1. Перейдите на третью вкладку «Живой журнал».
81 1. Установите флаги DEBUG, INFO, WARN, ERROR для вывода сообщений всех возможностей уровней тревожности.
82 [[image:attach:log-levels.png]]
83 1. При выполнении Lua-скрипта на странице будут появляться соответствующие сообщения. Более свежие сообщения выводятся сверху.
84 [[image:attach:log-preview.png||queryparams="effects=border-simple,shadow-kn" height="250"]]
85
86 (% style="text-align: left;" %)
87 == {{id name="РуководствопоскриптамLua-Руководстворазработчика"/}}Руководство разработчика ==
88
89 (% style="text-align: left;" %)
90 === {{id name="РуководствопоскриптамLua-ОбщиесведенияоLua"/}}Общие сведения о Lua ===
91
92 (% style="text-align: left;" %)
93 Скрипт автоматизации должен быть написан на языке Lua версии 5.1.
94
95 (% style="text-align: left;" %)
96 Официальный сайт языка Lua (на английском языке) — [[http:~~/~~/www.lua.org/>>url:http://www.lua.org/||shape="rect"]]
97
98 (% style="text-align: left;" %)
99 Официальная документация по языку Lua версии 5.1 — [[http:~~/~~/www.lua.org/manual/5.1/>>url:http://www.lua.org/manual/5.1/||shape="rect"]] (английский язык)
100
101 (% style="text-align: left;" %)
102 Перевод документации по языку Lua версии 5.1 на русский язык: [[http:~~/~~/www.lua.ru/doc/>>url:http://www.lua.ru/doc/||shape="rect"]]
103
104 (% style="text-align: left;" %)
105 Также можно ознакомиться с документацией на русском языке для последней актуальной версии Lua (5.3 на момент написания статьи) по ссылке (% class="nolink" %)http:~/~/lua.org.ru/contents_ru.html(%%). Большая часть содержимого также актуальна и для версии 5.1, поддерживаемой продуктами НЕЙРОСС.
106
107 (% style="text-align: left;" %)
108 === {{id name="РуководствопоскриптамLua-Ограничениястандартнойбиблиотеки"/}}Ограничения стандартной библиотеки ===
109
110 (% style="text-align: left;" %)
111 В скриптах автоматизации доступны следующие разделы стандартной библиотеки:
112
113 (% style="text-align: left;" %)
114 * Basic Functions
115 * Coroutine Manipulation
116 * Modules
117 * String Manipulation
118 * Table Manipulation
119 * Mathematical Functions
120
121 (% style="text-align: left;" %)
122 Следующие разделы недоступны (не могут быть использованы) в скрипте автоматизации:
123
124 (% style="text-align: left;" %)
125 * Input and Output Facilities
126 * Operating System Facilities
127
128 (% style="text-align: left;" %)
129 === {{id name="РуководствопоскриптамLua-ПрикладныеLua-модули"/}}Прикладные Lua-модули ===
130
131 (% style="text-align: left;" %)
132 В таблице ниже перечислены прикладные модули, их описание и продукты, в которых эти модули могут быть использованы.
133
134 (% class="wrapped" style="text-align: left;" %)
135 |=(% style="text-align: left;" %)(((
136 Модуль
137 )))|=(% style="text-align: left;" %)(((
138 Продукты
139 )))|=(% style="text-align: left;" %)(((
140 Краткое описание
141 )))
142 |(% style="text-align: left;" %)(((
143 [[#alarm.lua>>doc:||anchor="РуководствопоскриптамLua-alarm.lua"]]
144 )))|(% style="text-align: left;" %)(((
145 БОРЕЙ
146 ЯРС
147 )))|(% style="text-align: left;" %)(((
148 Модуль интеграции с подсистемой охранно-тревожной сигнализации контроллера.
149 )))
150 |(% style="text-align: left;" %)(((
151 [[#common.lua>>doc:||anchor="РуководствопоскриптамLua-common.lua"]]
152 )))|(% style="text-align: left;" %)(((
153 Все продукты
154 )))|(% style="text-align: left;" %)(((
155 Модуль общесистемных функций. Получение системных даты / времени, генерация UUID-ов и так далее.
156 )))
157 |(% style="text-align: left;" %)(((
158 [[#deviceio.lua>>doc:||anchor="РуководствопоскриптамLua-deviceio.lua"]]
159 )))|(% style="text-align: left;" %)(((
160 БОРЕЙ
161 ЯРС
162 )))|(% style="text-align: left;" %)(((
163 \\
164 )))
165 |(% style="text-align: left;" %)(((
166 [[#fec.lua>>doc:||anchor="РуководствопоскриптамLua-fec.lua"]]
167 )))|(% style="text-align: left;" %)(((
168 БОРЕЙ
169 ЯРС
170 )))|(% style="text-align: left;" %)(((
171 Модуль взаимодействия с периферией на контроллерах БОРЕЙ и ЯРС.
172
173 Модуль позволяет:
174
175 1. Получать состояние входов.
176 1. Управлять выходами (рекомендуется управлять выходами через deviceio-сервис).
177 1. Управлять светодиодной и звуковой индикацией на Wiegand-считывателях.
178 )))
179 |(% style="text-align: left;" %)(((
180 [[#http.lua>>doc:||anchor="РуководствопоскриптамLua-http.lua"]]
181 )))|(% style="text-align: left;" %)(((
182 Все продукты
183 )))|(% style="text-align: left;" %)(((
184 Модуль поддержки HTTP-протокола; модуль позволяет:
185
186 1. Отправлять HTTP-запросы на указанный адрес.
187 1. Асинхронно обрабатывать ответы на отправленные ранее HTTP-запросы.
188 )))
189 |(% style="text-align: left;" %)(((
190 [[#ignis.lua>>doc:||anchor="РуководствопоскриптамLua-ignis.lua"]]
191 )))|(% style="text-align: left;" %)(((
192 ИГНИС
193 )))|(% style="text-align: left;" %)(((
194 \\
195 )))
196 |(% style="text-align: left;" %)(((
197 [[#log.lua>>doc:||anchor="РуководствопоскриптамLua-log.lua"]]
198 )))|(% style="text-align: left;" %)(((
199 Все продукты
200 )))|(% style="text-align: left;" %)(((
201 Модуль аудита позволяет выводить в журнал аудита текстовые сообщения с заданным уровнем логирования
202 )))
203 |(% style="text-align: left;" %)(((
204 [[longate.lua>>doc:||anchor="РуководствопоскриптамLua-lon"]]
205 )))|(% style="text-align: left;" %)(((
206 ЯРС
207 )))|(% style="text-align: left;" %)(((
208 \\
209 )))
210 |(% style="text-align: left;" %)(((
211 [[#loninput.lua>>doc:||anchor="РуководствопоскриптамLua-loninput.lua"]]
212 )))|(% style="text-align: left;" %)(((
213 ЯРС
214 )))|(% style="text-align: left;" %)(((
215 \\
216 )))
217 |(% style="text-align: left;" %)(((
218 [[#lonpacs.lua>>doc:||anchor="РуководствопоскриптамLua-lonpacs.lua"]]
219 )))|(% style="text-align: left;" %)(((
220 ЯРС
221 )))|(% style="text-align: left;" %)(((
222 \\
223 )))
224 |(% style="text-align: left;" %)(((
225 [[#pacs.lua>>doc:||anchor="РуководствопоскриптамLua-pacs.lua"]]
226 )))|(% style="text-align: left;" %)(((
227 БОРЕЙ
228 ЯРС
229 )))|(% style="text-align: left;" %)(((
230 Модуль интеграции с подсистемой доступа в контроллерах БОРЕЙ, ЯРС.
231
232 Модуль позволяет реализовать свой алгоритм доступа вместо предустановленного или внести изменения в стандартные алгоритмы, переопределив отдельные части алгоритма.
233 )))
234 |(% style="text-align: left;" %)(((
235 [[#storage.lua>>doc:||anchor="РуководствопоскриптамLua-storage.lua"]]
236 )))|(% style="text-align: left;" %)(((
237 Все продукты
238 )))|(% style="text-align: left;" %)(((
239 Модуль для долговременного сохранения настроек / параметров скрипта автоматизации в форме ключ=значение
240 )))
241 |(% style="text-align: left;" %)(((
242 [[#tenso.lua>>doc:||anchor="РуководствопоскриптамLua-tenso.lua"]]
243 )))|(% style="text-align: left;" %)(((
244 \\
245 )))|(% style="text-align: left;" %)(((
246 \\
247 )))
248 |(% style="text-align: left;" %)(((
249 [[#timer.lua>>doc:||anchor="РуководствопоскриптамLua-timer.lua"]]
250 )))|(% style="text-align: left;" %)(((
251 Все продукты
252 )))|(% style="text-align: left;" %)(((
253 (% class="content-wrapper" %)
254 (((
255 Асинхронное выполнение отложенных по времени или периодических действий.
256
257 {{info}}
258 Для данного модуля отсутствует lua-файл, соответствующий код недоступен для просмотра в веб-редакторе скрипта автоматизации.
259 {{/info}}
260 )))
261 )))
262 |(% style="text-align: left;" %)(((
263 [[#terminal.lua>>doc:||anchor="РуководствопоскриптамLua-terminal.lua"]]
264 )))|(% style="text-align: left;" %)(((
265 \\
266 )))|(% style="text-align: left;" %)(((
267 \\
268 )))
269
270 (% style="text-align: left;" %)
271 \\
272
273 {{info title="СОВЕТ"}}
274 Каждый прикладной Lua-модуль обычно сопровождается соответствующим lua-файлом, который можно просматривать в правой части веб-редактора скрипта автоматизации. В таких lua-файлах каждая функция, константа или перечисление обычно сопровождаются подробными комментариями с указанием назначения и способа использования соответствующего кода.
275 {{/info}}
276
277 (% style="text-align: left;" %)
278 Подключение прикладного Lua-модуля осуществляется функцией require. Рекомендуемая форма использования:
279
280 {{code}}
281 local log = require("log")
282 {{/code}}
283
284 (% style="text-align: left;" %)
285 Вызвать функцию Lua-модуля в таком случае можно следующим образом, например:
286
287 {{code}}
288 local logger = log.get_logger("MyLogger")
289 {{/code}}
290
291 (% style="text-align: left;" %)
292 ==== {{id name="РуководствопоскриптамLua-alarm.lua"/}}alarm.lua ====
293
294 (% style="text-align: left;" %)
295 Описание временно недоступно.
296
297 (% style="text-align: left;" %)
298 ==== {{id name="РуководствопоскриптамLua-common.lua"/}}common.lua ====
299
300 (% style="text-align: left;" %)
301 Данный модуль предоставляет общесистемные функции. Перечень функций приведён в таблице ниже.
302
303 (% class="wrapped" style="text-align: left;" %)
304 |=(% style="text-align: left;" %)(((
305 Функция
306 )))|=(% style="text-align: left;" %)(((
307 Аргументы
308 )))|=(% style="text-align: left;" %)(((
309 Результат
310 )))|=(% style="text-align: left;" %)(((
311 Описание
312 )))
313 |(% style="text-align: left;" %)(((
314 {{code language="none"}}
315 now()
316 {{/code}}
317 )))|(% style="text-align: left;" %)(((
318 нет
319 )))|(% style="text-align: left;" %)(((
320 число с плавающей точкой
321 )))|(% style="text-align: left;" %)(((
322 Возвращает число с плавающей точкой, соответствующее количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд)
323 )))
324 |(% style="text-align: left;" %)(((
325 {{code language="none"}}
326 uuid()
327 {{/code}}
328 )))|(% style="text-align: left;" %)(((
329 нет
330 )))|(% style="text-align: left;" %)(((
331 строка
332 )))|(% style="text-align: left;" %)(((
333 Генерирует уникальный идентификатор по стандарту ISO. Возвращает строковое представление идентификатора, например:
334
335 {{code language="none"}}
336 550e8400-e29b-41d4-a716-446655440000
337 {{/code}}
338 )))
339 |(((
340 {{code language="none"}}
341 localtime(t)
342 {{/code}}
343 )))|(((
344 число
345 )))|(((
346 таблица Lua
347 )))|(((
348 Для переданного числа возвращает структуру данных с полями для года, месяца, дня и так далее.
349
350 В аргументе передать число с плавающей точкой, соответствующее количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд).
351
352 Структура данных соответствует {{code language="none"}}tm{{/code}} (POSIX), см. (% class="nolink" %)https:~/~/linux.die.net/man/3/localtime_r(%%), к структуре добавлено поле {{code language="none"}}ms{{/code}} с количеством миллисекунд.
353 )))
354 |(((
355 {{code language="none"}}
356 mktime(tm)
357 {{/code}}
358 )))|(((
359 таблица Lua
360 )))|(((
361 число
362 )))|(((
363 Принимает на вход структуру tm (POSIX; см. (% class="nolink" %)https:~/~/linux.die.net/man/3/localtime_r(%%)) в форме Lua-таблицы и возвращает число с плавающей точкой, равное количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд)
364 )))
365 |(((
366 {{code language="none"}}
367 iso8601_print(t)
368 {{/code}}
369 )))|(((
370 число
371 )))|(((
372 строка
373 )))|(((
374 Для переданного числа (формат см. common.now()) возвращает строку представления даты и времени в формате ISO8601.
375
376 В аргументе передать число с плавающей точкой, соответствующее количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд).
377 )))
378 |(((
379 {{code language="none"}}
380 iso8601_parse(s)
381 {{/code}}
382 )))|(((
383 строка
384 )))|(((
385 число
386 )))|(((
387 Принимает на вход строку в формате ISO8601 и возвращает соответствующее данной строке число с плавающей точкой, равное количеству секунд, прошедшему с 1970 года (с точностью до миллисекунд)
388 )))
389
390 (% style="text-align: left;" %)
391 ==== {{id name="РуководствопоскриптамLua-deviceio.lua"/}}deviceio.lua ====
392
393 (% style="text-align: left;" %)
394 Описание временно недоступно.
395
396 (% style="text-align: left;" %)
397 ==== {{id name="РуководствопоскриптамLua-fec.lua"/}}fec.lua ====
398
399 (% style="text-align: left;" %)
400 Данный модуль позволяет управлять выходами (на плате контроллера БОРЕЙ, ЯРС, а также на модулях расширения АМ-06) и световой / звуковой индикацией подключенных к контроллеру считывателей.
401
402 (% style="text-align: left;" %)
403 В перечислении {{code language="none"}}fec.TYPE{{/code}} описаны различные типы периферии. Для управления пригодны типы {{code language="none"}}fec.TYPE.RELE{{/code}} (выход на плате контроллера) и {{code language="none"}}fec.TYPE.SART_RELE{{/code}} (выход на модуле расширения). Для управления выходами следует использовать функцию set_value(тип периферии, ID элемента, состояние), где в первый параметр необходимо передать одно из значений перечисления {{code language="none"}}fec.TYPE{{/code}}, во второй параметр — идентификатор (адрес) элемента для управления, в третий параметр — требуемое состояние (для выходов это 0 = Выключено, 1 = Включено). Например:
404
405 {{code}}
406 local fec = require("fec")
407 fec.set_value(fec.TYPE.RELE, 1, 1)
408 {{/code}}
409
410 (% style="text-align: left;" %)
411 В этом примере выполняется включение первого реле на плате контроллера.
412
413 (% style="text-align: left;" %)
414 Нумерация выходов начинается с 1. Адрес выхода на модуле расширения определяется его адресом на шине.
415
416 (% style="text-align: left;" %)
417 К контроллеру БОРЕЙ (и ЯРС) можно подключить два считывателя, на плате есть выходы для управления красным, зелёным светодиодами и звуковой индикацией. Управлять светодиодами и бипером можно также с помощью функции {{code language="none"}}set_value{{/code}}. Возможные режимы индикации светодиода определены в перечислении {{code language="none"}}fec.DIOD{{/code}}. Доступно некоторое количество предустановленных режимов различной частоты и скважности. Звуковую индикацию можно только либо включить, либо выключить (см. перичесление {{code language="none"}}fec.BEEPER{{/code}}).
418
419 (% style="text-align: left;" %)
420 Поскольку управление светодиодной / звуковой индикацией на считывателях осуществляется в рамках алгоритмов доступа и состояние красного, зелёного светодиодов и звука взаимосвязано (если красный светодиод горит, то зелёный погашен и др.) — для удобства управления всей индикацией реализована функция-обёртка {{code language="none"}}fec.set_reader(ID считывателя, зелёный светодиод, красный светодиод, звук){{/code}}. Пример использования функции приведён ниже:
421
422 {{code}}
423 local fec = require("fec")
424 fec.set_reader(1, fec.DIOD.MODE_OFF, fec.DIOD.MODE_025_025, fec.BEEPER.MODE_OFF)
425 {{/code}}
426
427 (% style="text-align: left;" %)
428 ==== {{id name="РуководствопоскриптамLua-http.lua"/}}http.lua ====
429
430 (% style="text-align: left;" %)
431 Модуль позволяет отправлять HTTP-запросы прямо из Lua-скрипта, а также асинхронно обрабатывать ответы на отправленные ранее запросы.
432
433 (% style="text-align: left;" %)
434 Для отправки запроса и обработки ответа необходимо:
435
436 (% style="text-align: left;" %)
437 1. Определить объект-обработчик ответа (Lua-таблицу) с методом {{code language="none"}}on_http_response(данные ответа){{/code}}.
438 1. Создать объект-запрос посредством вызова функции-фабрики {{code language="none"}}http.with(объект-обработчик){{/code}}. Функция возвращает создаёт и возвращает объект-запрос.
439 1. Вызывать на объекте-запросе метод{{code language="none"}} transmit(параметры запроса){{/code}}. Запрос будет отправлен в соответствии с заданными параметрами запроса. По мере получения ответа (или если запрос не удастся) будет асинхронно вызван метод {{code language="none"}}on_http_response{{/code}} у созданного на первом шаге объекта-обработчика.
440
441 (% style="text-align: left;" %)
442 Ниже приведён пример использования модуля HTTP для отправки GET-запроса на IP-адрес веб-сайта (% class="nolink" %)http:~/~/example.com.
443
444 {{code}}
445 local log = require("log")
446 local http = require("http")
447 local logger = log.get_logger("script.lua")
448
449 -- обработчик ответа на HTTP-запрос
450 local example_handler = {}
451
452 -- этот метод обработчика будет вызван при получении ответа на запрос
453 function example_handler:on_http_response(response_data)
454 if response_data == nil then
455 logger:error("connection has failed; no response received")
456 else
457 logger:debug("response received; status="..response_data.status..", type(body)="..type(response_data.body))
458 end
459 end
460  
461 -- параметры запроса
462 local http_request = {
463 url = "http://93.184.216.34", -- адрес http://example.com
464 method = http.METHOD.GET,
465 version = http.VERSION.HTTP10,
466 timeout = 5000
467 }
468
469 -- отправка HTTP-запроса
470 logger:debug("querying http://example.com")
471 http.with(example_handler):transmit(http_request)
472 {{/code}}
473
474 (% style="text-align: left;" %)
475 В параметрах запроса можно указать следующие данные:
476
477 (% style="text-align: left;" %)
478 * {{code language="none"}}method{{/code}} — используемый HTTP-метод, значение из перечисления {{code language="none"}}http.METHOD{{/code}}; значение по умолчанию {{code language="none"}}http.METHOD.GET{{/code}};
479 * {{code language="none"}}version{{/code}} — используемая версия протокола HTTP, значение из перечисления {{code language="none"}}http.VERSION{{/code}}; значение по умолчанию {{code language="none"}}http.VERSION.HTTP11{{/code}};
480 * {{code language="none"}}url{{/code}} — целевой адрес / URL запрашиваемого ресурса, обязательный параметр;
481 * {{code language="none"}}timeout{{/code}} — таймаут ожидания ответа / сетевого соединения, в миллисекундах; по умолчанию 13000 (13 секунд);
482 * {{code language="none"}}header{{/code}} — таблица HTTP-заголовков (см. далее);
483 * {{code language="none"}}body{{/code}} — тело запроса (см. далее).
484
485 (% style="text-align: left;" %)
486 ===== {{id name="РуководствопоскриптамLua-ЗаголовкиHTTP-запроса"/}}Заголовки HTTP-запроса =====
487
488 (% style="text-align: left;" %)
489 Можно указать произвольные заголовки HTTP-запроса в форме Lua-таблицы со строковыми парами типа «ключ = значение». При этом «ключ» будет выступать в роли имени HTTP-заголовка, а «значение» — в роли значения HTTP-заголовка.
490
491 (% style="text-align: left;" %)
492 Пример:
493
494 {{code}}
495 -- параметры запроса
496 local http_request = {
497 url = "http://93.184.216.34",
498 method = http.METHOD.GET,
499 version = http.VERSION.HTTP10,
500 timeout = 5000
501 }
502  
503 http_request.header = {}
504 http_request.header["X-Extra-Header"] = "my extra header value"
505 {{/code}}
506
507 (% style="text-align: left;" %)
508 ===== {{id name="РуководствопоскриптамLua-ТелоHTTP-запроса"/}}Тело HTTP-запроса =====
509
510 (% style="text-align: left;" %)
511 Модуль позволяет отправлять в HTTP-запросах (PUT или POST) данные в форме текста или JSON.
512
513 (% style="text-align: left;" %)
514 Для передачи запроса с телом в форме текста достаточно присвоить параметру запроса body соответствующее строковое значение. Например:
515
516 {{code}}
517 local http_request = {
518 url = "http://10.1.30.3:8080/myservice",
519 method = http.METHOD.POST,
520 body = "<a>hello XML</a>"
521 }
522 http_request.header = {}
523 http_request.header["Content-Type"] = "text/xml; charset=UTF-8"
524 {{/code}}
525
526 (% style="text-align: left;" %)
527 Модуль также позволяет передавать запрос с телом в форме JSON-документа, который автоматически формируется из Lua-таблицы. Например:
528
529 {{code}}
530 local http_request = {
531 url = "http://10.1.30.3:8080/myservice",
532 method = http.METHOD.POST
533 }
534 http_request.body = {
535 myParam = "A",
536 wowThisIsSubTable = {}
537 }
538 http_request.body["ohNumberHere"] = 42
539 http_request.body.wowThisIsSubTable["robot"] = "kill all human"
540 {{/code}}
541
542 (% style="text-align: left;" %)
543 При отправке запроса с такими параметрами HTTP-заголовок Content-Type будет автоматически установлен в application/json, а тело запроса будет содержать следующий JSON-документ:
544
545 {{code language="js"}}
546 {
547 "myParam": "A",
548 "ohNumberHere": 42,
549 "wowThisIsSubTable": { "robot": "kill all human" }
550 }
551 {{/code}}
552
553 (% style="text-align: left;" %)
554 \\
555
556 {{error title="ВНИМАНИЕ"}}
557 При преобразовании Lua-таблицы в JSON поддерживаются все типы данных КРОМЕ массивов (таблиц с числовыми ключами).
558 {{/error}}
559
560 (% style="text-align: left;" %)
561 ===== {{id name="РуководствопоскриптамLua-Обработкаответа"/}}Обработка ответа =====
562
563 (% style="text-align: left;" %)
564 При поступлении ответа или сбое при отправке запроса асинхронно вызывается метод {{code language="none"}}on_http_response(response_data){{/code}} на объекте-обработчике. Параметр метода — это Lua-таблица, содержащая следующие данные:
565
566 (% style="text-align: left;" %)
567 * {{code language="none"}}status{{/code}} — код HTTP-ответа, число в соответствии со спецификацией [(% class="nolink" %)https:~/~/ru.wikipedia.org/wiki/Список_кодов_состояния_HTTP(%%)];
568 * {{code language="none"}}header{{/code}} — HTTP-заголовки ответа в форме Lua-таблицы (аналогично HTTP-заголовкам запроса);
569 * {{code language="none"}}body{{/code}} — тело ответа.
570
571 (% style="text-align: left;" %)
572 Если отправка запроса не удалась и ответ не был получен, то аргумент метода равен {{code language="none"}}nil{{/code}}.
573
574 (% style="text-align: left;" %)
575 Тело ответа в зависимости от {{code language="none"}}Content-Type{{/code}} может быть либо Lua-таблицей (если {{code language="none"}}Content-Type{{/code}} ответа равен {{code language="none"}}application/json{{/code}} — тело автоматически преобразуется в Lua-таблицу), либо текстом / строкой (в остальных случаях).
576
577 (% style="text-align: left;" %)
578 ==== {{id name="РуководствопоскриптамLua-ignis.lua"/}}ignis.lua ====
579
580 (% style="text-align: left;" %)
581 Описание временно недоступно.
582
583 (% style="text-align: left;" %)
584 ==== {{id name="РуководствопоскриптамLua-log.lua"/}}log.lua ====
585
586 (% style="text-align: left;" %)
587 Модуль позволяет выводить текстовые сообщения в журнал аудита.
588
589 (% style="text-align: left;" %)
590 Для вывода сообщений разработчику необходимо:
591
592 (% style="text-align: left;" %)
593 1. Подключить модуль {{code language="none"}}log.lua{{/code}} в скрипт автоматизации командой require.
594 1. Создать объект-логгер с заданным именем, вызвав функцию {{code language="none"}}log.get_logger(имя-логгера){{/code}}.
595 1. В требуемом месте скрипта вывести сообщение в журнал аудита с заданным уровнем «тревожности», вызвав один из методов {{code language="none"}}trace{{/code}}, {{code language="none"}}debug{{/code}}, {{code language="none"}}info{{/code}}, {{code language="none"}}warn{{/code}} или {{code language="none"}}error{{/code}} у объекта-логгера.
596
597 (% style="text-align: left;" %)
598 Пример приведён ниже:
599
600 {{code}}
601 local log = require("log")
602 local logger = log.get_logger("MyLogger")
603  
604 local answer = 42
605 logger:debug("The answer is "..tostring(answer))
606 {{/code}}
607
608 (% style="text-align: left;" %)
609 Обратите внимание:
610
611 (% style="text-align: left;" %)
612 1. В журнал аудита сообщения выводятся от имени компонента программных средств {{code language="none"}}neyross::LogLuaModule{{/code}}, а потому в настройки журнала аудита следует добавить соответствующий фильтр, например: {{code language="none"}}neyross::LogLuaModule | DEBUG{{/code}}.
613 1. Имя объекта-логгера также выводится в журнале аудита перед заданным текстовым сообщением. В скрипте автоматизации можно создать и использовать любое количество объектов-логгеров с разными именами. Это позволяет различить сообщения в журнале аудита от разных логических разделов скрипта автоматизации.
614 1. В журнале аудита для каждой записи также выводится имя функции (если таковая есть), в которой вызван объект-логгер и номер соответствующей строки в скрипте, что ещё более упрощает понимание — к какой части скрипта относится соответствующее сообщение в журнале аудита.
615 1. Различные методы объекта-логгера выводят в журнал сообщения с разным уровнем «тревожности». Доступны следующие методы и уровни по приоритетам (от низкого / неважного до высокого / тревожного):
616 11. {{code language="none"}}trace{{/code}} (только для отладочного режима, в журнал не попадают никогда);
617 11. {{code language="none"}}debug{{/code}} (отладочные сообщения);
618 11. {{code language="none"}}info{{/code}} (информационные сообщения);
619 11. {{code language="none"}}warn{{/code}} (сообщения-предупреждения);
620 11. {{code language="none"}}error{{/code}} (сообщения об ошибках).
621 1. Методы объекта-логгера принимают на вход один строковой параметр. Для формирования строки из нескольких параметров используйте оператор конкатенации строк {{code language="none"}}..{{/code}} и функцию приведения нестроковых типов к строке {{code language="none"}}tostring{{/code}} из стандартной библиотеки.
622
623 (% style="text-align: left;" %)
624 ==== {{id name="РуководствопоскриптамLua-longate.lua"/}}longate.lua ====
625
626 (% style="text-align: left;" %)
627 Описание временно недоступно.
628
629 (% style="text-align: left;" %)
630 ==== {{id name="РуководствопоскриптамLua-loninput.lua"/}}loninput.lua ====
631
632 Модуль предоставляет API для мониторинга состояния входов (зон) на модулях расширения ЯРС.
633
634 loninput.lua позволяет «подписаться» на изменения состояния входов. Для управления «подписчиками» в модуле доступны следующие функции:
635
636 (% class="wrapped" %)
637 |=(((
638 Функция
639 )))|=(((
640 Назначение
641 )))|=(((
642 Комментарии
643 )))
644 |(((
645 {{code language="none"}}
646 add_listener(key, listener)
647 {{/code}}
648 )))|(((
649 Добавить объект подписчика
650 )))|(((
651 Функция принимает следующие параметры:
652
653 * {{code language="none"}}key{{/code}} — уникальный идентификатор подписчика, позволяет впоследствии «удалить» подписчика по указанному ключу, см. {{code language="none"}}remove_listener{{/code}};
654 * {{code language="none"}}listener{{/code}} — Lua-таблица (объект) с функцией-методом {{code language="none"}}on_loninput_input_state_changed{{/code}}; требования к таблице подписчика приведены ниже.
655 )))
656 |(((
657 {{code language="none"}}
658 remove_listener(key)
659 {{/code}}
660 )))|(((
661 Удалить объект подписчика
662 )))|(((
663 Единственный аргумент {{code language="none"}}key{{/code}} указывает на добавленного ранее подписчика, которого необходимо «отписать» от получения уведомлений.
664 )))
665
666 Каждый объект-подписчик должен быть представлен Lua-таблицей с функцией {{code language="none"}}on_loninput_input_state_changed(device_address, input_index, raw_state, logical_state){{/code}}.
667
668 Данная функция будет вызвана:
669
670 1. при изменении состояния входа какого-либо модуля расширения,
671 1. сразу в процессе добавления подписчика через {{code language="none"}}add_listener{{/code}} для всех входов всех модулей (что позволяет получить текущее состояние нужных входов в момент добавления подписчика).
672
673 В функцию {{code language="none"}}on_loninput_input_state_changed{{/code}} передаются следующие параметры:
674
675 (% class="wrapped" %)
676 |=(((
677 Параметр
678 )))|=(((
679 Тип данных
680 )))|=(((
681 Описание
682 )))
683 |(((
684 {{code language="none"}}
685 device_address
686 {{/code}}
687 )))|(((
688 Число
689 )))|(((
690 Адрес устройства, к которому относится вход (зона)
691 )))
692 |(((
693 {{code language="none"}}
694 input_index
695 {{/code}}
696 )))|(((
697 Число
698 )))|(((
699 Индекс входа (зоны), которому соответствует состояние
700 )))
701 |(((
702 {{code language="none"}}
703 raw_state
704 {{/code}}
705 )))|(((
706 Число
707 )))|(((
708 Технический код состояния входа (зоны), полученный от модуля; возможные коды перечислены в таблице {{code language="none"}}RAW_INPUT_STATE{{/code}}
709 )))
710 |(((
711 {{code language="none"}}
712 logical_state
713 {{/code}}
714 )))|(((
715 Число
716 )))|(((
717 Логическое состояние входа значения из перечисления {{code language="none"}}LOGICAL_INPUT_STATE{{/code}}
718 )))
719
720 Логическое состояние входа может быть следующим:
721
722 * 0 ({{code language="none"}}LOGICAL_INPUT_STATE.UNKNOWN{{/code}}) — значение не известно;
723 * 1 ({{code language="none"}}LOGICAL_INPUT_STATE.OFF{{/code}}) — вход выключен, нормальное состояние (логический 0);
724 * 2 ({{code language="none"}}LOGICAL_INPUT_STATE.ON{{/code}}) — вход включен, тревожное состояние (логическая 1).
725
726 (% style="text-align: left;" %)
727 ==== {{id name="РуководствопоскриптамLua-lonpacs.lua"/}}lonpacs.lua ====
728
729 Модуль предоставляет API для интеграции с подсистемой доступа модулей расширения ЯРС, таких как МДС и М2. Модуль позволяет модифицировать стандартные алгоритмы доступа.
730
731 {{info}}
732 Подсистема доступа в модулях расширения ЯРС по своей структуре и поведению отвечает требованиям спецификаций Onvif (Profile C, Access Control Service, Door Control Service). В частности, состояние точек доступа, команды управления ими и другие аспекты отвечают указанным спецификациям. Рекомендуется ознакомиться с данными спецификациями перед использованием модуля {{code language="none"}}lonpacs.lua{{/code}}.
733 {{/info}}
734
735 Получить список точек доступа с их идентификаторами можно через поле {{code language="none"}}lonpacs.ap_instance{{/code}}, которое заполняется при инициализации модуля и виртуальной Lua-машины (до того, как будет выполняться пользовательский Lua-скрипт). Поле {{code language="none"}}lonpacs.ap_instance{{/code}} содержит Lua-таблицу, в которой ключами являются токены точек доступа, а значениями — Lua-таблицы с системными параметрами точек доступа. Структура таблицы представлена в коде ниже:
736
737 {{code}}
738 lonpacs.ap = {
739 "токен первой точки доступа" = {
740 ...
741 },
742 "токен второй точки доступа" = {
743 ...
744 },
745 ... -- и так далее
746 }
747 {{/code}}
748
749 (% style="color: rgb(51,51,51);" %)Каждая точка доступа в списке — это либо точка доступа модуля расширения МДС, либо одна из точек доступа М2.
750
751 ===== {{id name="РуководствопоскриптамLua-Управлениеточкойдоступа"/}}Управление точкой доступа =====
752
753 Для управления точками доступа на модулях расширения доступна функция {{code language="none"}}transmit_status(token, status){{/code}}, которая позволяет отправлять модулям команды управления. Функция принимает следующие параметры:
754
755 (% class="wrapped" %)
756 |=(((
757 Параметр
758 )))|=(((
759 Тип
760 )))|=(((
761 Описание
762 )))
763 |(((
764 {{code language="none"}}
765 token
766 {{/code}}
767 )))|(((
768 Строка
769 )))|(((
770 Идентификатор (токен) точки доступа, которой необходимо управлять
771 )))
772 |(((
773 {{code language="none"}}
774 status
775 {{/code}}
776 )))|(((
777 Число
778 )))|(((
779 Команда управления (требуемый статус точки доступа); значение из перечисления {{code language="none"}}lonpacs.AP_COMMAND{{/code}} (см. ниже)
780 )))
781
782 (% style="color: rgb(51, 51, 51); color: rgb(51, 51, 51)" %)Для управления точкам доступа доступны следующие команды (значения параметра {{code language="none"}}status{{/code}}):
783
784 (% class="wrapped" %)
785 |=(((
786 Команда
787 )))|=(((
788 Значение
789 )))|=(((
790 Описание
791 )))
792 |(((
793 {{code language="none"}}
794 STATUS_QUERY
795 {{/code}}
796 )))|(((
797 -1
798 )))|(((
799 Запрос состояния точки доступа
800 )))
801 |(((
802 {{code language="none"}}
803 RESTORE
804 {{/code}}
805 )))|(((
806 12
807 )))|(((
808 Переключиться в дежурный режим работы
809 )))
810 |(((
811 {{code language="none"}}
812 OPEN_BLOCKED
813 {{/code}}
814 )))|(((
815 21
816 )))|(((
817 Разблокировать точку доступа
818 )))
819 |(((
820 {{code language="none"}}
821 CLOSE_BLOCKED
822 {{/code}}
823 )))|(((
824 22
825 )))|(((
826 Заблокировать точку доступа
827 )))
828 |(((
829 {{code language="none"}}
830 DISABLE
831 {{/code}}
832 )))|(((
833 13
834 )))|(((
835 \\
836 )))
837 |(((
838 {{code language="none"}}
839 INITIATE_PASS
840 {{/code}}
841 )))|(((
842 18
843 )))|(((
844 Инициировать проход
845 )))
846
847 ===== {{id name="РуководствопоскриптамLua-Состояниеточкидоступа"/}}Состояние точки доступа =====
848
849 Модуль {{code language="none"}}lonpacs.lua{{/code}} позволяет «подписаться» на события изменения состояния точек доступа, мониторинга связи с точками доступа, изменения состояния прохода (фазы алгоритма прохода). Для управления «подписчиками» в модуле доступны следующие функции:
850
851 (% class="wrapped" %)
852 |=(((
853 Функция
854 )))|=(((
855 Назначение
856 )))|=(((
857 Комментарии
858 )))
859 |(((
860 {{code language="none"}}
861 add_listener(key, listener)
862 {{/code}}
863 )))|(((
864 Добавить объект подписчика
865 )))|(((
866 Функция принимает следующие параметры:
867
868 * {{code language="none"}}key{{/code}} — уникальный идентификатор подписчика, позволяет впоследствии «удалить» подписчика по указанному ключу, см. {{code language="none"}}remove_listener{{/code}};
869 * {{code language="none"}}listener{{/code}} — Lua-таблица (объект) с функциями-обработчиками изменений; требования к таблице подписчика приведены ниже.
870 )))
871 |(((
872 {{code language="none"}}
873 remove_listener(key)
874 {{/code}}
875 )))|(((
876 Удалить объект подписчика
877 )))|(((
878 Единственный аргумент {{code language="none"}}key{{/code}} указывает на добавленного ранее подписчика, которого необходимо «отписать» от получения уведомлений.
879 )))
880
881 Каждый объект-подписчик должен быть представлен Lua-таблицей со следующими функциями:
882
883 (% class="relative-table wrapped" style="width: 100.0%;" %)
884 |=(% style="width: 27.5219%;" %)(((
885 Функция
886 )))|=(% style="width: 25.4934%;" %)(((
887 Назначение
888 )))|=(% style="width: 46.9846%;" %)(((
889 Комментарии
890 )))
891 |(% style="width: 27.5219%;" %)(((
892 {{code language="none"}}
893 lonpacs_on_ap_status_changed(token, ap_status)
894 {{/code}}
895 )))|(% style="width: 25.4934%;" %)(((
896 Получение и обработка изменений состояния точки доступа
897 )))|(% style="width: 46.9846%;" %)(((
898 В функцию передаются следующие параметры:
899
900 * {{code language="none"}}token{{/code}} (строка) — уникальный идентификатор (токен) точки доступа;
901 * {{code language="none"}}ap_status{{/code}} (число) — код состояния точки доступа; значение из перечисления {{code language="none"}}lonpacs.AP_STATUS {{/code}}(см. ниже);
902 )))
903 |(% style="width: 27.5219%;" %)(((
904 {{code language="none"}}
905 lonpacs_on_pass_status_changed(token, status, notify_key)
906 {{/code}}
907 )))|(% style="width: 25.4934%;" %)(((
908 Получение и обработка изменений состояния алгоритма прохода
909 )))|(% style="width: 46.9846%;" %)(((
910 В функцию передаются следующие параметры:
911
912 * {{code language="none"}}token{{/code}} (строка) — уникальный идентификатор (токен) точки доступа;
913 * {{code language="none"}}status{{/code}} (число) — код состояния алгоритма прохода (см. ниже);
914 * {{code language="none"}}notify_key{{/code}} (строка) — код уведомления для отправки соответствующего извещения (возможного вызова {{code language="none"}}lonpacs.notify{{/code}}).
915 )))
916 |(% style="width: 27.5219%;" %)(((
917 {{code language="none"}}
918 lonpacs_on_connection_changed(token, connection)
919 {{/code}}
920 )))|(% style="width: 25.4934%;" %)(((
921 Получение и обработка изменений состояния связи с точкой доступа
922 )))|(% style="width: 46.9846%;" %)(((
923 В функцию передаются следующие параметры:
924
925 * {{code language="none"}}token{{/code}} (строка) — уникальный идентификатор (токен) точки доступа;
926 * {{code language="none"}}connection{{/code}} (число) — состояние связи, возможные значения определены в перечислении {{code language="none"}}lonpacs.CONNECTION{{/code}}:
927 ** 0 ({{code language="none"}}ONLINE{{/code}}) — точка доступа на связи;
928 ** 1 ({{code language="none"}}OFFLINE{{/code}}) — не связи с точкой доступа;
929 ** 2 ({{code language="none"}}UNKNOWN{{/code}}) — состояние связи неизвестно.
930 )))
931
932 Параметр {{code language="none"}}ap_status{{/code}} может принимать одно из следующих значений:
933
934 (% class="wrapped" %)
935 |=(((
936 Состояние точки доступа
937 )))|=(((
938 Значение
939 )))|=(((
940 Описание
941 )))
942 |(((
943 {{code language="none"}}
944 USER_QUERY
945 {{/code}}
946 )))|(((
947 0
948 )))|(((
949 (% style="color: rgb(51,51,51);" %)Точка доступа в состоянии ожидания транзакции
950 )))
951 |(((
952 {{code language="none"}}
953 FORCE_OPEN
954 {{/code}}
955 )))|(((
956 1
957 )))|(((
958 Взлом двери
959 )))
960 |(((
961 {{code language="none"}}
962 EPB
963 {{/code}}
964 )))|(((
965 2
966 )))|(((
967 (% style="color: rgb(51,51,51);" %)Старт транзакции прохода по кнопке выхода
968 )))
969 |(((
970 {{code language="none"}}
971 HOLD_OPEN
972 {{/code}}
973 )))|(((
974 5
975 )))|(((
976 (% style="color: rgb(51,51,51);" %)Дверь удержана открытой (удержание двери)
977 )))
978 |(((
979 {{code language="none"}}
980 DENIAL
981 {{/code}}
982 )))|(((
983 6
984 )))|(((
985 (% style="text-align: left;" %)
986 Завершение транзакции прохода:
987
988 (% style="text-align: left;" %)
989 * истек таймаут ожидания ответа от базы данных
990 * отказ от базы данных
991 * невалидный уровень доступа пользователя в ответе от базы данных
992 * невалидная временная зона в уровне доступа пользователя
993 )))
994 |(((
995 {{code language="none"}}
996 OPEN
997 {{/code}}
998 )))|(((
999 10
1000 )))|(((
1001 (% style="color: rgb(51,51,51);" %)Дверь открыта при совершении прохода
1002 )))
1003 |(((
1004 {{code language="none"}}
1005 DISABLE
1006 {{/code}}
1007 )))|(((
1008 13
1009 )))|(((
1010 (% style="text-align: left;" %)
1011 Точка доступа в состоянии "заблокирована".
1012
1013 (% style="text-align: left;" %)
1014 * дверной контакт не работает
1015 * кнопка выхода не работает
1016 * входные сообщения от считывателя игнорируются.
1017 )))
1018 |(((
1019 {{code language="none"}}
1020 DOOR_CLOSED
1021 {{/code}}
1022 )))|(((
1023 15
1024 )))|(((
1025 (% style="text-align: left;" %)
1026 * Снята тревога "взлом двери" (дверь закрыта)
1027
1028 (% style="text-align: left;" %)
1029 * Дверь закрыта при при завершении транзакции прохода через точку доступа
1030 )))
1031 |(((
1032 {{code language="none"}}
1033 INITIATE_PASS
1034 {{/code}}
1035 )))|(((
1036 18
1037 )))|(((
1038 (% style="text-align: left;" %)
1039 Старт транзакции прохода пользователя (при получении разрешения на доступ).
1040
1041 (% style="text-align: left;" %)
1042 Точка доступа переходит в состояние ожидания открытия двери.
1043 )))
1044 |(((
1045 {{code language="none"}}
1046 OPEN_BLOCKED
1047 {{/code}}
1048 )))|(((
1049 21
1050 )))|(((
1051 (% style="text-align: left;" %)
1052 Точка доступа в состоянии "открыта и заблокирована":
1053
1054 (% style="text-align: left;" %)
1055 * замок двери открыт
1056 * кнопка выхода не работает
1057 * дверной контакт не работает
1058 * входные сообщения от считывателя игнорируются
1059
1060 (% style="text-align: left;" %)
1061 Текущая транзакция пользователя обрывается.
1062 )))
1063 |(((
1064 {{code language="none"}}
1065 CLOSE_BLOCKED
1066 {{/code}}
1067 )))|(((
1068 22
1069 )))|(((
1070 (% style="text-align: left;" %)
1071 Точка доступа в состоянии "закрыта и заблокирована":
1072
1073 * кнопка выхода не работает
1074 * дверной контакт работает
1075 * входные сообщения от считывателя игнорируются
1076
1077 (% style="text-align: left;" %)
1078 Текущая транзакция пользователя обрывается.
1079 )))
1080 |(((
1081 {{code language="none"}}
1082 LOCK_ACTUATOR_ERROR
1083 {{/code}}
1084 )))|(((
1085 32
1086 )))|(((
1087 (% style="color: rgb(51,51,51);" %)Неисправное состояние замка (не является состоянием точки доступа)
1088 )))
1089 |(((
1090 {{code language="none"}}
1091 BLOCKED_HOLD_OPEN
1092 {{/code}}
1093 )))|(((
1094 53
1095 )))|(((
1096 (% style="color: rgb(51,51,51);" %)Удержание двери точки доступа в состоянии "закрыта и заблокирована"
1097 )))
1098 |(((
1099 {{code language="none"}}
1100 BLOCKED_FORCE_OPEN
1101 {{/code}}
1102 )))|(((
1103 54
1104 )))|(((
1105 (% style="color: rgb(51,51,51);" %)Взлом двери точки доступа в состоянии "закрыта и заблокирована"
1106 )))
1107 |(((
1108 {{code language="none"}}
1109 ARMED_CLOSE_BLOCKED
1110 {{/code}}
1111 )))|(((
1112 105
1113 )))|(((
1114 (% style="text-align: left;" %)
1115 Точка доступа в состоянии "закрыта и заблокирована постановкой под охрану связанной группы зон":
1116
1117 * кнопка выхода не работает
1118 * дверной контакт работает
1119 * считыватель работает
1120
1121 Текущая транзакция пользователя обрывается.
1122 )))
1123 |(((
1124 ##(% style="color: rgb(68,68,68);" %)ARMED_CLOSE_BLOCKED_FORCE_OPEN(%%)##
1125 )))|(((
1126 106
1127 )))|(((
1128 (% style="text-align: left;" %)
1129 Взлом двери точки доступа в состоянии "закрыта и заблокирована постановкой под охрану связанной группы зон"
1130 )))
1131
1132 {{code language="none"}}ap_status{{/code}} определяет интегральное состояние составляющих точку доступа элементов (замок, дверной контакт). Для получения состояния этих элементов нужно использовать функцию {{code language="none"}}lonpacs.parse_ap_status(ap_status){{/code}}.
1133
1134 Функция {{code language="none"}}parse_ap_status{{/code}} возвращает Lua-таблицу следующего вида:
1135
1136 {{code}}
1137 {
1138 door_state = ..
1139 lock_state = ..
1140 mode = ..
1141 alarm = ..
1142 }
1143 {{/code}}
1144
1145 где значение полей таблицы следующее:
1146
1147 (% class="wrapped" %)
1148 |=(((
1149 Поле
1150 )))|=(((
1151 Описание
1152 )))|=(((
1153 Возможные значения
1154 )))
1155 |(((
1156 {{code language="none"}}
1157 door_state
1158 {{/code}}
1159 )))|(((
1160 Состояние двери (открыта, закрыта, ...)
1161 )))|(((
1162 Возможные значения определены в {{code language="none"}}lonpacs.AP_DOOR_PHYSICAL_STATE{{/code}}:
1163
1164 * {{code language="none"}}UNKNOWN{{/code}} — состояние неизвестно;
1165 * {{code language="none"}}OPEN{{/code}} — дверь открыта;
1166 * {{code language="none"}}CLOSED{{/code}} — дверь закрыта;
1167 * {{code language="none"}}FAULT{{/code}} — неисправность двери.
1168 )))
1169 |(((
1170 {{code language="none"}}
1171 lock_state
1172 {{/code}}
1173 )))|(((
1174 Состояние замка
1175 )))|(((
1176 Возможные значения определены в {{code language="none"}}lonpacs.AP_LOCK_STATE{{/code}}:
1177
1178 * {{code language="none"}}UNKNOWN{{/code}} — состояние неизвестно;
1179 * {{code language="none"}}LOCKED{{/code}} — закрыт;
1180 * {{code language="none"}}UNLOCKED{{/code}} — открыт;
1181 * {{code language="none"}}FAULT{{/code}} — неисправность замка.
1182 )))
1183 |(((
1184 {{code language="none"}}
1185 mode
1186 {{/code}}
1187 )))|(((
1188 Режим точки доступа (разблокирована, заблокирована, ...)
1189 )))|(((
1190 Возможные значения определены в {{code language="none"}}lonpacs.AP_MODE{{/code}}:
1191
1192 * {{code language="none"}}UNKNOWN{{/code}} — состояние неизвестно;
1193 * {{code language="none"}}LOCKED{{/code}} — дежурный режим;
1194 * {{code language="none"}}UNLOCKED{{/code}} — разблокирована;
1195 * {{code language="none"}}ACCESSED{{/code}} — проход;
1196 * {{code language="none"}}BLOCKED{{/code}} — заблокирована.
1197 )))
1198 |(((
1199 {{code language="none"}}
1200 alarm
1201 {{/code}}
1202 )))|(((
1203 Состояние тревоги точки доступа (удержана дверь и др.)
1204 )))|(((
1205 Возможные значения определены в {{code language="none"}}lonpacs.AP_ALARM_STATE{{/code}}:
1206
1207 * {{code language="none"}}UNKNOWN{{/code}} — неизвестно;
1208 * {{code language="none"}}NORMAL{{/code}} — норма;
1209 * {{code language="none"}}DOOR_OPEN_TOO_LONG{{/code}} — удержание двери;
1210 * {{code language="none"}}DOOR_FORCED_OPEN{{/code}} — взлом двери.
1211 )))
1212
1213 (% style="text-align: left;" %)
1214 Значение кода состояния алгоритма прохода (фазы прохода) {{code language="none"}}status, {{/code}}полученного в функции {{code language="none"}}lonpacs_on_pass_status_changed(token, status, notify_key),{{/code}} может принимать одно из следующих значений:
1215
1216 (% class="wrapped" %)
1217 |=(((
1218 Код (условный)
1219 )))|=(((
1220 Принимаемое значение
1221 )))|=(((
1222 Описание
1223 )))
1224 |(((
1225 {{code language="none"}}
1226 ACS_DENIED
1227 {{/code}}
1228 )))|(% style="text-align: center;" %)(((
1229 42
1230 )))|(((
1231 Доступ запрещен
1232 )))
1233 |(((
1234 {{code language="none"}}
1235 NO_PASS
1236 {{/code}}
1237 )))|(% style="text-align: center;" %)(((
1238 3
1239 )))|(((
1240 Проход не совершен
1241 )))
1242 |(((
1243 {{code language="none"}}
1244 PASS
1245 {{/code}}
1246 )))|(% style="text-align: center;" %)(((
1247 4
1248 )))|(((
1249 Проход совершен
1250 )))
1251 |(((
1252 {{code language="none"}}
1253 ACS_ID_PRESENT
1254 {{/code}}
1255 )))|(% style="text-align: center;" %)(((
1256 95
1257 )))|(((
1258 Предъявлен идентификатор СКУД (запрос пользователя СКУД в базе ЯРС)
1259 )))
1260 |(((
1261 {{code language="none"}}
1262 ARM_ID_PRESENT
1263 {{/code}}
1264 )))|(% style="text-align: center;" %)(((
1265 107
1266 )))|(((
1267 Предъявлен идентификатор для управления постановкой на охрану связанной группы зон
1268 )))
1269 |(((
1270 {{code language="none"}}
1271 DISARM_ID_PRESENT
1272 {{/code}}
1273 )))|(% style="text-align: center;" %)(((
1274 108
1275 )))|(((
1276 Предъявлен идентификатор для управления снятием с охраны связанной группы зон
1277 )))
1278 |(((
1279 {{code language="none"}}
1280 REPEATED_PRESENT
1281 {{/code}}
1282 )))|(% style="text-align: center;" %)(((
1283 59
1284 )))|(((
1285 Повторное предъявление идентификатора в ходе транзакции СКУД
1286 )))
1287
1288 (% style="text-align: left;" %)
1289 ==== {{id name="РуководствопоскриптамLua-pacs.lua"/}}pacs.lua ====
1290
1291 (% style="text-align: left;" %)
1292 Модуль предоставляет API для интеграции с подсистемой доступа (только для контроллеров БОРЕЙ и ЯРС). Модуль позволяет либо модифицировать стандартные алгоритмы доступа, либо реализовать собственный алгоритм.
1293
1294 {{info}}
1295 Подсистема доступа в контроллерах БОРЕЙ, ЯРС по своей структуре и поведению отвечает требованиям спецификаций Onvif (Profile C, Access Control Service, Door Control Service). В частности, состояние точек доступа, команды управления ими и другие аспекты отвечают указанным спецификациям. Рекомендуется ознакомиться с данными спецификациями перед использованием модуля {{code language="none"}}pacs.lua{{/code}}.
1296 {{/info}}
1297
1298 (% style="text-align: left;" %)
1299 ===== {{id name="РуководствопоскриптамLua-Общиесведения"/}}Общие сведения =====
1300
1301 (% style="text-align: left;" %)
1302 Подсистема доступа в контроллерах БОРЕЙ, ЯРС поддерживает две точки доступа (поддержка дополнительных точек доступа на модулях расширения ЯРС осуществляется в Lua-модуле lonpacs.lua). Соответственно, первый считыватель относится к первой точке доступа, а второй — ко второй. У каждой точки доступа есть строковой уникальный идентификатор, называемый //токеном//.
1303
1304 (% style="text-align: left;" %)
1305 Получить список точек доступа с их идентификаторами можно через поле {{code language="none"}}pacs.ap{{/code}}, которое заполняется при инициализации модуля и виртуальной Lua-машины (до того, как будет выполняться пользовательский Lua-скрипт). Поле {{code language="none"}}pacs.ap{{/code}} содержит Lua-таблицу, в которой ключами являются токены точек доступа, а значениями — Lua-таблицы с системными параметрами точек доступа. Структура таблицы представлена в коде ниже:
1306
1307 {{code}}
1308 pacs.ap = {
1309 "токен первой точки доступа" = {
1310 "#" = 0,
1311 ...
1312 },
1313 "токен второй точки доступа" = {
1314 "#" = 1,
1315 ...
1316 }
1317 }
1318 {{/code}}
1319
1320 (% style="text-align: left;" %)
1321 Соответственно, для перебора точек доступа (например, чтобы для каждой точки доступа проинциализировать свой алгоритм) удобно использовать следующий код:
1322
1323 {{code}}
1324 for key,item in pairs(pacs.ap) do
1325 if item["#"] == 0 or item["#"] == 1 then
1326 -- код обработки точки доступа с токеном = key
1327 else
1328 logger:error("unexpected access point number; #="..item["#"].."; token="..key)
1329 end
1330 end
1331 {{/code}}
1332
1333 (% style="text-align: left;" %)
1334 В контроллере БОРЕЙ точек доступа всегда ровно две, с номерами 0 и 1. Точка доступа с номером 0 (у которой значение свойства {{code language="none"}}pacs.ap["токен"]["#"]{{/code}} равно 0 — это первая точка доступа), точка доступа с номером 1 — вторая.
1335
1336 (% style="text-align: left;" %)
1337 В настройках доступа у контроллера можно выбрать «Режим работы» — «Две односторонние», «Одна двусторонняя», «Пользовательский». В стандартных режимах работы «Две односторонние» и «Одна двусторонняя» программные средства самостоятельно реализуют алгоритм доступа, таблицы параметров ({{code language="none"}}pacs.ap["токен"]{{/code}}) содержат параметры, которые пользователь может изменить через веб-приложение. В режиме «Пользовательский» таблицы параметров по умолчанию обычно пусты.
1338
1339 {{info title="ВНИМАНИЕ"}}
1340 Для реализации собственной логики доступа с помощью Lua-скриптов пользователю __следует выбрать__ в настройках контроллера режим = «Пользовательский». В этом режиме //системные параметры// алгоритма доступа (которые обрабатываются не в Lua-скрипте, а в основных программных средствах) не задаются через веб-интерфейс, и должны быть определены пользователем прямо в Lua-скрипте. Инструкция по установке системных параметров приведена в разделе «Изменение системных параметров» далее.
1341 {{/info}}
1342
1343 (% style="text-align: left;" %)
1344 Управление состоянием точки доступа, а также режимом её работы (начало транзакции доступа, завершение транзакции и так далее) осуществляется из Lua-скрипта. Соответствующие функции описаны в разделе «Управление точкой доступа».
1345
1346 (% style="text-align: left;" %)
1347 В каждый момент времени состояние точки доступа описывается N-мерным вектором:
1348
1349 (% class="wrapped" style="text-align: left;" %)
1350 |(% style="text-align: left;" %)(((
1351 Режим работы точки доступа
1352 )))|(% style="text-align: left;" %)(((
1353 1. Дежурный / Ожидание прохода (Locked)
1354 1. Выполняется проход (Accessed)
1355 1. Заблокировано (Blocked)
1356 1. Разблокировано (Unlocked)
1357 )))|(% style="text-align: left;" %)(((
1358 1. Режим Locked устанавливается в программных средствах при сбросе транзакции доступа (см. {{code language="none"}}pacs_reset{{/code}}).
1359 1. Режимы Blocked / Unlocked устанавливаются по командам блокировки / разблокировки точки доступа (см. {{code language="none"}}pacs_block{{/code}}, {{code language="none"}}pacs_unlock{{/code}}).
1360 1. Режим Accessed должен быть установлен из Lua-скрипта в момент начала доступа (открытия двери).
1361
1362 \\
1363 )))
1364 |(% style="text-align: left;" %)(((
1365 Состояние двери
1366 )))|(% style="text-align: left;" %)(((
1367 Неизвестно (Unknown)
1368 Открыто (Open)
1369 Закрыто (Closed)
1370 Неисправность (Fault)
1371 )))|(% style="text-align: left;" %)(((
1372 Определяется из Lua-скрипта.
1373 )))
1374 |(% style="text-align: left;" %)(((
1375 Состояние замка
1376 )))|(% style="text-align: left;" %)(((
1377 Неизвестно (Unknown)
1378 Открыт (Unlocked)
1379 Закрыт (Locked)
1380 Неисправность (Fault)
1381 )))|(% style="text-align: left;" %)(((
1382 Определяется из Lua-скрипта.
1383 )))
1384 |(% style="text-align: left;" %)(((
1385 Тревожный статус
1386 )))|(% style="text-align: left;" %)(((
1387 Норма (Normal)
1388 Взлом двери (DoorForcedOpen)
1389 Удержание двери (DoorOpenTooLong)
1390 )))|(% style="text-align: left;" %)(((
1391 Определяется из Lua-скрипта.
1392 )))
1393 |(% style="text-align: left;" %)(((
1394 Статус тампера
1395 )))|(% style="text-align: left;" %)(((
1396 Неизвестно (Unknown)
1397 Корпус закрыт (NotInTamper)
1398 Вскрытие корпуса (TamperDetected)
1399 )))|(% style="text-align: left;" %)(((
1400 Автоматически определяется программными средствами по факту вскрытия / закрытия корпуса контроллера.
1401
1402 Не следует управлять этой осью состояния из Lua-скрипта.
1403 )))
1404
1405 (% style="text-align: left;" %)
1406 Точки доступа поддерживают внешние команды управления блокировки, разблокировки, восстановления режима, включения / отключения, разрешения и подтверждения доступа. При обработке таких команд программные средства передают управление в Lua-скрипт. Также при предъявлении идентификатора, изменении состояния периферии (входов), выполенении внешних команд над точками доступа и т.д. подсистема доступа передаёт управление в Lua-скрипт. Пользователь может запрограммировать реакцию на соответствующие события с помощью функций-обработчиков (см. раздел «Функции-обработчики»).
1407
1408 (% style="text-align: left;" %)
1409 Через каждую точку доступа в один момент времени может осуществляться одна транзакция доступа. Транзакция доступа — это процесс, который начинается с момента идентификации доступа, и завершается при возврате точки доступа в начальное состояние. В случае удержания двери транзакция доступа __продолжается__.
1410
1411 (% style="text-align: left;" %)
1412 Транзакция доступа начинается либо вызовом {{code language="none"}}pacs.authenticate{{/code}} в случае разрешения доступа, либо по вызову {{code language="none"}}pacs_grant{{/code}} (для случая анонимного доступа). Завершается транзакция по вызову {{code language="none"}}pacs_reset{{/code}}. Соответствующие функции описаны в разделе «Управление точкой доступа».
1413
1414 (% style="text-align: left;" %)
1415 В процессе транзакции сохраняются идентификационные признаки посетителя и прочая информация, эти данные подставляются во все извещения, формируемые контроллером.
1416
1417 (% style="text-align: left;" %)
1418 Часть извещений (в основном о запрещении доступа) формируются программными средствами. Пользователь также может в любой момент времени отправить извещение из Lua-скрипта с помощью функции {{code language="none"}}pacs_notify{{/code}}, с указанием кода извещения. Для отправки доступно более полусотни извещений. Полный список доступных для отправки извещений приведён в документации на HTTP-API контроллера в части СКУД.
1419
1420 (% style="text-align: left;" %)
1421 ===== {{id name="РуководствопоскриптамLua-Изменениесистемныхпараметров"/}}Изменение системных параметров =====
1422
1423 (% style="text-align: left;" %)
1424 В режиме доступа «Пользовательский» для реализации алгоритма может потребоваться задать из Lua-скрипта для каждой точки доступа системные параметры. Для указания параметров из Lua-скрипта предназначена функция {{code language="none"}}pacs.set_configuration(token, {...}){{/code}}, в первом аргументе необходимо передать токен точки доступа, во втором аргументе — Lua-таблицу с параметрами. Например:
1425
1426 {{code}}
1427 for key,item in pairs(pacs.ap) do
1428 local configuration = {}
1429 configuration["input.mode"] = "card"
1430 pacs.set_configuration(key, configuration)
1431 end
1432 {{/code}}
1433
1434 (% style="text-align: left;" %)
1435 Ниже приведены основные системные параметры, которые можно / нужно настраивать:
1436
1437 (% class="wrapped" style="text-align: left;" %)
1438 |=(% style="text-align: left;" %)(((
1439 Параметр
1440 )))|=(% style="text-align: left;" %)(((
1441 Ключ
1442 )))|=(% style="text-align: left;" %)(((
1443 Значение
1444 )))|=(% style="text-align: left;" %)(((
1445 Описание
1446 )))
1447 |(% style="text-align: left;" %)(((
1448 Режим идентификации
1449 )))|(% style="text-align: left;" %)(((
1450 {{code language="none"}}
1451 input.mode
1452 {{/code}}
1453 )))|(% style="text-align: left;" %)(((
1454 Одно значение из: {{code language="none"}}card{{/code}}, {{code language="none"}}pincode{{/code}}, {{code language="none"}}card_and_pincode{{/code}}, {{code language="none"}}card_or_pincode{{/code}}
1455 )))|(% style="text-align: left;" %)(((
1456 Позволяет определить требуемый режим идентификации — какие идентификаторы посетителя ожидаются на вход + как они будут проверяться.
1457
1458 **ВНИМАНИЕ**: этот параметр __необходимо__ задать, если из Lua-скрипта будет вызвана функция {{code language="none"}}pacs_authenticate{{/code}} с передачей идентификаторов посетителя; в противном случае идентификаторы не будут верифицированы по базе данных контроллера, доступ безусловно будет запрещён.
1459 )))
1460 |(% style="text-align: left;" %)(((
1461 Число попыток ввода данных
1462 )))|(% style="text-align: left;" %)(((
1463 {{code language="none"}}
1464 input.retry_limit
1465 {{/code}}
1466 )))|(% style="text-align: left;" %)(((
1467 Целое число больше 0
1468 )))|(% style="text-align: left;" %)(((
1469 В случае, если input.mode равен {{code language="none"}}card_and_pincode{{/code}} — определяет количество попыток ввода пинкода после предъявления карты.
1470 )))
1471 |(% style="text-align: left;" %)(((
1472 Время ожидания ввода данных
1473 )))|(% style="text-align: left;" %)(((
1474 {{code language="none"}}
1475 input.retry_timeout
1476 {{/code}}
1477 )))|(% style="text-align: left;" %)(((
1478 Целое число больше 0, в секундах
1479 )))|(% style="text-align: left;" %)(((
1480 В случае, если input.mode равен {{code language="none"}}card_and_pincode{{/code}} — определяет время ожидания ввода пинкода после предъявления карты.
1481 )))
1482 |(% style="text-align: left;" %)(((
1483 Формат карты
1484 )))|(% style="text-align: left;" %)(((
1485 {{code language="none"}}
1486 other.card_format
1487 {{/code}}
1488 )))|(% style="text-align: left;" %)(((
1489 Одно значение из: {{code language="none"}}auto{{/code}}, {{code language="none"}}Raw-64{{/code}}, {{code language="none"}}Raw-VL{{/code}}
1490 )))|(% style="text-align: left;" %)(((
1491 {{code language="none"}}auto{{/code}} — автоматический выбор формата; для Wiegand формат выбирается исходя из количества переданных бит (26 — Wiegand-26, 37 — Wiegand-37), для 1-Wire всегда Wiegand-26
1492
1493 {{code language="none"}}Raw-64{{/code}} — используются все 64 бита карты (отсутствующие биты дополняются 0) в форме одного 64-битного числа; код предприятия при этом равен 0.
1494
1495 {{code language="none"}}Raw-VL{{/code}} — используются только переданные от считывателя биты, в форме одного 64-битного числа; код предприятия при этом равен 0.
1496 )))
1497 |(% style="text-align: left;" %)(((
1498 Маска (номера карты)
1499 )))|(% style="text-align: left;" %)(((
1500 {{code language="none"}}
1501 other.card_mask
1502 {{/code}}
1503 )))|(% style="text-align: left;" %)(((
1504 {{code language="none"}}
1505 FFFFFFFFFFFFFFFF
1506 {{/code}}
1507 )))|(% style="text-align: left;" %)(((
1508 64 бита маски в формате HEX-строки из 16 символов
1509 )))
1510 |(% style="text-align: left;" %)(((
1511 Набор параметров блока «Контроль повторного прохода»
1512 )))|(% style="text-align: left;" %)(((
1513 \\
1514 )))|(% style="text-align: left;" %)(((
1515 \\
1516 )))|(% style="text-align: left;" %)(((
1517 Описание временно недоступно.
1518 )))
1519 |(% style="text-align: left;" %)(((
1520 Набор параметров блока «Проход под принуждением»
1521 )))|(% style="text-align: left;" %)(((
1522 \\
1523 )))|(% style="text-align: left;" %)(((
1524 \\
1525 )))|(% style="text-align: left;" %)(((
1526 Только в режиме идентификации «Карта и пинкод»
1527
1528 Описание временно недоступно.
1529 )))
1530 |(% style="text-align: left;" %)(((
1531 Набор параметров блока «Проход с подтвержденеим»
1532 )))|(% style="text-align: left;" %)(((
1533 \\
1534 )))|(% style="text-align: left;" %)(((
1535 \\
1536 )))|(% style="text-align: left;" %)(((
1537 Описание временно недоступно.
1538 )))
1539 |(% style="text-align: left;" %)(((
1540 Набор параметров блока «Доступ по правилу N-лиц»
1541 )))|(% style="text-align: left;" %)(((
1542 \\
1543 )))|(% style="text-align: left;" %)(((
1544 \\
1545 )))|(% style="text-align: left;" %)(((
1546 Описание временно недоступно.
1547 )))
1548
1549 (% style="text-align: left;" %)
1550 ===== {{id name="РуководствопоскриптамLua-Функции-обработчики"/}}Функции-обработчики =====
1551
1552 (% style="text-align: left;" %)
1553 Модуль позволяет разработчику определить глобальные Lua-функции с заданными именами. Такие функции-обработчики будут вызваны программными средствами контроллера по мере выполнения функций доступа.
1554
1555 {{info title="ВНИМАНИЕ"}}
1556 В данном случае это должны быть именно «глобальные функции», определённые, например, следующим образом:
1557
1558 {{code}}
1559 function pacs_reader_input(token, data)
1560 -- тело функции
1561 end
1562 {{/code}}
1563
1564 Локальные функции с таким же именем не будут вызваны:
1565
1566 {{code}}
1567 local pacs_reader_input = function(token, data)
1568 -- функция не будет вызвана
1569 end
1570 {{/code}}
1571 {{/info}}
1572
1573 (% style="text-align: left;" %)
1574 Ниже приведён список доступных для определения функций-обработчиков:
1575
1576 (% class="wrapped" style="text-align: left;" %)
1577 |=(% style="text-align: left;" %)(((
1578 Функция
1579 )))|=(% style="text-align: left;" %)(((
1580 Назначение
1581 )))|=(% style="text-align: left;" %)(((
1582 Комментарии
1583 )))
1584 |(% style="text-align: left;" %)(((
1585 {{code language="none"}}
1586 pacs_reader_input(token, data)
1587 {{/code}}
1588 )))|(% style="text-align: left;" %)(((
1589 К считывателю предъявлен идентификатор
1590 )))|(% style="text-align: left;" %)(((
1591 (% class="content-wrapper" %)
1592 (((
1593 Вызывается тогда, когда к считывателю контроллера предъявлен идентификатор.
1594
1595 **ВАЖНО**: проверка идентификатора ещё не осуществлялась. В случае, если данные предъявлены к считывателю Wiegand / 1-Wire, выполняется разбор считанных битов и определение номера карты / кода предприятия в соответствии с системными параметрами {{code language="none"}}other.card_format{{/code}}, {{code language="none"}}other.card_mask{{/code}}.
1596
1597 В первом аргументе {{code language="none"}}token{{/code}} передаётся токен точки доступа, на которой предъявлен идентификатор; во втором аргументе передаётся Lua-таблица с идентификаторами:
1598
1599 {{code}}
1600 {
1601 "facility_code" = "123",
1602 "card_number" = "12345",
1603 "pincode" = "12345"
1604 }
1605 {{/code}}
1606
1607 Если идентификатор отсутствует (например, не вводился пинкод), то соответствующее поле таблицы также отсутствует.
1608
1609 Обычно в коде данной функции выполняется вызов {{code language="none"}}pacs.authenticate{{/code}} для начала транзакции доступа.
1610 )))
1611 )))
1612 |(% style="text-align: left;" %)(((
1613 {{code language="none"}}
1614 pacs_accessed(token, args)
1615 {{/code}}
1616 )))|(% style="text-align: left;" %)(((
1617 Получена внешняя команда на инициацию транзакции доступа.
1618 )))|(% style="text-align: left;" %)(((
1619 (% class="content-wrapper" %)
1620 (((
1621 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1622
1623 Второй аргумент {{code language="none"}}args{{/code}} — параметры разрешения доступа:
1624
1625 {{code}}
1626 {
1627 "use_extended_time" = true,
1628 "access_time_duration" = число (unix-timestamp),
1629 "open_too_long_time_duration" = число (unix-timestamp),
1630 "pre_alarm_time_duration" = число (unix-timestamp)
1631 }
1632 {{/code}}
1633
1634 Подробную спецификацию команды инициации транзакции доступа смотри в спецификациях Onvif.
1635 )))
1636 )))
1637 |(% style="text-align: left;" %)(((
1638 {{code language="none"}}
1639 pacs_granted(token)
1640 {{/code}}
1641 )))|(% style="text-align: left;" %)(((
1642 Доступ разрешён (в результате проверки идентификатора)
1643 )))|(% style="text-align: left;" %)(((
1644 Данная функция-обработчик вызывается тогда, когда вызов {{code language="none"}}pacs.authenticate{{/code}} завершился успешно (если идентификаторы были переданы в {{code language="none"}}pacs.authenticate{{/code}}, то они были верифицированы по базе данных, у пропуска есть все необходимые права и разрешения на доступ).
1645
1646 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1647 )))
1648 |(% style="text-align: left;" %)(((
1649 {{code language="none"}}
1650 pacs_denied(token)
1651 {{/code}}
1652 )))|(% style="text-align: left;" %)(((
1653 Доступ запрещён (в результате проверки идентификатора)
1654 )))|(% style="text-align: left;" %)(((
1655 Данная функция-обработчик вызывается тогда, когда в результате {{code language="none"}}pacs.authenticate{{/code}} принято решение о запрещении доступа.
1656
1657 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1658 )))
1659 |(% style="text-align: left;" %)(((
1660 {{code language="none"}}
1661 pacs_enabled(token)
1662 {{/code}}
1663 )))|(% style="text-align: left;" %)(((
1664 Точка доступа включена (по внешней команде)
1665 )))|(% style="text-align: left;" %)(((
1666 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1667 )))
1668 |(% style="text-align: left;" %)(((
1669 {{code language="none"}}
1670 pacs_disabled(token)
1671 {{/code}}
1672 )))|(% style="text-align: left;" %)(((
1673 Точка доступа отключена (по внешней команде)
1674 )))|(% style="text-align: left;" %)(((
1675 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1676 )))
1677 |(% style="text-align: left;" %)(((
1678 {{code language="none"}}
1679 pacs_identification(token, event)
1680 {{/code}}
1681 )))|(% style="text-align: left;" %)(((
1682 Изменилось состояние ожидания ввода данных в режиме «Карта и пинкод»
1683 )))|(% style="text-align: left;" %)(((
1684 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1685
1686 Второй аргумент {{code language="none"}}event{{/code}} — один из {{code language="none"}}retry{{/code}} (требуется повторный ввод пинкода), {{code language="none"}}card{{/code}} (считана карта, требуется ввод пинкода), {{code language="none"}}timeout{{/code}} (истекло время ожидания ввода пинкода).
1687 )))
1688 |(% style="text-align: left;" %)(((
1689 {{code language="none"}}
1690 pacs_external_locked(token) → boolean
1691 {{/code}}
1692 )))|(% style="text-align: left;" %)(((
1693 Должен быть восстановлен режим работы точки доступа (обычный режим работы)
1694 )))|(% style="text-align: left;" %)(((
1695 Режим работы точки доступа должен быть восстановлен — по внешней команде (из веб-интерфейса или по Onvif; см. Onvif Profile C). Это функция-обработчик для внешней команды, обычно в коде данной функции выполняется вызов {{code language="none"}}pacs_reset{{/code}}.
1696
1697 Функция должна возвращать булевое значение — {{code language="none"}}true{{/code}}, если точка доступа перешла в обычный режим работы, и {{code language="none"}}false{{/code}}, если команда не может быть выполнена.
1698
1699 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1700 )))
1701 |(% style="text-align: left;" %)(((
1702 {{code language="none"}}
1703 pacs_external_unlocked(token) → boolean
1704 {{/code}}
1705 )))|(% style="text-align: left;" %)(((
1706 Точка доступа должна быть разблокирована
1707 )))|(% style="text-align: left;" %)(((
1708 Режим работы точки доступа должен быть изменён на «Разблокировано» — по внешней команде (из веб-интерфейса или по Onvif; см. Onvif Profile C). Это функция-обработчик для внешней команды, обычно в коде данной функции выполняется вызов {{code language="none"}}pacs_unlock{{/code}}.
1709
1710 Функция должна возвращать булевое значение — {{code language="none"}}true{{/code}}, если точка доступа разблокирована, и {{code language="none"}}false{{/code}}, если команда не может быть выполнена.
1711
1712 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1713 )))
1714 |(% style="text-align: left;" %)(((
1715 {{code language="none"}}
1716 pacs_external_blocked(token) → boolean
1717 {{/code}}
1718 )))|(% style="text-align: left;" %)(((
1719 Точка доступа должна быть заблокирована
1720 )))|(% style="text-align: left;" %)(((
1721 Режим работы точки доступа должен быть изменён на «Заблокировано» — по внешней команде (из веб-интерфейса или по Onvif; см. Onvif Profile C). Это функция-обработчик для внешней команды, обычно в коде данной функции выполняется вызов {{code language="none"}}pacs_block{{/code}}.
1722
1723 Функция должна возвращать булевое значение — {{code language="none"}}true{{/code}}, если точка доступа заблокирована, и {{code language="none"}}false{{/code}}, если команда не может быть выполнена.
1724
1725 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1726 )))
1727 |(% style="text-align: left;" %)(((
1728 {{code language="none"}}
1729 pacs_external_authorization(token, decision)
1730 {{/code}}
1731 )))|(% style="text-align: left;" %)(((
1732 Разрешение доступа по внешней команде
1733 )))|(% style="text-align: left;" %)(((
1734 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1735 )))
1736 |(% style="text-align: left;" %)(((
1737 {{code language="none"}}
1738 pacs_input(port, device, type_, id, raw)
1739 {{/code}}
1740 )))|(% style="text-align: left;" %)(((
1741 Изменение состояния элемента периферии
1742 )))|(% style="text-align: left;" %)(((
1743 Параметры {{code language="none"}}port{{/code}} и {{code language="none"}}device{{/code}} всегда константны, значения не имеют.
1744
1745 Параметр {{code language="none"}}type_{{/code}} определяет тип элемента периферии, чьё состояние изменилось. Значение из перечисления {{code language="none"}}fec.TYPE{{/code}} (модуль fec.lua).
1746
1747 Параметр {{code language="none"}}id{{/code}} определяет идентификатор элемента периферии, чьё состояние изменилось. Например, для входов на плате БОРЕЙ это значения от 1 до 8.
1748
1749 Параметр {{code language="none"}}raw{{/code}} содержит «сырое» значение состояния элемента периферии. Способ приведения «сырого» значения к логическому описан ниже в разделе «Изменение состояние периферии).
1750 )))
1751 |(% style="text-align: left;" %)(((
1752 {{code language="none"}}
1753 pacs_cancel_transaction(token)
1754 {{/code}}
1755 )))|(% style="text-align: left;" %)(((
1756 Получена внешняя команда на прерывание транзакции доступа
1757 )))|(% style="text-align: left;" %)(((
1758 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1759 )))
1760
1761 (% style="text-align: left;" %)
1762 \\
1763
1764 {{info title="СОВЕТ"}}
1765 При использовании стандартных алгоритмов «Две односторонних точки доступа», «Одна двусторонняя точка доступа» перечисленные в таблице функции-обработчики //уже определены//, в них выполняется логика стандартных алгоритмов доступа. Пользователь //может переопределить// эти обработчики в своём скрипте. Таким образом, переопределив ВСЕ функции пользователь реализует //полностью свою// логику доступа, НО при этом получит доступ ко всем параметрам, задаваемым для стандартных алгоритмов через веб-интерфейс — через поле {{code language="none"}}pacs.ap{{/code}} (см. раздел «Модель данных» выше).
1766 {{/info}}
1767
1768 (% style="text-align: left;" %)
1769 ===== {{id name="РуководствопоскриптамLua-Изменениесостоянияпериферии"/}}(% style="color: rgb(112,112,112);" %)Изменение состояния периферии(%%) =====
1770
1771 (% style="text-align: left;" %)
1772 При изменении состояния какого-либо элемента периферии (обычно, это различные входы) вызывается функция-обработчик {{code language="none"}}pacs_input{{/code}}. Ниже приведён Lua-код, который позволит в зависимости от типа элемента периферии получить его логическое состояние.
1773
1774 {{code}}
1775 local fec = require("fec")
1776  
1777 -- Логическое состояние элемента
1778 local VALUE = {
1779 OFF = 0,
1780 ON = 1,
1781 SHORT = 2,
1782 BROKEN = 3
1783 }
1784  
1785 -- Получение логического состояния для элемента типа «Сухой контакт»
1786 function get_dry_contact_value(raw, invert)
1787 if raw == 1 then
1788 if invert then
1789 return VALUE.OFF
1790 else
1791 return VALUE.ON
1792 end
1793 else
1794 if invert then
1795 return VALUE.ON
1796 else
1797 return VALUE.OFF
1798 end
1799 end
1800 end
1801  
1802 -- Получение логического состояния для элемента типа «Резистивный шлейф»
1803 function get_rin_value(raw,invert)
1804 if raw <= 17 then -- эмпирический порог резистивного шлейфа
1805 if invert then
1806 return VALUE.OFF
1807 else
1808 return VALUE.ON
1809 end
1810 else
1811 if invert then
1812 return VALUE.ON
1813 else
1814 return VALUE.OFF
1815 end
1816 end
1817 end
1818  
1819 -- Получение логического состояния входов разного типа
1820 -- Дополнительный аргумент invert позволяет обрабатывать настройку вида «нормально-открыт»
1821 function get_input_value(raw, invert, type_)
1822 if (type_ == fec.TYPE.DRY_CONTACT) then
1823 return get_dry_contact_value(raw, invert)
1824 elseif (type_ == fec.TYPE.RADIAL_INPUT) then
1825 return get_rin_value(raw, invert)
1826 else
1827 log_error("invalid type: "..type_)
1828 return 0
1829 end
1830 end
1831 {{/code}}
1832
1833 (% style="text-align: left;" %)
1834 ===== {{id name="РуководствопоскриптамLua-Управлениеточкойдоступа"/}}Управление точкой доступа =====
1835
1836 (% style="text-align: left;" %)
1837 Для управления точкой доступа / транзакцией доступа по выбранной точке доступа предназначены следующие функции:
1838
1839 (% class="wrapped" style="text-align: left;" %)
1840 |=(% style="text-align: left;" %)(((
1841 Функция
1842 )))|=(% style="text-align: left;" %)(((
1843 Назначение
1844 )))|=(% style="text-align: left;" %)(((
1845 Комментарии
1846 )))
1847 |(% style="text-align: left;" %)(((
1848 {{code language="none"}}
1849 pacs.authenticate(token, {...})
1850 {{/code}}
1851 )))|(% style="text-align: left;" %)(((
1852 Выполнить проверку переданных идентификаторов и начать транзакцию доступа
1853 )))|(% style="text-align: left;" %)(((
1854 (% class="content-wrapper" %)
1855 (((
1856 Первый аргумент — токен точки доступа. Второй аргумент — Lua-таблица с идентификаторами (такая же, какая получена в функции-обработчике {{code language="none"}}pacs_reader_input{{/code}}):
1857
1858 {{code}}
1859 {
1860 "facility_code" = "123",
1861 "card_number" = "12345",
1862 "pincode" = "12345",
1863 "transaction_uuid" = "..."
1864 }
1865 {{/code}}
1866
1867 В результате проверки будет вызвана функция обработчик {{code language="none"}}pacs_granted{{/code}} (если доступ разрешён; при этом будет начата транзакция доступа, см. {{code language="none"}}pacs_begin{{/code}}) или {{code language="none"}}pacs_denied{{/code}} (если доступ запрещён).
1868
1869 Если передан transaction_uuid, то соответствующее значение будет использоваться в роли идентификатора транзакции и будет подставлено во все отправляемые извещения. Если значение не будет указано, то будет сгенерирован уникальный UUID транзакции.
1870
1871 **ВАЖНО**: если таблица во втором аргументе будет пуста, то проверка идентификаторов по базе данных проводиться не будет, автоматически будет выдано разрешение на доступ, будет вызвана функция-обработчик {{code language="none"}}pacs_granted{{/code}}.
1872 )))
1873 )))
1874 |(% style="text-align: left;" %)(((
1875 {{code language="none"}}
1876 pacs_reset(token)
1877 {{/code}}
1878 )))|(% style="text-align: left;" %)(((
1879 Восстановить обычный режим работы точки доступа
1880 )))|(% style="text-align: left;" %)(((
1881 Первый аргумент — токен точки доступа.
1882
1883 **ВАЖНО**: текущая транзакция прекращается, все связанные с транзакцией данные (пропуска и пр.) очищаются. Данную функцию обязательно надо вызвать при завершении транзакции доступа.
1884 )))
1885 |(% style="text-align: left;" %)(((
1886 {{code language="none"}}
1887 pacs_block(token)
1888 {{/code}}
1889 )))|(% style="text-align: left;" %)(((
1890 Перевести точку доступа в состояние «Заблокировано»
1891 )))|(% style="text-align: left;" %)(((
1892 Первый аргумент — токен точки доступа.
1893 )))
1894 |(% style="text-align: left;" %)(((
1895 {{code language="none"}}
1896 pacs_unlock(token)
1897 {{/code}}
1898 )))|(% style="text-align: left;" %)(((
1899 Перевести точку доступа в состояние «Разблокировано»
1900 )))|(% style="text-align: left;" %)(((
1901 Первый аргумент — токен точки доступа.
1902 )))
1903 |(% style="text-align: left;" %)(((
1904 {{code language="none"}}
1905 pacs_pause(token)
1906 {{/code}}
1907 )))|(% style="text-align: left;" %)(((
1908 Прекратить приём идентификаторов на точке доступа
1909 )))|(% style="text-align: left;" %)(((
1910 Первый аргумент — токен точки доступа.
1911
1912 Транзакция доступа не прерывается. Обычно используется при переходе в состояния типа «Взлом двери» или «Удержание двери».
1913 )))
1914 |(% style="text-align: left;" %)(((
1915 {{code language="none"}}
1916 pacs_grant(token)
1917 {{/code}}
1918 )))|(% style="text-align: left;" %)(((
1919 Разрешить анонимный доступ и начать анонимную транзакцию доступа
1920 )))|(% style="text-align: left;" %)(((
1921 Обычно применяется для начала транзакции по кнопке выхода.
1922
1923 Поведение отличается от {{code language="none"}}pacs.authenticate{{/code}} + {{code language="none"}}pacs_begin{{/code}} тем, что извещения о событиях доступа будут содержать тему «анонимного доступа».
1924 )))
1925 |(% style="text-align: left;" %)(((
1926 {{code language="none"}}
1927 pacs_notify(token)
1928 {{/code}}
1929 )))|(% style="text-align: left;" %)(((
1930 Отправить извещение с заданным кодом
1931 )))|(% style="text-align: left;" %)(((
1932 Доступный список кодов см. в документации на HTTP-API контроллера в части СКУД.
1933 )))
1934 |(% style="text-align: left;" %)(((
1935 {{code language="none"}}
1936 pacs_update_door_state(token, state)
1937 {{/code}}
1938 )))|(% style="text-align: left;" %)(((
1939 Изменить состояние точки доступа
1940 )))|(% style="text-align: left;" %)(((
1941 (% class="content-wrapper" %)
1942 (((
1943 Первый аргумент — токен точки доступа.
1944
1945 Второй аргумент — Lua-таблица со значением состояния по различным «осям»:
1946
1947 {{code}}
1948 {
1949 "lock" = Unlocked,
1950 "door" = Open,
1951 "mode" = Accessed,
1952 "alarm" = Normal,
1953 }
1954 {{/code}}
1955
1956 Во втором аргументе можно отправлять только те «оси» состояния, которые необходимы. Доступные значения состояния см. в разделе «Общие сведения».
1957 )))
1958 )))
1959
1960 (% style="text-align: left;" %)
1961 ===== {{id name="РуководствопоскриптамLua-Поисквбазеданных"/}}Поиск в базе данных =====
1962
1963 (% style="text-align: left;" %)
1964 Описание временно недоступно.
1965
1966 (% style="text-align: left;" %)
1967 ==== {{id name="РуководствопоскриптамLua-storage.lua"/}}storage.lua ====
1968
1969 (% style="text-align: left;" %)
1970 Модуль предоставляет функции для перманентного сохранения и последующего чтения конфигурационных параметров или параметров скрипта автоматизации.
1971
1972 (% style="text-align: left;" %)
1973 В некоторых случаях может потребоваться сохранять состояние или параметры работы скрипта автоматизации при перезапуске продукта. Или, например, может возникнуть потребность, чтобы определённые параметры были сохранены в резервной копии и восстановлены в случае сбоя файловой системы на IP-контроллере (БОРЕЙ, ЯРС и пр.). Для работы с такими данными и предназначен модуль {{code language="none"}}storage.lua{{/code}}.
1974
1975 (% style="text-align: left;" %)
1976 Модуль позволяет сохранять в персистентное хранилище Lua-таблицы с данными под заданным именем, а впоследствии извлекать их из хранилища по имени. Таблица с данными может содержать только пары «ключ = значение», где «ключ» это всегда строка, а «значение» может быть строкового, числового или булевого типа.
1977
1978 (% style="text-align: left;" %)
1979 Для помещения данных в хранилище предназначена функция {{code language="none"}}storage.set(ключ, данные){{/code}}, для сохранения — {{code language="none"}}storage.save(ключ){{/code}}, для извлечения — {{code language="none"}}storage.get(ключ){{/code}}.
1980
1981 {{info}}
1982 Вызов функции {{code language="none"}}set(...){{/code}} не приводит к сохранению данных, данные только помещаются в хранилище! Данные будут сохранены только после вызова функции {{code language="none"}}save(...){{/code}}.
1983 {{/info}}
1984
1985 (% style="text-align: left;" %)
1986 Пример использования модуля приведён ниже:
1987
1988 {{code}}
1989 local storage = require("storage")
1990  
1991 local my_options = storage.get("my_key")
1992 my_options.param1 = "A"
1993 my_options.param2 = 42
1994 storage.save("my_key")
1995  
1996 local another_options = {
1997 param1 = "B",
1998 param2 = 43
1999 }
2000 storage.set("my_key", another_options) -- my_options более не ссылается на объект в хранилище!
2001 storage.save("my_key")
2002 {{/code}}
2003
2004 (% style="text-align: left;" %)
2005 ==== {{id name="РуководствопоскриптамLua-tenso.lua"/}}tenso.lua ====
2006
2007 (% style="text-align: left;" %)
2008 Описание временно недоступно.
2009
2010 (% style="text-align: left;" %)
2011 ==== {{id name="РуководствопоскриптамLua-timer.lua"/}}timer.lua ====
2012
2013 (% style="text-align: left;" %)
2014 Данный модуль предоставляет для скрипта автоматизации две функции для выполнения отложенных во времени вычислений. Первая функция — это {{code language="none"}}set_timeout{{/code}}. Она предназначена для разового выполнения некоторой Lua-функции спустя заданное количество времени. Вторая функция — {{code language="none"}}set_interval{{/code}}. Она позволяет запланировать выполнение некоторой Lua-функции каждые N миллисекунд. Функция будет выполняться периодически до тех пор, пока задание на выполнение не будет явно отменено (см. {{code language="none"}}clear_interval{{/code}} далее) или Lua-машина не будет перезапущена.
2015
2016 (% style="text-align: left;" %)
2017 Также модуль предоставляет две функции для отмены запланированных ранее заданий: {{code language="none"}}clear_timeout{{/code}} и {{code language="none"}}clear_interval{{/code}}.
2018
2019 {{info title="ЗАМЕЧАНИЕ"}}
2020 Для использования функций модуля не требуется ничего подключать с помощью require. Функции {{code language="none"}}set_timeout{{/code}}, {{code language="none"}}set_interval{{/code}}, {{code language="none"}}clear_timeout{{/code}}, {{code language="none"}}clear_interval{{/code}} доступны глобально в любом месте скрипта автоматизации.
2021 {{/info}}
2022
2023 (% style="text-align: left;" %)
2024 ===== {{id name="РуководствопоскриптамLua-set_timeout"/}}(% style="color: rgb(112,112,112);" %)set_timeout(%%) =====
2025
2026 (% style="text-align: left;" %)
2027 Запланировать вызов указанной Lua-функции спустя заданное количество миллисекунд.
2028
2029 (% style="text-align: left;" %)
2030 Полная сигнатура функции: {{code language="none"}}set_timeout(имя-функции, длительность, ключ){{/code}}, где
2031
2032 (% style="text-align: left;" %)
2033 * имя функции — строка, имя Lua-функции для вызова;
2034 * длительность — число, задержка выполнения функции, в миллисекундах;
2035 * ключ — строка, ключ, по которому можно будет понять в Lua-функции, кто и когда запланировал её отложенный вызов.
2036
2037 (% style="text-align: left;" %)
2038 При вызове {{code language="none"}}set_timeout{{/code}} возвращает уникальный идентификатор созданного задания на отложенное выполнение. Это значение можно использовать в последующем вызове {{code language="none"}}clear_timeout{{/code}} для отмены запланированного ранее задания.
2039
2040 (% style="text-align: left;" %)
2041 Пример:
2042
2043 {{code}}
2044 local log = require("log")
2045 local logger = log.get_logger("script.lua")
2046  
2047 local key1_id = set_timeout("my_timeout", 10000, "key1") -- выполнить my_timeout через 20 секунд с key1
2048 local key2_id = set_timeout("my_timeout", 20000, "key2") -- выполнить my_timeout через 20 секунд с key2
2049  
2050 function my_timeout(key)
2051 if key == "key1" then
2052 logger:debug("stopping timeout on key2")
2053 clear_timeout(key2_id) -- отменяем задание с key2
2054 elif key == "key2" then
2055 logger:error("this should be never invoked")
2056 else
2057 logger:error("unexpected key="..key)
2058 end
2059 end
2060 {{/code}}
2061
2062 (% style="text-align: left;" %)
2063 ===== {{id name="РуководствопоскриптамLua-clear_timeout"/}}clear_timeout =====
2064
2065 (% style="text-align: left;" %)
2066 Функция позволяет отменить ранее запланированное задание: {{code language="none"}}clear_timeout(ID задания){{/code}}, где {{code language="none"}}ID задания{{/code}} — результат выполнения функции {{code language="none"}}set_timeout{{/code}}.
2067
2068 (% style="text-align: left;" %)
2069 ===== {{id name="РуководствопоскриптамLua-set_interval"/}}set_interval =====
2070
2071 (% style="text-align: left;" %)
2072 Сигнатура налогична set_timeout: {{code language="none"}}set_interval(имя-функции, длительность, ключ){{/code}}, где
2073
2074 (% style="text-align: left;" %)
2075 * имя функции — строка, имя Lua-функции для вызова;
2076 * интервал — число, период выполнения функции, в миллисекундах;
2077 * ключ — строка, ключ, по которому можно будет понять в Lua-функции, кто и когда запланировал её отложенный вызов.
2078
2079 {{error title="ВНИМАНИЕ"}}
admin 1.2 2080 Также [[как и в JavaScript>>url:https://learn.javascript.ru/settimeout-setinterval#%D1%80%D0%B5%D0%BA%D1%83%D1%80%D1%81%D0%B8%D0%B2%D0%BD%D1%8B%D0%B9-settimeout||style="" shape="rect"]], рекомендуется избегать использования set_interval, сделав выбор в пользу рекурсивного set_timeout.
pugachevskaya_elena 1.1 2081 {{/error}}
2082
2083 (% style="text-align: left;" %)
2084 ===== {{id name="РуководствопоскриптамLua-clear_interval"/}}(% style="color: rgb(112,112,112);" %)clear_interval(%%) =====
2085
2086 (% style="text-align: left;" %)
2087 Аналогично clear_timeout функция позволяет отменить запланированное ранее периодическое задание: {{code language="none"}}clear_interval(ID задания){{/code}}, где {{code language="none"}}ID задания{{/code}} — результат выполнения функции {{code language="none"}}set_interval{{/code}}.
2088
2089 (% style="text-align: left;" %)
2090 ==== {{id name="РуководствопоскриптамLua-terminal.lua"/}}terminal.lua ====
2091
2092 (% style="text-align: left;" %)
2093 Описание временно недоступно.

Интерфейс НЕЙРОСС