Version 3.1 by admin on 2026/06/07 17:48

Show last authors
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]/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 language="java"}}
281 local log = require("log")
282 {{/code}}
283
284 (% style="text-align: left;" %)
285 Вызвать функцию Lua-модуля в таком случае можно следующим образом, например:
286
287 {{code language="java"}}
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 language="java"}}
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 language="java"}}
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 language="java"}}
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 language="java"}}
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 language="java"}}
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 language="java"}}
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 language="java"}}
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 |=(((
637 Функция
638 )))|=(((
639 Назначение
640 )))|=(((
641 Комментарии
642 )))
643 |(((
644 {{code language="none"}}
645 add_listener(key, listener)
646 {{/code}}
647 )))|(((
648 Добавить объект подписчика
649 )))|(((
650 Функция принимает следующие параметры:
651
652 * {{code language="none"}}key{{/code}} — уникальный идентификатор подписчика, позволяет впоследствии «удалить» подписчика по указанному ключу, см. {{code language="none"}}remove_listener{{/code}};
653 * {{code language="none"}}listener{{/code}} — Lua-таблица (объект) с функцией-методом {{code language="none"}}on_loninput_input_state_changed{{/code}}; требования к таблице подписчика приведены ниже.
654 )))
655 |(((
656 {{code language="none"}}
657 remove_listener(key)
658 {{/code}}
659 )))|(((
660 Удалить объект подписчика
661 )))|(((
662 Единственный аргумент {{code language="none"}}key{{/code}} указывает на добавленного ранее подписчика, которого необходимо «отписать» от получения уведомлений.
663 )))
664
665 Каждый объект-подписчик должен быть представлен Lua-таблицей с функцией {{code language="none"}}on_loninput_input_state_changed(device_address, input_index, raw_state, logical_state){{/code}}.
666
667 Данная функция будет вызвана:
668
669 1. при изменении состояния входа какого-либо модуля расширения,
670 1. сразу в процессе добавления подписчика через {{code language="none"}}add_listener{{/code}} для всех входов всех модулей (что позволяет получить текущее состояние нужных входов в момент добавления подписчика).
671
672 В функцию {{code language="none"}}on_loninput_input_state_changed{{/code}} передаются следующие параметры:
673
674 |=(((
675 Параметр
676 )))|=(((
677 Тип данных
678 )))|=(((
679 Описание
680 )))
681 |(((
682 {{code language="none"}}
683 device_address
684 {{/code}}
685 )))|(((
686 Число
687 )))|(((
688 Адрес устройства, к которому относится вход (зона)
689 )))
690 |(((
691 {{code language="none"}}
692 input_index
693 {{/code}}
694 )))|(((
695 Число
696 )))|(((
697 Индекс входа (зоны), которому соответствует состояние
698 )))
699 |(((
700 {{code language="none"}}
701 raw_state
702 {{/code}}
703 )))|(((
704 Число
705 )))|(((
706 Технический код состояния входа (зоны), полученный от модуля; возможные коды перечислены в таблице {{code language="none"}}RAW_INPUT_STATE{{/code}}
707 )))
708 |(((
709 {{code language="none"}}
710 logical_state
711 {{/code}}
712 )))|(((
713 Число
714 )))|(((
715 Логическое состояние входа значения из перечисления {{code language="none"}}LOGICAL_INPUT_STATE{{/code}}
716 )))
717
718 Логическое состояние входа может быть следующим:
719
720 * 0 ({{code language="none"}}LOGICAL_INPUT_STATE.UNKNOWN{{/code}}) — значение не известно;
721 * 1 ({{code language="none"}}LOGICAL_INPUT_STATE.OFF{{/code}}) — вход выключен, нормальное состояние (логический 0);
722 * 2 ({{code language="none"}}LOGICAL_INPUT_STATE.ON{{/code}}) — вход включен, тревожное состояние (логическая 1).
723
724 (% style="text-align: left;" %)
725 ==== {{id name="РуководствопоскриптамLua-lonpacs.lua"/}}lonpacs.lua ====
726
727 Модуль предоставляет API для интеграции с подсистемой доступа модулей расширения ЯРС, таких как МДС и М2. Модуль позволяет модифицировать стандартные алгоритмы доступа.
728
729 {{info}}
730 Подсистема доступа в модулях расширения ЯРС по своей структуре и поведению отвечает требованиям спецификаций Onvif (Profile C, Access Control Service, Door Control Service). В частности, состояние точек доступа, команды управления ими и другие аспекты отвечают указанным спецификациям. Рекомендуется ознакомиться с данными спецификациями перед использованием модуля {{code language="none"}}lonpacs.lua{{/code}}.
731 {{/info}}
732
733 Получить список точек доступа с их идентификаторами можно через поле {{code language="none"}}lonpacs.ap_instance{{/code}}, которое заполняется при инициализации модуля и виртуальной Lua-машины (до того, как будет выполняться пользовательский Lua-скрипт). Поле {{code language="none"}}lonpacs.ap_instance{{/code}} содержит Lua-таблицу, в которой ключами являются токены точек доступа, а значениями — Lua-таблицы с системными параметрами точек доступа. Структура таблицы представлена в коде ниже:
734
735 {{code language="java"}}
736 lonpacs.ap = {
737 "токен первой точки доступа" = {
738 ...
739 },
740 "токен второй точки доступа" = {
741 ...
742 },
743 ... -- и так далее
744 }
745 {{/code}}
746
747 Каждая точка доступа в списке — это либо точка доступа модуля расширения МДС, либо одна из точек доступа М2.
748
749 ===== {{id name="РуководствопоскриптамLua-Управлениеточкойдоступа"/}}Управление точкой доступа =====
750
751 Для управления точками доступа на модулях расширения доступна функция {{code language="none"}}transmit_status(token, status){{/code}}, которая позволяет отправлять модулям команды управления. Функция принимает следующие параметры:
752
753 |=(((
754 Параметр
755 )))|=(((
756 Тип
757 )))|=(((
758 Описание
759 )))
760 |(((
761 {{code language="none"}}
762 token
763 {{/code}}
764 )))|(((
765 Строка
766 )))|(((
767 Идентификатор (токен) точки доступа, которой необходимо управлять
768 )))
769 |(((
770 {{code language="none"}}
771 status
772 {{/code}}
773 )))|(((
774 Число
775 )))|(((
776 Команда управления (требуемый статус точки доступа); значение из перечисления {{code language="none"}}lonpacs.AP_COMMAND{{/code}} (см. ниже)
777 )))
778
779 Для управления точкам доступа доступны следующие команды (значения параметра {{code language="none"}}status{{/code}}):
780
781 |=(((
782 Команда
783 )))|=(((
784 Значение
785 )))|=(((
786 Описание
787 )))
788 |(((
789 {{code language="none"}}
790 STATUS_QUERY
791 {{/code}}
792 )))|(((
793 -1
794 )))|(((
795 Запрос состояния точки доступа
796 )))
797 |(((
798 {{code language="none"}}
799 RESTORE
800 {{/code}}
801 )))|(((
802 12
803 )))|(((
804 Переключиться в дежурный режим работы
805 )))
806 |(((
807 {{code language="none"}}
808 OPEN_BLOCKED
809 {{/code}}
810 )))|(((
811 21
812 )))|(((
813 Разблокировать точку доступа
814 )))
815 |(((
816 {{code language="none"}}
817 CLOSE_BLOCKED
818 {{/code}}
819 )))|(((
820 22
821 )))|(((
822 Заблокировать точку доступа
823 )))
824 |(((
825 {{code language="none"}}
826 DISABLE
827 {{/code}}
828 )))|(((
829 13
830 )))|(((
831 \\
832 )))
833 |(((
834 {{code language="none"}}
835 INITIATE_PASS
836 {{/code}}
837 )))|(((
838 18
839 )))|(((
840 Инициировать проход
841 )))
842
843 ===== {{id name="РуководствопоскриптамLua-Состояниеточкидоступа"/}}Состояние точки доступа =====
844
845 Модуль {{code language="none"}}lonpacs.lua{{/code}} позволяет «подписаться» на события изменения состояния точек доступа, мониторинга связи с точками доступа, изменения состояния прохода (фазы алгоритма прохода). Для управления «подписчиками» в модуле доступны следующие функции:
846
847 |=(((
848 Функция
849 )))|=(((
850 Назначение
851 )))|=(((
852 Комментарии
853 )))
854 |(((
855 {{code language="none"}}
856 add_listener(key, listener)
857 {{/code}}
858 )))|(((
859 Добавить объект подписчика
860 )))|(((
861 Функция принимает следующие параметры:
862
863 * {{code language="none"}}key{{/code}} — уникальный идентификатор подписчика, позволяет впоследствии «удалить» подписчика по указанному ключу, см. {{code language="none"}}remove_listener{{/code}};
864 * {{code language="none"}}listener{{/code}} — Lua-таблица (объект) с функциями-обработчиками изменений; требования к таблице подписчика приведены ниже.
865 )))
866 |(((
867 {{code language="none"}}
868 remove_listener(key)
869 {{/code}}
870 )))|(((
871 Удалить объект подписчика
872 )))|(((
873 Единственный аргумент {{code language="none"}}key{{/code}} указывает на добавленного ранее подписчика, которого необходимо «отписать» от получения уведомлений.
874 )))
875
876 Каждый объект-подписчик должен быть представлен Lua-таблицей со следующими функциями:
877
878 (% class="relative-table wrapped" style="width: 100.0%;" %)
879 |=(% style="width: 27.5219%;" %)(((
880 Функция
881 )))|=(% style="width: 25.4934%;" %)(((
882 Назначение
883 )))|=(% style="width: 46.9846%;" %)(((
884 Комментарии
885 )))
886 |(% style="width: 27.5219%;" %)(((
887 {{code language="none"}}
888 lonpacs_on_ap_status_changed(token, ap_status)
889 {{/code}}
890 )))|(% style="width: 25.4934%;" %)(((
891 Получение и обработка изменений состояния точки доступа
892 )))|(% style="width: 46.9846%;" %)(((
893 В функцию передаются следующие параметры:
894
895 * {{code language="none"}}token{{/code}} (строка) — уникальный идентификатор (токен) точки доступа;
896 * {{code language="none"}}ap_status{{/code}} (число) — код состояния точки доступа; значение из перечисления {{code language="none"}}lonpacs.AP_STATUS {{/code}}(см. ниже);
897 )))
898 |(% style="width: 27.5219%;" %)(((
899 {{code language="none"}}
900 lonpacs_on_pass_status_changed(token, status, notify_key)
901 {{/code}}
902 )))|(% style="width: 25.4934%;" %)(((
903 Получение и обработка изменений состояния алгоритма прохода
904 )))|(% style="width: 46.9846%;" %)(((
905 В функцию передаются следующие параметры:
906
907 * {{code language="none"}}token{{/code}} (строка) — уникальный идентификатор (токен) точки доступа;
908 * {{code language="none"}}status{{/code}} (число) — код состояния алгоритма прохода (см. ниже);
909 * {{code language="none"}}notify_key{{/code}} (строка) — код уведомления для отправки соответствующего извещения (возможного вызова {{code language="none"}}lonpacs.notify{{/code}}).
910 )))
911 |(% style="width: 27.5219%;" %)(((
912 {{code language="none"}}
913 lonpacs_on_connection_changed(token, connection)
914 {{/code}}
915 )))|(% style="width: 25.4934%;" %)(((
916 Получение и обработка изменений состояния связи с точкой доступа
917 )))|(% style="width: 46.9846%;" %)(((
918 В функцию передаются следующие параметры:
919
920 * {{code language="none"}}token{{/code}} (строка) — уникальный идентификатор (токен) точки доступа;
921 * {{code language="none"}}connection{{/code}} (число) — состояние связи, возможные значения определены в перечислении {{code language="none"}}lonpacs.CONNECTION{{/code}}:
922 ** 0 ({{code language="none"}}ONLINE{{/code}}) — точка доступа на связи;
923 ** 1 ({{code language="none"}}OFFLINE{{/code}}) — не связи с точкой доступа;
924 ** 2 ({{code language="none"}}UNKNOWN{{/code}}) — состояние связи неизвестно.
925 )))
926
927 Параметр {{code language="none"}}ap_status{{/code}} может принимать одно из следующих значений:
928
929 |=(((
930 Состояние точки доступа
931 )))|=(((
932 Значение
933 )))|=(((
934 Описание
935 )))
936 |(((
937 {{code language="none"}}
938 USER_QUERY
939 {{/code}}
940 )))|(((
941 0
942 )))|(((
943 Точка доступа в состоянии ожидания транзакции
944 )))
945 |(((
946 {{code language="none"}}
947 FORCE_OPEN
948 {{/code}}
949 )))|(((
950 1
951 )))|(((
952 Взлом двери
953 )))
954 |(((
955 {{code language="none"}}
956 EPB
957 {{/code}}
958 )))|(((
959 2
960 )))|(((
961 Старт транзакции прохода по кнопке выхода
962 )))
963 |(((
964 {{code language="none"}}
965 HOLD_OPEN
966 {{/code}}
967 )))|(((
968 5
969 )))|(((
970 Дверь удержана открытой (удержание двери)
971 )))
972 |(((
973 {{code language="none"}}
974 DENIAL
975 {{/code}}
976 )))|(((
977 6
978 )))|(((
979 (% style="text-align: left;" %)
980 Завершение транзакции прохода:
981
982 (% style="text-align: left;" %)
983 * истек таймаут ожидания ответа от базы данных
984 * отказ от базы данных
985 * невалидный уровень доступа пользователя в ответе от базы данных
986 * невалидная временная зона в уровне доступа пользователя
987 )))
988 |(((
989 {{code language="none"}}
990 OPEN
991 {{/code}}
992 )))|(((
993 10
994 )))|(((
995 Дверь открыта при совершении прохода
996 )))
997 |(((
998 {{code language="none"}}
999 DISABLE
1000 {{/code}}
1001 )))|(((
1002 13
1003 )))|(((
1004 (% style="text-align: left;" %)
1005 Точка доступа в состоянии "заблокирована".
1006
1007 (% style="text-align: left;" %)
1008 * дверной контакт не работает
1009 * кнопка выхода не работает
1010 * входные сообщения от считывателя игнорируются.
1011 )))
1012 |(((
1013 {{code language="none"}}
1014 DOOR_CLOSED
1015 {{/code}}
1016 )))|(((
1017 15
1018 )))|(((
1019 (% style="text-align: left;" %)
1020 * Снята тревога "взлом двери" (дверь закрыта)
1021
1022 (% style="text-align: left;" %)
1023 * Дверь закрыта при при завершении транзакции прохода через точку доступа
1024 )))
1025 |(((
1026 {{code language="none"}}
1027 INITIATE_PASS
1028 {{/code}}
1029 )))|(((
1030 18
1031 )))|(((
1032 (% style="text-align: left;" %)
1033 Старт транзакции прохода пользователя (при получении разрешения на доступ).
1034
1035 (% style="text-align: left;" %)
1036 Точка доступа переходит в состояние ожидания открытия двери.
1037 )))
1038 |(((
1039 {{code language="none"}}
1040 OPEN_BLOCKED
1041 {{/code}}
1042 )))|(((
1043 21
1044 )))|(((
1045 (% style="text-align: left;" %)
1046 Точка доступа в состоянии "открыта и заблокирована":
1047
1048 (% style="text-align: left;" %)
1049 * замок двери открыт
1050 * кнопка выхода не работает
1051 * дверной контакт не работает
1052 * входные сообщения от считывателя игнорируются
1053
1054 (% style="text-align: left;" %)
1055 Текущая транзакция пользователя обрывается.
1056 )))
1057 |(((
1058 {{code language="none"}}
1059 CLOSE_BLOCKED
1060 {{/code}}
1061 )))|(((
1062 22
1063 )))|(((
1064 (% style="text-align: left;" %)
1065 Точка доступа в состоянии "закрыта и заблокирована":
1066
1067 * кнопка выхода не работает
1068 * дверной контакт работает
1069 * входные сообщения от считывателя игнорируются
1070
1071 (% style="text-align: left;" %)
1072 Текущая транзакция пользователя обрывается.
1073 )))
1074 |(((
1075 {{code language="none"}}
1076 LOCK_ACTUATOR_ERROR
1077 {{/code}}
1078 )))|(((
1079 32
1080 )))|(((
1081 Неисправное состояние замка (не является состоянием точки доступа)
1082 )))
1083 |(((
1084 {{code language="none"}}
1085 BLOCKED_HOLD_OPEN
1086 {{/code}}
1087 )))|(((
1088 53
1089 )))|(((
1090 Удержание двери точки доступа в состоянии "закрыта и заблокирована"
1091 )))
1092 |(((
1093 {{code language="none"}}
1094 BLOCKED_FORCE_OPEN
1095 {{/code}}
1096 )))|(((
1097 54
1098 )))|(((
1099 Взлом двери точки доступа в состоянии "закрыта и заблокирована"
1100 )))
1101 |(((
1102 {{code language="none"}}
1103 ARMED_CLOSE_BLOCKED
1104 {{/code}}
1105 )))|(((
1106 105
1107 )))|(((
1108 (% style="text-align: left;" %)
1109 Точка доступа в состоянии "закрыта и заблокирована постановкой под охрану связанной группы зон":
1110
1111 * кнопка выхода не работает
1112 * дверной контакт работает
1113 * считыватель работает
1114
1115 Текущая транзакция пользователя обрывается.
1116 )))
1117 |(((
1118 ##ARMED_CLOSE_BLOCKED_FORCE_OPEN(%%)##
1119 )))|(((
1120 106
1121 )))|(((
1122 (% style="text-align: left;" %)
1123 Взлом двери точки доступа в состоянии "закрыта и заблокирована постановкой под охрану связанной группы зон"
1124 )))
1125
1126 {{code language="none"}}ap_status{{/code}} определяет интегральное состояние составляющих точку доступа элементов (замок, дверной контакт). Для получения состояния этих элементов нужно использовать функцию {{code language="none"}}lonpacs.parse_ap_status(ap_status){{/code}}.
1127
1128 Функция {{code language="none"}}parse_ap_status{{/code}} возвращает Lua-таблицу следующего вида:
1129
1130 {{code language="java"}}
1131 {
1132 door_state = ..
1133 lock_state = ..
1134 mode = ..
1135 alarm = ..
1136 }
1137 {{/code}}
1138
1139 где значение полей таблицы следующее:
1140
1141 |=(((
1142 Поле
1143 )))|=(((
1144 Описание
1145 )))|=(((
1146 Возможные значения
1147 )))
1148 |(((
1149 {{code language="none"}}
1150 door_state
1151 {{/code}}
1152 )))|(((
1153 Состояние двери (открыта, закрыта, ...)
1154 )))|(((
1155 Возможные значения определены в {{code language="none"}}lonpacs.AP_DOOR_PHYSICAL_STATE{{/code}}:
1156
1157 * {{code language="none"}}UNKNOWN{{/code}} — состояние неизвестно;
1158 * {{code language="none"}}OPEN{{/code}} — дверь открыта;
1159 * {{code language="none"}}CLOSED{{/code}} — дверь закрыта;
1160 * {{code language="none"}}FAULT{{/code}} — неисправность двери.
1161 )))
1162 |(((
1163 {{code language="none"}}
1164 lock_state
1165 {{/code}}
1166 )))|(((
1167 Состояние замка
1168 )))|(((
1169 Возможные значения определены в {{code language="none"}}lonpacs.AP_LOCK_STATE{{/code}}:
1170
1171 * {{code language="none"}}UNKNOWN{{/code}} — состояние неизвестно;
1172 * {{code language="none"}}LOCKED{{/code}} — закрыт;
1173 * {{code language="none"}}UNLOCKED{{/code}} — открыт;
1174 * {{code language="none"}}FAULT{{/code}} — неисправность замка.
1175 )))
1176 |(((
1177 {{code language="none"}}
1178 mode
1179 {{/code}}
1180 )))|(((
1181 Режим точки доступа (разблокирована, заблокирована, ...)
1182 )))|(((
1183 Возможные значения определены в {{code language="none"}}lonpacs.AP_MODE{{/code}}:
1184
1185 * {{code language="none"}}UNKNOWN{{/code}} — состояние неизвестно;
1186 * {{code language="none"}}LOCKED{{/code}} — дежурный режим;
1187 * {{code language="none"}}UNLOCKED{{/code}} — разблокирована;
1188 * {{code language="none"}}ACCESSED{{/code}} — проход;
1189 * {{code language="none"}}BLOCKED{{/code}} — заблокирована.
1190 )))
1191 |(((
1192 {{code language="none"}}
1193 alarm
1194 {{/code}}
1195 )))|(((
1196 Состояние тревоги точки доступа (удержана дверь и др.)
1197 )))|(((
1198 Возможные значения определены в {{code language="none"}}lonpacs.AP_ALARM_STATE{{/code}}:
1199
1200 * {{code language="none"}}UNKNOWN{{/code}} — неизвестно;
1201 * {{code language="none"}}NORMAL{{/code}} — норма;
1202 * {{code language="none"}}DOOR_OPEN_TOO_LONG{{/code}} — удержание двери;
1203 * {{code language="none"}}DOOR_FORCED_OPEN{{/code}} — взлом двери.
1204 )))
1205
1206 (% style="text-align: left;" %)
1207 Значение кода состояния алгоритма прохода (фазы прохода) {{code language="none"}}status, {{/code}}полученного в функции {{code language="none"}}lonpacs_on_pass_status_changed(token, status, notify_key),{{/code}} может принимать одно из следующих значений:
1208
1209 |=(((
1210 Код (условный)
1211 )))|=(((
1212 Принимаемое значение
1213 )))|=(((
1214 Описание
1215 )))
1216 |(((
1217 {{code language="none"}}
1218 ACS_DENIED
1219 {{/code}}
1220 )))|(% style="text-align: center;" %)(((
1221 42
1222 )))|(((
1223 Доступ запрещен
1224 )))
1225 |(((
1226 {{code language="none"}}
1227 NO_PASS
1228 {{/code}}
1229 )))|(% style="text-align: center;" %)(((
1230 3
1231 )))|(((
1232 Проход не совершен
1233 )))
1234 |(((
1235 {{code language="none"}}
1236 PASS
1237 {{/code}}
1238 )))|(% style="text-align: center;" %)(((
1239 4
1240 )))|(((
1241 Проход совершен
1242 )))
1243 |(((
1244 {{code language="none"}}
1245 ACS_ID_PRESENT
1246 {{/code}}
1247 )))|(% style="text-align: center;" %)(((
1248 95
1249 )))|(((
1250 Предъявлен идентификатор СКУД (запрос пользователя СКУД в базе ЯРС)
1251 )))
1252 |(((
1253 {{code language="none"}}
1254 ARM_ID_PRESENT
1255 {{/code}}
1256 )))|(% style="text-align: center;" %)(((
1257 107
1258 )))|(((
1259 Предъявлен идентификатор для управления постановкой на охрану связанной группы зон
1260 )))
1261 |(((
1262 {{code language="none"}}
1263 DISARM_ID_PRESENT
1264 {{/code}}
1265 )))|(% style="text-align: center;" %)(((
1266 108
1267 )))|(((
1268 Предъявлен идентификатор для управления снятием с охраны связанной группы зон
1269 )))
1270 |(((
1271 {{code language="none"}}
1272 REPEATED_PRESENT
1273 {{/code}}
1274 )))|(% style="text-align: center;" %)(((
1275 59
1276 )))|(((
1277 Повторное предъявление идентификатора в ходе транзакции СКУД
1278 )))
1279
1280 (% style="text-align: left;" %)
1281 ==== {{id name="РуководствопоскриптамLua-pacs.lua"/}}pacs.lua ====
1282
1283 (% style="text-align: left;" %)
1284 Модуль предоставляет API для интеграции с подсистемой доступа (только для контроллеров БОРЕЙ и ЯРС). Модуль позволяет либо модифицировать стандартные алгоритмы доступа, либо реализовать собственный алгоритм.
1285
1286 {{info}}
1287 Подсистема доступа в контроллерах БОРЕЙ, ЯРС по своей структуре и поведению отвечает требованиям спецификаций Onvif (Profile C, Access Control Service, Door Control Service). В частности, состояние точек доступа, команды управления ими и другие аспекты отвечают указанным спецификациям. Рекомендуется ознакомиться с данными спецификациями перед использованием модуля {{code language="none"}}pacs.lua{{/code}}.
1288 {{/info}}
1289
1290 (% style="text-align: left;" %)
1291 ===== {{id name="РуководствопоскриптамLua-Общиесведения"/}}Общие сведения =====
1292
1293 (% style="text-align: left;" %)
1294 Подсистема доступа в контроллерах БОРЕЙ, ЯРС поддерживает две точки доступа (поддержка дополнительных точек доступа на модулях расширения ЯРС осуществляется в Lua-модуле lonpacs.lua). Соответственно, первый считыватель относится к первой точке доступа, а второй — ко второй. У каждой точки доступа есть строковой уникальный идентификатор, называемый //токеном//.
1295
1296 (% style="text-align: left;" %)
1297 Получить список точек доступа с их идентификаторами можно через поле {{code language="none"}}pacs.ap{{/code}}, которое заполняется при инициализации модуля и виртуальной Lua-машины (до того, как будет выполняться пользовательский Lua-скрипт). Поле {{code language="none"}}pacs.ap{{/code}} содержит Lua-таблицу, в которой ключами являются токены точек доступа, а значениями — Lua-таблицы с системными параметрами точек доступа. Структура таблицы представлена в коде ниже:
1298
1299 {{code language="java"}}
1300 pacs.ap = {
1301 "токен первой точки доступа" = {
1302 "#" = 0,
1303 ...
1304 },
1305 "токен второй точки доступа" = {
1306 "#" = 1,
1307 ...
1308 }
1309 }
1310 {{/code}}
1311
1312 (% style="text-align: left;" %)
1313 Соответственно, для перебора точек доступа (например, чтобы для каждой точки доступа проинциализировать свой алгоритм) удобно использовать следующий код:
1314
1315 {{code language="java"}}
1316 for key,item in pairs(pacs.ap) do
1317 if item["#"] == 0 or item["#"] == 1 then
1318 -- код обработки точки доступа с токеном = key
1319 else
1320 logger:error("unexpected access point number; #="..item["#"].."; token="..key)
1321 end
1322 end
1323 {{/code}}
1324
1325 (% style="text-align: left;" %)
1326 В контроллере БОРЕЙ точек доступа всегда ровно две, с номерами 0 и 1. Точка доступа с номером 0 (у которой значение свойства {{code language="none"}}pacs.ap["токен"]["#"]{{/code}} равно 0 — это первая точка доступа), точка доступа с номером 1 — вторая.
1327
1328 (% style="text-align: left;" %)
1329 В настройках доступа у контроллера можно выбрать «Режим работы» — «Две односторонние», «Одна двусторонняя», «Пользовательский». В стандартных режимах работы «Две односторонние» и «Одна двусторонняя» программные средства самостоятельно реализуют алгоритм доступа, таблицы параметров ({{code language="none"}}pacs.ap["токен"]{{/code}}) содержат параметры, которые пользователь может изменить через веб-приложение. В режиме «Пользовательский» таблицы параметров по умолчанию обычно пусты.
1330
1331 {{info title="ВНИМАНИЕ"}}
1332 Для реализации собственной логики доступа с помощью Lua-скриптов пользователю __следует выбрать__ в настройках контроллера режим = «Пользовательский». В этом режиме //системные параметры// алгоритма доступа (которые обрабатываются не в Lua-скрипте, а в основных программных средствах) не задаются через веб-интерфейс, и должны быть определены пользователем прямо в Lua-скрипте. Инструкция по установке системных параметров приведена в разделе «Изменение системных параметров» далее.
1333 {{/info}}
1334
1335 (% style="text-align: left;" %)
1336 Управление состоянием точки доступа, а также режимом её работы (начало транзакции доступа, завершение транзакции и так далее) осуществляется из Lua-скрипта. Соответствующие функции описаны в разделе «Управление точкой доступа».
1337
1338 (% style="text-align: left;" %)
1339 В каждый момент времени состояние точки доступа описывается N-мерным вектором:
1340
1341 (% class="wrapped" style="text-align: left;" %)
1342 |(% style="text-align: left;" %)(((
1343 Режим работы точки доступа
1344 )))|(% style="text-align: left;" %)(((
1345 1. Дежурный / Ожидание прохода (Locked)
1346 1. Выполняется проход (Accessed)
1347 1. Заблокировано (Blocked)
1348 1. Разблокировано (Unlocked)
1349 )))|(% style="text-align: left;" %)(((
1350 1. Режим Locked устанавливается в программных средствах при сбросе транзакции доступа (см. {{code language="none"}}pacs_reset{{/code}}).
1351 1. Режимы Blocked / Unlocked устанавливаются по командам блокировки / разблокировки точки доступа (см. {{code language="none"}}pacs_block{{/code}}, {{code language="none"}}pacs_unlock{{/code}}).
1352 1. Режим Accessed должен быть установлен из Lua-скрипта в момент начала доступа (открытия двери).
1353
1354 \\
1355 )))
1356 |(% style="text-align: left;" %)(((
1357 Состояние двери
1358 )))|(% style="text-align: left;" %)(((
1359 Неизвестно (Unknown)
1360 Открыто (Open)
1361 Закрыто (Closed)
1362 Неисправность (Fault)
1363 )))|(% style="text-align: left;" %)(((
1364 Определяется из Lua-скрипта.
1365 )))
1366 |(% style="text-align: left;" %)(((
1367 Состояние замка
1368 )))|(% style="text-align: left;" %)(((
1369 Неизвестно (Unknown)
1370 Открыт (Unlocked)
1371 Закрыт (Locked)
1372 Неисправность (Fault)
1373 )))|(% style="text-align: left;" %)(((
1374 Определяется из Lua-скрипта.
1375 )))
1376 |(% style="text-align: left;" %)(((
1377 Тревожный статус
1378 )))|(% style="text-align: left;" %)(((
1379 Норма (Normal)
1380 Взлом двери (DoorForcedOpen)
1381 Удержание двери (DoorOpenTooLong)
1382 )))|(% style="text-align: left;" %)(((
1383 Определяется из Lua-скрипта.
1384 )))
1385 |(% style="text-align: left;" %)(((
1386 Статус тампера
1387 )))|(% style="text-align: left;" %)(((
1388 Неизвестно (Unknown)
1389 Корпус закрыт (NotInTamper)
1390 Вскрытие корпуса (TamperDetected)
1391 )))|(% style="text-align: left;" %)(((
1392 Автоматически определяется программными средствами по факту вскрытия / закрытия корпуса контроллера.
1393
1394 Не следует управлять этой осью состояния из Lua-скрипта.
1395 )))
1396
1397 (% style="text-align: left;" %)
1398 Точки доступа поддерживают внешние команды управления блокировки, разблокировки, восстановления режима, включения / отключения, разрешения и подтверждения доступа. При обработке таких команд программные средства передают управление в Lua-скрипт. Также при предъявлении идентификатора, изменении состояния периферии (входов), выполенении внешних команд над точками доступа и т.д. подсистема доступа передаёт управление в Lua-скрипт. Пользователь может запрограммировать реакцию на соответствующие события с помощью функций-обработчиков (см. раздел «Функции-обработчики»).
1399
1400 (% style="text-align: left;" %)
1401 Через каждую точку доступа в один момент времени может осуществляться одна транзакция доступа. Транзакция доступа — это процесс, который начинается с момента идентификации доступа, и завершается при возврате точки доступа в начальное состояние. В случае удержания двери транзакция доступа __продолжается__.
1402
1403 (% style="text-align: left;" %)
1404 Транзакция доступа начинается либо вызовом {{code language="none"}}pacs.authenticate{{/code}} в случае разрешения доступа, либо по вызову {{code language="none"}}pacs_grant{{/code}} (для случая анонимного доступа). Завершается транзакция по вызову {{code language="none"}}pacs_reset{{/code}}. Соответствующие функции описаны в разделе «Управление точкой доступа».
1405
1406 (% style="text-align: left;" %)
1407 В процессе транзакции сохраняются идентификационные признаки посетителя и прочая информация, эти данные подставляются во все извещения, формируемые контроллером.
1408
1409 (% style="text-align: left;" %)
1410 Часть извещений (в основном о запрещении доступа) формируются программными средствами. Пользователь также может в любой момент времени отправить извещение из Lua-скрипта с помощью функции {{code language="none"}}pacs_notify{{/code}}, с указанием кода извещения. Для отправки доступно более полусотни извещений. Полный список доступных для отправки извещений приведён в документации на HTTP-API контроллера в части СКУД.
1411
1412 (% style="text-align: left;" %)
1413 ===== {{id name="РуководствопоскриптамLua-Изменениесистемныхпараметров"/}}Изменение системных параметров =====
1414
1415 (% style="text-align: left;" %)
1416 В режиме доступа «Пользовательский» для реализации алгоритма может потребоваться задать из Lua-скрипта для каждой точки доступа системные параметры. Для указания параметров из Lua-скрипта предназначена функция {{code language="none"}}pacs.set_configuration(token, {...}){{/code}}, в первом аргументе необходимо передать токен точки доступа, во втором аргументе — Lua-таблицу с параметрами. Например:
1417
1418 {{code language="java"}}
1419 for key,item in pairs(pacs.ap) do
1420 local configuration = {}
1421 configuration["input.mode"] = "card"
1422 pacs.set_configuration(key, configuration)
1423 end
1424 {{/code}}
1425
1426 (% style="text-align: left;" %)
1427 Ниже приведены основные системные параметры, которые можно / нужно настраивать:
1428
1429 (% class="wrapped" style="text-align: left;" %)
1430 |=(% style="text-align: left;" %)(((
1431 Параметр
1432 )))|=(% style="text-align: left;" %)(((
1433 Ключ
1434 )))|=(% style="text-align: left;" %)(((
1435 Значение
1436 )))|=(% style="text-align: left;" %)(((
1437 Описание
1438 )))
1439 |(% style="text-align: left;" %)(((
1440 Режим идентификации
1441 )))|(% style="text-align: left;" %)(((
1442 {{code language="none"}}
1443 input.mode
1444 {{/code}}
1445 )))|(% style="text-align: left;" %)(((
1446 Одно значение из: {{code language="none"}}card{{/code}}, {{code language="none"}}pincode{{/code}}, {{code language="none"}}card_and_pincode{{/code}}, {{code language="none"}}card_or_pincode{{/code}}
1447 )))|(% style="text-align: left;" %)(((
1448 Позволяет определить требуемый режим идентификации — какие идентификаторы посетителя ожидаются на вход + как они будут проверяться.
1449
1450 **ВНИМАНИЕ**: этот параметр __необходимо__ задать, если из Lua-скрипта будет вызвана функция {{code language="none"}}pacs_authenticate{{/code}} с передачей идентификаторов посетителя; в противном случае идентификаторы не будут верифицированы по базе данных контроллера, доступ безусловно будет запрещён.
1451 )))
1452 |(% style="text-align: left;" %)(((
1453 Число попыток ввода данных
1454 )))|(% style="text-align: left;" %)(((
1455 {{code language="none"}}
1456 input.retry_limit
1457 {{/code}}
1458 )))|(% style="text-align: left;" %)(((
1459 Целое число больше 0
1460 )))|(% style="text-align: left;" %)(((
1461 В случае, если input.mode равен {{code language="none"}}card_and_pincode{{/code}} — определяет количество попыток ввода пинкода после предъявления карты.
1462 )))
1463 |(% style="text-align: left;" %)(((
1464 Время ожидания ввода данных
1465 )))|(% style="text-align: left;" %)(((
1466 {{code language="none"}}
1467 input.retry_timeout
1468 {{/code}}
1469 )))|(% style="text-align: left;" %)(((
1470 Целое число больше 0, в секундах
1471 )))|(% style="text-align: left;" %)(((
1472 В случае, если input.mode равен {{code language="none"}}card_and_pincode{{/code}} — определяет время ожидания ввода пинкода после предъявления карты.
1473 )))
1474 |(% style="text-align: left;" %)(((
1475 Формат карты
1476 )))|(% style="text-align: left;" %)(((
1477 {{code language="none"}}
1478 other.card_format
1479 {{/code}}
1480 )))|(% style="text-align: left;" %)(((
1481 Одно значение из: {{code language="none"}}auto{{/code}}, {{code language="none"}}Raw-64{{/code}}, {{code language="none"}}Raw-VL{{/code}}
1482 )))|(% style="text-align: left;" %)(((
1483 {{code language="none"}}auto{{/code}} — автоматический выбор формата; для Wiegand формат выбирается исходя из количества переданных бит (26 — Wiegand-26, 37 — Wiegand-37), для 1-Wire всегда Wiegand-26
1484
1485 {{code language="none"}}Raw-64{{/code}} — используются все 64 бита карты (отсутствующие биты дополняются 0) в форме одного 64-битного числа; код предприятия при этом равен 0.
1486
1487 {{code language="none"}}Raw-VL{{/code}} — используются только переданные от считывателя биты, в форме одного 64-битного числа; код предприятия при этом равен 0.
1488 )))
1489 |(% style="text-align: left;" %)(((
1490 Маска (номера карты)
1491 )))|(% style="text-align: left;" %)(((
1492 {{code language="none"}}
1493 other.card_mask
1494 {{/code}}
1495 )))|(% style="text-align: left;" %)(((
1496 {{code language="none"}}
1497 FFFFFFFFFFFFFFFF
1498 {{/code}}
1499 )))|(% style="text-align: left;" %)(((
1500 64 бита маски в формате HEX-строки из 16 символов
1501 )))
1502 |(% style="text-align: left;" %)(((
1503 Набор параметров блока «Контроль повторного прохода»
1504 )))|(% style="text-align: left;" %)(((
1505 \\
1506 )))|(% style="text-align: left;" %)(((
1507 \\
1508 )))|(% style="text-align: left;" %)(((
1509 Описание временно недоступно.
1510 )))
1511 |(% style="text-align: left;" %)(((
1512 Набор параметров блока «Проход под принуждением»
1513 )))|(% style="text-align: left;" %)(((
1514 \\
1515 )))|(% style="text-align: left;" %)(((
1516 \\
1517 )))|(% style="text-align: left;" %)(((
1518 Только в режиме идентификации «Карта и пинкод»
1519
1520 Описание временно недоступно.
1521 )))
1522 |(% style="text-align: left;" %)(((
1523 Набор параметров блока «Проход с подтвержденеим»
1524 )))|(% style="text-align: left;" %)(((
1525 \\
1526 )))|(% style="text-align: left;" %)(((
1527 \\
1528 )))|(% style="text-align: left;" %)(((
1529 Описание временно недоступно.
1530 )))
1531 |(% style="text-align: left;" %)(((
1532 Набор параметров блока «Доступ по правилу N-лиц»
1533 )))|(% style="text-align: left;" %)(((
1534 \\
1535 )))|(% style="text-align: left;" %)(((
1536 \\
1537 )))|(% style="text-align: left;" %)(((
1538 Описание временно недоступно.
1539 )))
1540
1541 (% style="text-align: left;" %)
1542 ===== {{id name="РуководствопоскриптамLua-Функции-обработчики"/}}Функции-обработчики =====
1543
1544 (% style="text-align: left;" %)
1545 Модуль позволяет разработчику определить глобальные Lua-функции с заданными именами. Такие функции-обработчики будут вызваны программными средствами контроллера по мере выполнения функций доступа.
1546
1547 {{info title="ВНИМАНИЕ"}}
1548 В данном случае это должны быть именно «глобальные функции», определённые, например, следующим образом:
1549
1550 {{code language="java"}}
1551 function pacs_reader_input(token, data)
1552 -- тело функции
1553 end
1554 {{/code}}
1555
1556 Локальные функции с таким же именем не будут вызваны:
1557
1558 {{code language="java"}}
1559 local pacs_reader_input = function(token, data)
1560 -- функция не будет вызвана
1561 end
1562 {{/code}}
1563 {{/info}}
1564
1565 (% style="text-align: left;" %)
1566 Ниже приведён список доступных для определения функций-обработчиков:
1567
1568 (% class="wrapped" style="text-align: left;" %)
1569 |=(% style="text-align: left;" %)(((
1570 Функция
1571 )))|=(% style="text-align: left;" %)(((
1572 Назначение
1573 )))|=(% style="text-align: left;" %)(((
1574 Комментарии
1575 )))
1576 |(% style="text-align: left;" %)(((
1577 {{code language="none"}}
1578 pacs_reader_input(token, data)
1579 {{/code}}
1580 )))|(% style="text-align: left;" %)(((
1581 К считывателю предъявлен идентификатор
1582 )))|(% style="text-align: left;" %)(((
1583 (% class="content-wrapper" %)
1584 (((
1585 Вызывается тогда, когда к считывателю контроллера предъявлен идентификатор.
1586
1587 **ВАЖНО**: проверка идентификатора ещё не осуществлялась. В случае, если данные предъявлены к считывателю Wiegand / 1-Wire, выполняется разбор считанных битов и определение номера карты / кода предприятия в соответствии с системными параметрами {{code language="none"}}other.card_format{{/code}}, {{code language="none"}}other.card_mask{{/code}}.
1588
1589 В первом аргументе {{code language="none"}}token{{/code}} передаётся токен точки доступа, на которой предъявлен идентификатор; во втором аргументе передаётся Lua-таблица с идентификаторами:
1590
1591 {{code language="java"}}
1592 {
1593 "facility_code" = "123",
1594 "card_number" = "12345",
1595 "pincode" = "12345"
1596 }
1597 {{/code}}
1598
1599 Если идентификатор отсутствует (например, не вводился пинкод), то соответствующее поле таблицы также отсутствует.
1600
1601 Обычно в коде данной функции выполняется вызов {{code language="none"}}pacs.authenticate{{/code}} для начала транзакции доступа.
1602 )))
1603 )))
1604 |(% style="text-align: left;" %)(((
1605 {{code language="none"}}
1606 pacs_accessed(token, args)
1607 {{/code}}
1608 )))|(% style="text-align: left;" %)(((
1609 Получена внешняя команда на инициацию транзакции доступа.
1610 )))|(% style="text-align: left;" %)(((
1611 (% class="content-wrapper" %)
1612 (((
1613 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1614
1615 Второй аргумент {{code language="none"}}args{{/code}} — параметры разрешения доступа:
1616
1617 {{code language="java"}}
1618 {
1619 "use_extended_time" = true,
1620 "access_time_duration" = число (unix-timestamp),
1621 "open_too_long_time_duration" = число (unix-timestamp),
1622 "pre_alarm_time_duration" = число (unix-timestamp)
1623 }
1624 {{/code}}
1625
1626 Подробную спецификацию команды инициации транзакции доступа смотри в спецификациях Onvif.
1627 )))
1628 )))
1629 |(% style="text-align: left;" %)(((
1630 {{code language="none"}}
1631 pacs_granted(token)
1632 {{/code}}
1633 )))|(% style="text-align: left;" %)(((
1634 Доступ разрешён (в результате проверки идентификатора)
1635 )))|(% style="text-align: left;" %)(((
1636 Данная функция-обработчик вызывается тогда, когда вызов {{code language="none"}}pacs.authenticate{{/code}} завершился успешно (если идентификаторы были переданы в {{code language="none"}}pacs.authenticate{{/code}}, то они были верифицированы по базе данных, у пропуска есть все необходимые права и разрешения на доступ).
1637
1638 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1639 )))
1640 |(% style="text-align: left;" %)(((
1641 {{code language="none"}}
1642 pacs_denied(token)
1643 {{/code}}
1644 )))|(% style="text-align: left;" %)(((
1645 Доступ запрещён (в результате проверки идентификатора)
1646 )))|(% style="text-align: left;" %)(((
1647 Данная функция-обработчик вызывается тогда, когда в результате {{code language="none"}}pacs.authenticate{{/code}} принято решение о запрещении доступа.
1648
1649 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1650 )))
1651 |(% style="text-align: left;" %)(((
1652 {{code language="none"}}
1653 pacs_enabled(token)
1654 {{/code}}
1655 )))|(% style="text-align: left;" %)(((
1656 Точка доступа включена (по внешней команде)
1657 )))|(% style="text-align: left;" %)(((
1658 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1659 )))
1660 |(% style="text-align: left;" %)(((
1661 {{code language="none"}}
1662 pacs_disabled(token)
1663 {{/code}}
1664 )))|(% style="text-align: left;" %)(((
1665 Точка доступа отключена (по внешней команде)
1666 )))|(% style="text-align: left;" %)(((
1667 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1668 )))
1669 |(% style="text-align: left;" %)(((
1670 {{code language="none"}}
1671 pacs_identification(token, event)
1672 {{/code}}
1673 )))|(% style="text-align: left;" %)(((
1674 Изменилось состояние ожидания ввода данных в режиме «Карта и пинкод»
1675 )))|(% style="text-align: left;" %)(((
1676 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1677
1678 Второй аргумент {{code language="none"}}event{{/code}} — один из {{code language="none"}}retry{{/code}} (требуется повторный ввод пинкода), {{code language="none"}}card{{/code}} (считана карта, требуется ввод пинкода), {{code language="none"}}timeout{{/code}} (истекло время ожидания ввода пинкода).
1679 )))
1680 |(% style="text-align: left;" %)(((
1681 {{code language="none"}}
1682 pacs_external_locked(token) → boolean
1683 {{/code}}
1684 )))|(% style="text-align: left;" %)(((
1685 Должен быть восстановлен режим работы точки доступа (обычный режим работы)
1686 )))|(% style="text-align: left;" %)(((
1687 Режим работы точки доступа должен быть восстановлен — по внешней команде (из веб-интерфейса или по Onvif; см. Onvif Profile C). Это функция-обработчик для внешней команды, обычно в коде данной функции выполняется вызов {{code language="none"}}pacs_reset{{/code}}.
1688
1689 Функция должна возвращать булевое значение — {{code language="none"}}true{{/code}}, если точка доступа перешла в обычный режим работы, и {{code language="none"}}false{{/code}}, если команда не может быть выполнена.
1690
1691 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1692 )))
1693 |(% style="text-align: left;" %)(((
1694 {{code language="none"}}
1695 pacs_external_unlocked(token) → boolean
1696 {{/code}}
1697 )))|(% style="text-align: left;" %)(((
1698 Точка доступа должна быть разблокирована
1699 )))|(% style="text-align: left;" %)(((
1700 Режим работы точки доступа должен быть изменён на «Разблокировано» — по внешней команде (из веб-интерфейса или по Onvif; см. Onvif Profile C). Это функция-обработчик для внешней команды, обычно в коде данной функции выполняется вызов {{code language="none"}}pacs_unlock{{/code}}.
1701
1702 Функция должна возвращать булевое значение — {{code language="none"}}true{{/code}}, если точка доступа разблокирована, и {{code language="none"}}false{{/code}}, если команда не может быть выполнена.
1703
1704 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1705 )))
1706 |(% style="text-align: left;" %)(((
1707 {{code language="none"}}
1708 pacs_external_blocked(token) → boolean
1709 {{/code}}
1710 )))|(% style="text-align: left;" %)(((
1711 Точка доступа должна быть заблокирована
1712 )))|(% style="text-align: left;" %)(((
1713 Режим работы точки доступа должен быть изменён на «Заблокировано» — по внешней команде (из веб-интерфейса или по Onvif; см. Onvif Profile C). Это функция-обработчик для внешней команды, обычно в коде данной функции выполняется вызов {{code language="none"}}pacs_block{{/code}}.
1714
1715 Функция должна возвращать булевое значение — {{code language="none"}}true{{/code}}, если точка доступа заблокирована, и {{code language="none"}}false{{/code}}, если команда не может быть выполнена.
1716
1717 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1718 )))
1719 |(% style="text-align: left;" %)(((
1720 {{code language="none"}}
1721 pacs_external_authorization(token, decision)
1722 {{/code}}
1723 )))|(% style="text-align: left;" %)(((
1724 Разрешение доступа по внешней команде
1725 )))|(% style="text-align: left;" %)(((
1726 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1727 )))
1728 |(% style="text-align: left;" %)(((
1729 {{code language="none"}}
1730 pacs_input(port, device, type_, id, raw)
1731 {{/code}}
1732 )))|(% style="text-align: left;" %)(((
1733 Изменение состояния элемента периферии
1734 )))|(% style="text-align: left;" %)(((
1735 Параметры {{code language="none"}}port{{/code}} и {{code language="none"}}device{{/code}} всегда константны, значения не имеют.
1736
1737 Параметр {{code language="none"}}type_{{/code}} определяет тип элемента периферии, чьё состояние изменилось. Значение из перечисления {{code language="none"}}fec.TYPE{{/code}} (модуль fec.lua).
1738
1739 Параметр {{code language="none"}}id{{/code}} определяет идентификатор элемента периферии, чьё состояние изменилось. Например, для входов на плате БОРЕЙ это значения от 1 до 8.
1740
1741 Параметр {{code language="none"}}raw{{/code}} содержит «сырое» значение состояния элемента периферии. Способ приведения «сырого» значения к логическому описан ниже в разделе «Изменение состояние периферии).
1742 )))
1743 |(% style="text-align: left;" %)(((
1744 {{code language="none"}}
1745 pacs_cancel_transaction(token)
1746 {{/code}}
1747 )))|(% style="text-align: left;" %)(((
1748 Получена внешняя команда на прерывание транзакции доступа
1749 )))|(% style="text-align: left;" %)(((
1750 Первый аргумент {{code language="none"}}token{{/code}} — токен точки доступа.
1751 )))
1752
1753 (% style="text-align: left;" %)
1754 \\
1755
1756 {{info title="СОВЕТ"}}
1757 При использовании стандартных алгоритмов «Две односторонних точки доступа», «Одна двусторонняя точка доступа» перечисленные в таблице функции-обработчики //уже определены//, в них выполняется логика стандартных алгоритмов доступа. Пользователь //может переопределить// эти обработчики в своём скрипте. Таким образом, переопределив ВСЕ функции пользователь реализует //полностью свою// логику доступа, НО при этом получит доступ ко всем параметрам, задаваемым для стандартных алгоритмов через веб-интерфейс — через поле {{code language="none"}}pacs.ap{{/code}} (см. раздел «Модель данных» выше).
1758 {{/info}}
1759
1760 (% style="text-align: left;" %)
1761 ===== {{id name="РуководствопоскриптамLua-Изменениесостоянияпериферии"/}}Изменение состояния периферии(%%) =====
1762
1763 (% style="text-align: left;" %)
1764 При изменении состояния какого-либо элемента периферии (обычно, это различные входы) вызывается функция-обработчик {{code language="none"}}pacs_input{{/code}}. Ниже приведён Lua-код, который позволит в зависимости от типа элемента периферии получить его логическое состояние.
1765
1766 {{code language="java"}}
1767 local fec = require("fec")
1768  
1769 -- Логическое состояние элемента
1770 local VALUE = {
1771 OFF = 0,
1772 ON = 1,
1773 SHORT = 2,
1774 BROKEN = 3
1775 }
1776  
1777 -- Получение логического состояния для элемента типа «Сухой контакт»
1778 function get_dry_contact_value(raw, invert)
1779 if raw == 1 then
1780 if invert then
1781 return VALUE.OFF
1782 else
1783 return VALUE.ON
1784 end
1785 else
1786 if invert then
1787 return VALUE.ON
1788 else
1789 return VALUE.OFF
1790 end
1791 end
1792 end
1793  
1794 -- Получение логического состояния для элемента типа «Резистивный шлейф»
1795 function get_rin_value(raw,invert)
1796 if raw <= 17 then -- эмпирический порог резистивного шлейфа
1797 if invert then
1798 return VALUE.OFF
1799 else
1800 return VALUE.ON
1801 end
1802 else
1803 if invert then
1804 return VALUE.ON
1805 else
1806 return VALUE.OFF
1807 end
1808 end
1809 end
1810  
1811 -- Получение логического состояния входов разного типа
1812 -- Дополнительный аргумент invert позволяет обрабатывать настройку вида «нормально-открыт»
1813 function get_input_value(raw, invert, type_)
1814 if (type_ == fec.TYPE.DRY_CONTACT) then
1815 return get_dry_contact_value(raw, invert)
1816 elseif (type_ == fec.TYPE.RADIAL_INPUT) then
1817 return get_rin_value(raw, invert)
1818 else
1819 log_error("invalid type: "..type_)
1820 return 0
1821 end
1822 end
1823 {{/code}}
1824
1825 (% style="text-align: left;" %)
1826 ===== {{id name="РуководствопоскриптамLua-Управлениеточкойдоступа"/}}Управление точкой доступа =====
1827
1828 (% style="text-align: left;" %)
1829 Для управления точкой доступа / транзакцией доступа по выбранной точке доступа предназначены следующие функции:
1830
1831 (% class="wrapped" style="text-align: left;" %)
1832 |=(% style="text-align: left;" %)(((
1833 Функция
1834 )))|=(% style="text-align: left;" %)(((
1835 Назначение
1836 )))|=(% style="text-align: left;" %)(((
1837 Комментарии
1838 )))
1839 |(% style="text-align: left;" %)(((
1840 {{code language="none"}}
1841 pacs.authenticate(token, {...})
1842 {{/code}}
1843 )))|(% style="text-align: left;" %)(((
1844 Выполнить проверку переданных идентификаторов и начать транзакцию доступа
1845 )))|(% style="text-align: left;" %)(((
1846 (% class="content-wrapper" %)
1847 (((
1848 Первый аргумент — токен точки доступа. Второй аргумент — Lua-таблица с идентификаторами (такая же, какая получена в функции-обработчике {{code language="none"}}pacs_reader_input{{/code}}):
1849
1850 {{code language="java"}}
1851 {
1852 "facility_code" = "123",
1853 "card_number" = "12345",
1854 "pincode" = "12345",
1855 "transaction_uuid" = "..."
1856 }
1857 {{/code}}
1858
1859 В результате проверки будет вызвана функция обработчик {{code language="none"}}pacs_granted{{/code}} (если доступ разрешён; при этом будет начата транзакция доступа, см. {{code language="none"}}pacs_begin{{/code}}) или {{code language="none"}}pacs_denied{{/code}} (если доступ запрещён).
1860
1861 Если передан transaction_uuid, то соответствующее значение будет использоваться в роли идентификатора транзакции и будет подставлено во все отправляемые извещения. Если значение не будет указано, то будет сгенерирован уникальный UUID транзакции.
1862
1863 **ВАЖНО**: если таблица во втором аргументе будет пуста, то проверка идентификаторов по базе данных проводиться не будет, автоматически будет выдано разрешение на доступ, будет вызвана функция-обработчик {{code language="none"}}pacs_granted{{/code}}.
1864 )))
1865 )))
1866 |(% style="text-align: left;" %)(((
1867 {{code language="none"}}
1868 pacs_reset(token)
1869 {{/code}}
1870 )))|(% style="text-align: left;" %)(((
1871 Восстановить обычный режим работы точки доступа
1872 )))|(% style="text-align: left;" %)(((
1873 Первый аргумент — токен точки доступа.
1874
1875 **ВАЖНО**: текущая транзакция прекращается, все связанные с транзакцией данные (пропуска и пр.) очищаются. Данную функцию обязательно надо вызвать при завершении транзакции доступа.
1876 )))
1877 |(% style="text-align: left;" %)(((
1878 {{code language="none"}}
1879 pacs_block(token)
1880 {{/code}}
1881 )))|(% style="text-align: left;" %)(((
1882 Перевести точку доступа в состояние «Заблокировано»
1883 )))|(% style="text-align: left;" %)(((
1884 Первый аргумент — токен точки доступа.
1885 )))
1886 |(% style="text-align: left;" %)(((
1887 {{code language="none"}}
1888 pacs_unlock(token)
1889 {{/code}}
1890 )))|(% style="text-align: left;" %)(((
1891 Перевести точку доступа в состояние «Разблокировано»
1892 )))|(% style="text-align: left;" %)(((
1893 Первый аргумент — токен точки доступа.
1894 )))
1895 |(% style="text-align: left;" %)(((
1896 {{code language="none"}}
1897 pacs_pause(token)
1898 {{/code}}
1899 )))|(% style="text-align: left;" %)(((
1900 Прекратить приём идентификаторов на точке доступа
1901 )))|(% style="text-align: left;" %)(((
1902 Первый аргумент — токен точки доступа.
1903
1904 Транзакция доступа не прерывается. Обычно используется при переходе в состояния типа «Взлом двери» или «Удержание двери».
1905 )))
1906 |(% style="text-align: left;" %)(((
1907 {{code language="none"}}
1908 pacs_grant(token)
1909 {{/code}}
1910 )))|(% style="text-align: left;" %)(((
1911 Разрешить анонимный доступ и начать анонимную транзакцию доступа
1912 )))|(% style="text-align: left;" %)(((
1913 Обычно применяется для начала транзакции по кнопке выхода.
1914
1915 Поведение отличается от {{code language="none"}}pacs.authenticate{{/code}} + {{code language="none"}}pacs_begin{{/code}} тем, что извещения о событиях доступа будут содержать тему «анонимного доступа».
1916 )))
1917 |(% style="text-align: left;" %)(((
1918 {{code language="none"}}
1919 pacs_notify(token)
1920 {{/code}}
1921 )))|(% style="text-align: left;" %)(((
1922 Отправить извещение с заданным кодом
1923 )))|(% style="text-align: left;" %)(((
1924 Доступный список кодов см. в документации на HTTP-API контроллера в части СКУД.
1925 )))
1926 |(% style="text-align: left;" %)(((
1927 {{code language="none"}}
1928 pacs_update_door_state(token, state)
1929 {{/code}}
1930 )))|(% style="text-align: left;" %)(((
1931 Изменить состояние точки доступа
1932 )))|(% style="text-align: left;" %)(((
1933 (% class="content-wrapper" %)
1934 (((
1935 Первый аргумент — токен точки доступа.
1936
1937 Второй аргумент — Lua-таблица со значением состояния по различным «осям»:
1938
1939 {{code language="java"}}
1940 {
1941 "lock" = Unlocked,
1942 "door" = Open,
1943 "mode" = Accessed,
1944 "alarm" = Normal,
1945 }
1946 {{/code}}
1947
1948 Во втором аргументе можно отправлять только те «оси» состояния, которые необходимы. Доступные значения состояния см. в разделе «Общие сведения».
1949 )))
1950 )))
1951
1952 (% style="text-align: left;" %)
1953 ===== {{id name="РуководствопоскриптамLua-Поисквбазеданных"/}}Поиск в базе данных =====
1954
1955 (% style="text-align: left;" %)
1956 Описание временно недоступно.
1957
1958 (% style="text-align: left;" %)
1959 ==== {{id name="РуководствопоскриптамLua-storage.lua"/}}storage.lua ====
1960
1961 (% style="text-align: left;" %)
1962 Модуль предоставляет функции для перманентного сохранения и последующего чтения конфигурационных параметров или параметров скрипта автоматизации.
1963
1964 (% style="text-align: left;" %)
1965 В некоторых случаях может потребоваться сохранять состояние или параметры работы скрипта автоматизации при перезапуске продукта. Или, например, может возникнуть потребность, чтобы определённые параметры были сохранены в резервной копии и восстановлены в случае сбоя файловой системы на IP-контроллере (БОРЕЙ, ЯРС и пр.). Для работы с такими данными и предназначен модуль {{code language="none"}}storage.lua{{/code}}.
1966
1967 (% style="text-align: left;" %)
1968 Модуль позволяет сохранять в персистентное хранилище Lua-таблицы с данными под заданным именем, а впоследствии извлекать их из хранилища по имени. Таблица с данными может содержать только пары «ключ = значение», где «ключ» это всегда строка, а «значение» может быть строкового, числового или булевого типа.
1969
1970 (% style="text-align: left;" %)
1971 Для помещения данных в хранилище предназначена функция {{code language="none"}}storage.set(ключ, данные){{/code}}, для сохранения — {{code language="none"}}storage.save(ключ){{/code}}, для извлечения — {{code language="none"}}storage.get(ключ){{/code}}.
1972
1973 {{info}}
1974 Вызов функции {{code language="none"}}set(...){{/code}} не приводит к сохранению данных, данные только помещаются в хранилище! Данные будут сохранены только после вызова функции {{code language="none"}}save(...){{/code}}.
1975 {{/info}}
1976
1977 (% style="text-align: left;" %)
1978 Пример использования модуля приведён ниже:
1979
1980 {{code language="java"}}
1981 local storage = require("storage")
1982  
1983 local my_options = storage.get("my_key")
1984 my_options.param1 = "A"
1985 my_options.param2 = 42
1986 storage.save("my_key")
1987  
1988 local another_options = {
1989 param1 = "B",
1990 param2 = 43
1991 }
1992 storage.set("my_key", another_options) -- my_options более не ссылается на объект в хранилище!
1993 storage.save("my_key")
1994 {{/code}}
1995
1996 (% style="text-align: left;" %)
1997 ==== {{id name="РуководствопоскриптамLua-tenso.lua"/}}tenso.lua ====
1998
1999 (% style="text-align: left;" %)
2000 Описание временно недоступно.
2001
2002 (% style="text-align: left;" %)
2003 ==== {{id name="РуководствопоскриптамLua-timer.lua"/}}timer.lua ====
2004
2005 (% style="text-align: left;" %)
2006 Данный модуль предоставляет для скрипта автоматизации две функции для выполнения отложенных во времени вычислений. Первая функция — это {{code language="none"}}set_timeout{{/code}}. Она предназначена для разового выполнения некоторой Lua-функции спустя заданное количество времени. Вторая функция — {{code language="none"}}set_interval{{/code}}. Она позволяет запланировать выполнение некоторой Lua-функции каждые N миллисекунд. Функция будет выполняться периодически до тех пор, пока задание на выполнение не будет явно отменено (см. {{code language="none"}}clear_interval{{/code}} далее) или Lua-машина не будет перезапущена.
2007
2008 (% style="text-align: left;" %)
2009 Также модуль предоставляет две функции для отмены запланированных ранее заданий: {{code language="none"}}clear_timeout{{/code}} и {{code language="none"}}clear_interval{{/code}}.
2010
2011 {{info title="ЗАМЕЧАНИЕ"}}
2012 Для использования функций модуля не требуется ничего подключать с помощью 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}} доступны глобально в любом месте скрипта автоматизации.
2013 {{/info}}
2014
2015 (% style="text-align: left;" %)
2016 ===== {{id name="РуководствопоскриптамLua-set_timeout"/}}set_timeout(%%) =====
2017
2018 (% style="text-align: left;" %)
2019 Запланировать вызов указанной Lua-функции спустя заданное количество миллисекунд.
2020
2021 (% style="text-align: left;" %)
2022 Полная сигнатура функции: {{code language="none"}}set_timeout(имя-функции, длительность, ключ){{/code}}, где
2023
2024 (% style="text-align: left;" %)
2025 * имя функции — строка, имя Lua-функции для вызова;
2026 * длительность — число, задержка выполнения функции, в миллисекундах;
2027 * ключ — строка, ключ, по которому можно будет понять в Lua-функции, кто и когда запланировал её отложенный вызов.
2028
2029 (% style="text-align: left;" %)
2030 При вызове {{code language="none"}}set_timeout{{/code}} возвращает уникальный идентификатор созданного задания на отложенное выполнение. Это значение можно использовать в последующем вызове {{code language="none"}}clear_timeout{{/code}} для отмены запланированного ранее задания.
2031
2032 (% style="text-align: left;" %)
2033 Пример:
2034
2035 {{code language="java"}}
2036 local log = require("log")
2037 local logger = log.get_logger("script.lua")
2038  
2039 local key1_id = set_timeout("my_timeout", 10000, "key1") -- выполнить my_timeout через 20 секунд с key1
2040 local key2_id = set_timeout("my_timeout", 20000, "key2") -- выполнить my_timeout через 20 секунд с key2
2041  
2042 function my_timeout(key)
2043 if key == "key1" then
2044 logger:debug("stopping timeout on key2")
2045 clear_timeout(key2_id) -- отменяем задание с key2
2046 elif key == "key2" then
2047 logger:error("this should be never invoked")
2048 else
2049 logger:error("unexpected key="..key)
2050 end
2051 end
2052 {{/code}}
2053
2054 (% style="text-align: left;" %)
2055 ===== {{id name="РуководствопоскриптамLua-clear_timeout"/}}clear_timeout =====
2056
2057 (% style="text-align: left;" %)
2058 Функция позволяет отменить ранее запланированное задание: {{code language="none"}}clear_timeout(ID задания){{/code}}, где {{code language="none"}}ID задания{{/code}} — результат выполнения функции {{code language="none"}}set_timeout{{/code}}.
2059
2060 (% style="text-align: left;" %)
2061 ===== {{id name="РуководствопоскриптамLua-set_interval"/}}set_interval =====
2062
2063 (% style="text-align: left;" %)
2064 Сигнатура налогична set_timeout: {{code language="none"}}set_interval(имя-функции, длительность, ключ){{/code}}, где
2065
2066 (% style="text-align: left;" %)
2067 * имя функции — строка, имя Lua-функции для вызова;
2068 * интервал — число, период выполнения функции, в миллисекундах;
2069 * ключ — строка, ключ, по которому можно будет понять в Lua-функции, кто и когда запланировал её отложенный вызов.
2070
2071 {{error title="ВНИМАНИЕ"}}
2072 Также [[как и в 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.
2073 {{/error}}
2074
2075 (% style="text-align: left;" %)
2076 ===== {{id name="РуководствопоскриптамLua-clear_interval"/}}clear_interval(%%) =====
2077
2078 (% style="text-align: left;" %)
2079 Аналогично clear_timeout функция позволяет отменить запланированное ранее периодическое задание: {{code language="none"}}clear_interval(ID задания){{/code}}, где {{code language="none"}}ID задания{{/code}} — результат выполнения функции {{code language="none"}}set_interval{{/code}}.
2080
2081 (% style="text-align: left;" %)
2082 ==== {{id name="РуководствопоскриптамLua-terminal.lua"/}}terminal.lua ====
2083
2084 (% style="text-align: left;" %)
2085 Описание временно недоступно.

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