Исходный код вики Руководство по скриптам Lua

Редактировал(а) admin 2026/09/03 12:18

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