Last modified by superadmin on 2026/06/15 21:57

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

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