Главная Книги - Разные TRASSIR. Руководство администратора (до 2023 года)
поиск по сайту правообладателям
|
|
содержание .. 3 4 5 6 ..
Установка соединения с новым сервером
Для добавления соединения с другим сервером выберите пункт меню Сеть -> Добавить настроек системы.
В правой части окна отображается таблица со списком автоматически найденных в локальной сети серверов,
а так же серверов, подключенных к Облаку TRASSIR. Серверы, подключенные, найденные в Облаке TRASSIR
выделены значком .
В таблице отображаются следующие данные: имя сервера, IP-адрес, информация об используемых портах
управления\подключения и передачи видео и версия ПО.
В нижней части окна располагаются настройки подключения к серверу. Чтобы их заполнить, достаточно
выбрать подключаемый сервер из списка доступных и кликнуть по нему. В случае, если подключаемый сервер,
отсутствует в списке, то вы можете ввести его настройки самостоятельно.
Настройки различаются в зависимости от Метода подключения:
• По Адресу сервера
• IP-адрес - сервера или его IP-адрес;
• Порт (управление) - TCP/IP порт сервера, по которому осуществляется его управление;
• Порт (видео) - TCP/IP порт сервера, по которому осуществляется передача видео;
• Учетная запись - логин и пароль пользователя.
• При помощи Cloud Connect
• Cloud ID - идентификатор учетной записи в TRASSIR Cloud;
• Режим - режим соедиения через TRASSIR Cloud;
• Учетная запись - логин и пароль пользователя.
Помните, что каждый сервер имеет свой список пользователей. Поэтому пользователь
с указанным логином и паролем должен быть зарегистрирован на сервере, к которому
осуществляется подключение.
При нажатии кнопки Добавить будет создано новое подключение и произойдет автоматический переход
на вкладку добавленного сервера. На экране появится Диалог проверки хеш-функции сертификата
сервера. Хеш-функция служит для подтверждения подлинности сервера. Убедитесь, что значение функции
совпало и нажмите кнопку Продолжить.
200
Узнать значение хеш-функции сервера можно в окне Основных настроек сервера.
Состояние подключения изменится на Соединение установлено.
При подключении к серверу TRASSIR c версией ПО 3.2 вы увидите сообщение Соединение
с ограничениями, описание которых вы найдете в разделе Ограничения при подключении к
серверам с TRASSIR 3.2.
• Сеть
• Изменение настроек подключения
• Соединение через TRASSIR Cloud
201
Изменение настроек подключения
Для изменения настроек подключения к серверу выберите его в списке во вкладке Сеть дерева настроек.
На данной вкладке вы можете изменить настройки подключения, такие как: IP адрес сервера, используемые
порты и данные авторизации.
TRASSIR позволяет организовывать видеошлюзы и полностью управлять серверами вплоть до
3го
уровня вложенности сетевого подключения. Максимальная глубина вложенности определяется значением
Уровня рекурсии. Другими словами, вы можете подключиться к серверу TRASSIR не напрямую, а через
промежуточный сервер. Уровень рекурсии - 1 означает, что будет подключен только тот сервер, к которому
непосредственно осуществляется подключение. Уровень рекурсии - 2 означает, что будет подключен как
сервер к которому осуществляется подключение, так и все сервера к которым он в свою очередь подключен.
Экономичный режим - специальный режим подключения, позволяющий экономить сетевой трафик. В этом
режиме сервер передает минимальное количество информации, в том числе служебной.
Запретить основной видеопоток - Блокирует получение главного потока со всех каналов. При просмотре
изображения всегда будет отображаться дополнительный поток вне зависимости от других настроек
TRASSIR, а при его отсутствии - снизится количество отображаемых кадров в секунду до 1-2.
В таблице, в режиме реального времени отображается статистика подключения к серверу. Доступна
информация о количестве кадров в секунду, битрейту и объему переданных данных как по отдельным
каналам, так и суммарно по серверу.
Чтобы отключиться от сервера просто снимите флаг Разрешить соединение. Если соединение с сервером
больше не потребуется, то вы можете удалить подключение с помощью соответствующей кнопки.
В случае, если к вашему серверу подключено большое количество других серверов вы можете отобразить
в дереве настройки только одного сервера, выбрав его имя. Для отображения настроек всех подключенных
серверов выберите пункт Все сервера.
202
• Сеть
• Установка соединения с новым сервером
203
Соединение через TRASSIR Cloud
CloudConnect-соединение будет организовано через облачный сервис TRASSIR Cloud:
• если в течении 10 секунд TRASSIR не может организовать прямое CloudConnect-соединение с облачной
камерой или сервером;
• если в процессе мониторинга CloudConnect-соединения обнаружены ошибки, которые не позволяют
осуществить стабильную передачу данных между TRASSIR.
В окне настроек подключения вы увидите следующее сообщение:
Ограничения при передаче данных сервисом TRASSIR Cloud:
• Максимальная скорость передачи данных между серверами - 10 Мб/сек.
• Просмотр живого видео - 5 мин.
• Просмотр архива - 1 мин.
• Максимальная длина экспорта архива - 10 мин.
• Запись сетевых каналов - не доступна.
Чтобы запретить соединение через TRASSIR Cloud выберите в настройке Режим значение
Только P2P.
• Установка соединения с новым сервером
• Изменение настроек подключения
204
Ограничения при подключении к серверам с TRASSIR 3.2
• В журнале событий на единой шкале времени не отображается архив каналов, подключенных к серверам
с TRASSIR 3.2.
• В архиве каналов, подключенных к серверам с TRASSIR 3.2, не отображаются закладки.
• Одновременный просмотр архива с нескольких каналов возможен только для каналов, подключенных к
серверам с одинаковой версией ПО.
• Установка соединения с новым сервером
• Изменение настроек подключения
205
Автоматизация
В ПО TRASSIR реализована гибкая система правил и скриптов. Автоматизация позволяет сильно
облегчить работу оператора за счет настройки реакций на интересующие и/или тревожные события. Вы
можете как настраивать правила с помощью встроенного "мастера", так и самостоятельно создавать
индивидуальные реакции на определенные события при помощи встроенной системы скриптов Python. На
странице Примеры правил и скриптов можно ознакомиться с реальными примерами правил и скриптов, а
также с их описанием и комментариями к ним.
Автоматизация также позволяет настраивать расписания с тремя типами зон. Расписания можно
использовать, например, для управления записью на камерах, а также для управления произвольными
объектами с помощью правил и скриптов.
В качестве одной из реакций Вы можете отправлять e-mail сообщения с информацией о произошедшем
событии и скриншотами / экспортированными фрагментами записи с нужных камер. Для этого необходимо в
разделе Автоматизация создать учетную запись e-mail, после чего в нужном правиле или скрипте указать
в качестве реакции отправку e-mail с использованием созданной учетной записи.
Помимо этого в ПО TRASSIR доступен Циклический просмотр шаблонов. Циклический просмотр
шаблонов позволяет раскрывать определенные шаблоны на экран какого-либо из мониторов в произвольном
порядке по горячей клавише. Вы можете создать неограниченное количество Циклических просмотров
шаблонов и запускать их по горячим клавишам F1-F12 и/или произвольному сочетанию клавиш вида ctrl/shift/
alt + F1-F12.
206
Скрипты
Скрипты — сильная сторона TRASSIR. Скрипты позволяют автоматизировать типичные операции, упрощать
работу оператора, производить интеграции. Кроме того, скрипты — это интересно!
Скрипты создаются на языке Python.
• Python — самый простой в изучении язык, синтаксис языка. Кроме того, Python — язык общего назначения,
вы не ограничены заранее заданным набором функций. На нем можно сделать все что угодно, например
читать файлы, общаться по сети. Информацию можно найти на python.ru или python.org.
• Скрипт может читать и менять настройки TRASSIR, вызывать методы объектов, делать скриншоты и
экспортировать видео, спрашивать пользователя.
• Активировать (вызывать) функции можно по различным событиям: по изменению состояния объекта, по
нажатию клавиши, вызовом из контекстного меню, по событию в журнале, по событию AutoTRASSIR,
по событию ActivePOS, по таймауту.
• Благодаря дружественному интерфейсу вы можете задавать параметры используемые скриптом, а так
же использовать дополнительные ресурсы и библиотеки в работе самого скрипта.
• Для защиты скрипта, как вашей интеллектуальной собственности, он может быть зашифрован.
С чего начать?
Начните с примеров. Кнопка загрузки примера находится ниже редактора. Первые четыре примера "учебные",
остальные предлагают разные интересные идеи.
Также можно начать с редактора правил. Правила внутри работают с помощью создания скриптов, снизу есть
кнопка скопировать в буфер. Получившийся код можно вставить в скрипт и отредактировать.
• Правила
• Расписания
• Добавление учетной записи e-mail
• Примеры правил и скриптов
207
Синтаксис Python
Простые примеры синтаксиса языка. Если вам нужно более полное описание языка, вы должны
воспользоваться сайтами python.ru или python.org.
Отступы являются частью языка. По отступу определяется где заканчивается тело цикла или
функции.
Ветвление:
if x+y > 5:
alert("Сумма x + y очень большая!")
elif x<0 or y<0:
error("Какие-то неправильные x и y")
else:
message("Сумма x + y нормальная, равна %i" % (x+y))
Циклы:
for i in range(5):
message(i+1)
message("Вышел зайчик погулять")
i = 10
while i>=0:
message(i)
i -= 1
alert("Пуск!")
Функции:
def f1():
alert("Функция без параметров")
def f2(x, y):
alert("Функция с параметрами x=%s, y=%s" % (x,y))
if x > 5:
alert("Надо же, параметр x больше 5!")
f1()
f2(3, 4)
Списки:
lst = ["пирожные", "мороженое", "печенье"]
lst.append("конфеты")
for x in lst:
alert("Хочу %s!" % x)
lst.pop(1)
lst += ["огурцы", "помидоры"]
alert("И еще %s!" % lst[4])
first = lst[0]
last = lst[-1]
first_three = lst[:3]
last_three = lst[-3:]
middle = lst[2:3]
lst = [x for x in range(1,5)]
squared = [y*y for y in lst]
file = [x.strip() for x in open("readme.txt")]
words = "поделим строку на слова по пробелам".split(" ")
Строки:
x = "Василий"
y = "Пупкин"
z = x+y
alert(z)
z = " ".join( [x,y] )
alert(z)
208
Форматирование строк:
pi = 3.1415926
alert("Число PI с точностью до 2 знаков %0.2f" % pi)
s = "Число PI с точностью до 3 знаков %0.3f" % pi
alert(s)
name = "Vasya"
age = 25
s = "Привет оператор %s, наверно тебе %i лет" % (name, age)
alert(s)
Форматирование времени:
import time
message(time.strftime("%H:%M:%S %d.%m.%Y", time.localtime()))
Лямбда-выражения дают возможность построить вызов функции с использованием локальных переменных.
Такой вызов функции можно отдать для использования в будущем. Этот прием полезен при диалоге с
пользователем и протяженных по времени операциях:
def hello(name, answer, correct):
if answer==correct: message("Правильно, %s!" % name)
else: message("На самом деле будет %s!" % correct)
def check_user_math(name):
ask("Уважаемый %s, сколько будет 5*5?" % name,
lambda x: hello(name, x, "25"),
lambda: message("Опять никто не хочет поговорить с роботом"))
ask("Как вас зовут?", check_user_math, None)
Глобальные переменные понятнее простому человеку чем лямбда-выражения:
def hello(answer):
global name
if answer==25: message("Правильно, %s!" % name)
else: message("На самом деле будет 25!")
def check_user_math(n):
global name
name = n
ask("Уважаемый %s, сколько будет 5*5?" % name,
hello,
None)
ask("Как вас зовут?", check_user_math, None)
• Активация
• Настройки
• Объекты
209
Встроенный редактор скриптов
В ПО TRASSIR встроен собственный редактор скриптов, состоящий из следующих функциональных областей:
• Область управления скриптом
В поле Имя скрипта введите название скрипта, которое будет отображаться в настройках TRASSIR.
Установите флаг Включить скрипт для активации скрипта.
При необходимости скрипт может быть удален. Для этого нажмите на кнопку Удалить.
В информационных полях Счетчик запусков и Счетчик ошибок будут отображаться, соответственно,
какое количество раз скрипт был запущен и какое количество ошибок при этом возникло.
• Область редактирования скрипта может отображаться в двух вариантах:
в виде редактора скрипта:
в виде списка параметров:
• Панель вспомогательных кнопок
При нажатии на кнопку Сохранить скрипт будет сохранен. Для отмены сделанных изменений нажмите
кнопку Отменить.
Для того чтобы сохранить скрипт в файл нажмите кнопку Публикация и выберите вариант сохранения: в
зашифрованном виде - В файл... или как есть В файл (незашифрованный)
При сохранении файла в зашифрованном виде происходит шифрование основного текста
скрипта, который отображен в редакторе. Данная функция поможет вам защитить свою
интеллектуальную собственность, а так же исключит возможность внесения неконтролируемых
исправлений в работу скрипта.
Если в процессе работы скрипта вам необходимо сохранять данные в каталог на жестком диске, то нажмите
на кнопку Папка ресурсов и выберите пункт Создать чтобы создать каталог. Для открытия созданного
каталога выберите пункт Открыть. В случае, если в скрипт необходимо вставить путь к каталогу, то для
того чтобы скопировать его в буфер выберите пункт Копировать путь.
Если нажать на кнопку Вставить... и выбрать пункт Настройки, то в открывшемся окне вы можете
выбрать настройку, которую можете вставить в скрипт. Для вставки в скрипт метода выберите пункт
Объекты.
210
Для того чтобы загрузить ранее сохраненный скрипт или пример скрипта нажмите кнопку Загрузите
пример... и выберите пункт Из файла... или название примера.
Встроенный редактор поддерживает создание многоязычных скриптов. Вы можете создать скрипт,
интерфейс которого будет отображаться на том же языке, что и TRASSIR или на другом, нужным вам
языке. Языковой файл создается при помощи программы Qt Linguist. Добавить новый языковой файл,
отредактировать существующий, обновить или выбрать язык скрипта вы можете нажав кнопку Translation
и выбрав требуемое действие.
Кнопка Редактор / Параметры производит переключение области редактирования скрипта.
Для отображения панели поиска нажмите сочетание клавиш CTRL+F.
Права пользователя Script влияют на возможности скриптов читать и писать отдельные поля в
настройках.
Если вы нажмете F4 в диалоге настроек, вы сможете попасть в особый режим, где вы сможете
менять значения настроек в обход диалогов. Этот режим позволяет поэкспериментировать, как
ведет себя система при тех или иных изменениях в настройках.
• Активация
• Настройки
• Объекты
• Параметры и ресурсы в скриптах
211
Активация
Чтобы функция выполнилась в нужный момент, нужно назначить ее на одно из событий в системе:
•
Активация по состоянию объекта:
cam1 = object("Камера 1")
def f():
message("Движение: %s" % cam1.state["motion"])
cam1.activate_on_state_changes(f)
•
Активация по изменению настроек:
h = settings("health")
def f():
message("Здоровье базы данных: %s" % h["db_connected"])
h.activate_on_changes(f)
•
Активация по нажатию клавиши:
def f():
message("Hello world!")
activate_on_shortcut("F9", f)
Для скриптов и правил доступны только клавиши F1-F12, с модификаторами Ctrl, Alt, Shift. Работают также
клавиши джойстика, откройте редактор правил, чтобы посмотреть имена клавиш.
•
Активация из контекстного меню:
def func1(guid):
alert(guid.name)
def func2(guid):
alert(guid.name)
action1 = activate_on_context_menu("xeLzkjpd", "Выполнить функцию 1", func1)
action2 = activate_on_context_menu("Channel", "Выполнить функцию 2", func2)
При этом, пункт Выполнить функцию 2 появится в контекстных меню, вызываемых на всех устройствах
класса "Channel", а пункт Выполнить функцию 1 - только одного устройства с GUID "xeLzkjpd".
• Активация по событию в журнале:
def f(ev):
message("Случилось %s" % ev.type)
activate_on_events("", "", f)
Обратите внимание, что в функции должен быть параметр, в него помещается событие. Подробнее
смотрите пример 2_event. Кнопка загрузки примеров находится снизу от редактора кода.
• Активация по таймауту:
Иногда в скрипте требуется задержка. Использование time.sleep() не годится, потому что эта функция
заставляет программу зависнуть на указанное время. Для ожидания нужно использовать timeout(). Через
заданное время вызовется указанная функция:
def f():
alert("Прошло 2 секунды!")
timeout(3000, g)
def g():
alert("Прошло еще 3!")
timeout(1000, lambda: h(1,2,3))
212
def h(param1, param2, param3):
alert("Мне нужны для продолжения работы после задержки " +
"параметры %i, %i, %i" % (param1, param2, param3))
timeout(2000, f)
• Активация по событию AutoTRASSIR:
def f(ev):
message("Проехала машина с номером %s" % ev.plate)
activate_on_lpr_events(f)
• Активация по событию ActivePOS:
def f(ev):
if ev.type=="POS_POSITION_ADD":
message("В чек добавили %s" % ev.text)
activate_on_pos_events(f)
Чтобы узнать, какие еще поля есть в структурах событий, используйте dir()
def f(ev):
alert( dir(ev) )
• Встроенный редактор скриптов
213
Работа с настройками
Изменяя настройки из скрипта можно автоматизировать практически все, что можно сделать с помощью
мышки и клавиатуры в диалогах настройки (интерфейсе администратора).
s = settings("ip_cameras/Моя любимая IP-камера")
s = settings("/Другой сервер/ip_cameras/Камера на другом сервере")
Функция settings() находит нужную папку с настройками. Внутри папки есть значения, которые можно читать
и писать с помощью квадратных скобок [].
x = s["channel00_fps"]
s["channel01_fps] = 25
Функция activate_on_changes() позволяет следить за изменениями в папке:
s = settings("channels/Камера 1/stats")
def f():
alert( s["fps"] )
s.activate_on_changes(f)
С помощью работы с настройками возможно существенное изменение конфигурации сервера. В качестве
примера используйте скрипт конвертации настроек TRASSIR 2 в TRASSIR 3.
• Встроенный редактор скриптов
214
Работа с объектами
IP-камеры, каналы, шаблоны, входы, выходы, сервера, зоны SIMT и многие другие объекты собраны в дерево.
Дерево объектов можно увидеть в интерфейсе оператора, отобразив в шаблоне Дерево объектов (CMS)
или добавить в скрипт нажав кнопку Вставить -> Объекты в редакторе скриптов.
Все объекты объединены в классы:
• Folder - класс родительских объектов ("Channels", "IP Devices", "Templates"), которым принадлежат все
остальные классы;
• Server - класс подключенных серверов;
• IP Device - класс подключенных IP-устройств;
• Channel - класс подключенных каналов;
• GPIO Input - класс тревожных входов;
• GPIO Output - класс тревожных выходов;
• OperatorGUI - класс интерфейса оператора;
• Template - класс шаблонов.
Чтобы запросить список объектов класса, необходимо вызвать функцию objects_list().
alert(objects_list("Channel"))
В сообщении будет показан массив, состоящий из объектов класса "Channel".
[
('AC-D1050 1', 'Qmez0La2', 'Channel', 'p0aDXZdXC'),
('DVS Full 8', 'nBSAqWT1', 'Channel', 'p0aDXZdXC'),
('DVS Full 1', 'xeLzkjpd', 'Channel', 'p0aDXZdXC')
]
В данном примере ответ содержит:
• 'AC-D1050 1' - имя объекта;
• 'Qmez0La2' - уникальный guid объекта;
• 'Channel' - класс объекта;
• 'p0aDXZdXC' - guid родительской объекта, которому принадлежит данный объект.
Кроме этого, у каждого объекта есть состояние и методы, то есть функции которые можно вызвать.
Найти объект в скрипте очень просто:
obj = object("Камера 1")
Состояние объекта можно узнать вызовом функции state(). У каждого объекта есть несколько состояний
(вектор состояния). Например у канала есть состояния "motion", "signal", "recording", "recording_on_device".
m = obj.state("motion")
if m=="No Motion":
alert("Движения нет")
Чтобы выяснить, какие состояния есть у объекта, нужно вызвать state() с произвольной строкой. Текст
ошибки при выполнении этой операции будет содержать названия элементов в векторе состояний.
Чтобы узнавать об изменениях состояния, нужно использовать активацию по состоянию объекта:
cam1 = object("Камера 1")
def f():
message("Движение: %s" % cam1.state["motion"])
215
cam1.activate_on_state_changes(f)
Кроме состояния, можно выяснить имя, идентификатор, класс объекта.
alert(obj.name)
alert(obj.guid)
alert(obj.class_name)
Список методов также можно узнать при помощи функции dir(), которая распечатывает содержимое любой
структуры в Python.
alert(dir(obj))
Методы объекта класса "канал"
cam1 = object("Камера 1")
•
Включить запись архива канала
obj.manual_record_start()
•
Выключить запись архива канала
obj.manual_record_stop()
•
Получить положение поворотной камеры
obj.ptz_position_query()
Значения сохраняются в настройках камеры:
settings("channels/[GUID_канала]/ptz/current_pan")
settings("channels/[GUID_канала]/ptz/current_tilt")
settings("channels/[GUID_канала]/ptz/current_zoom")
•
Переместить поворотную камеру на предустановку [preset]
obj.ptz_preset([preset])
•
Включить запись
obj.record(True or False)
•
Выключить ручную запись архива канала
obj.record_off()
•
Включить ручную запись архива канала
obj.record_on()
•
Сохранить скриншот
obj.screenshot()
•
Сохранить скриншот из архива
obj.screenshot_ex("[timestamp]", "[directory]")
[timestamp] - время кадра из архива;
[directory] - директория на сервере, в которую сохраняется скриншот.
•
Сохранить скриншот из архива
obj.screenshot_v2("[time]", "[filename]", "[directory]", [make_thumb])
[time] - время кадра из архива;
[filename] - имя сохраняемого скриншота;
[directory] - директория на сервере, в которую сохраняется скриншот;
[make_thumb] - создать миниатюру (0 - нет).
•
Добавить текст на видео
216
obj.set_watermark("[text]", [text_pos], [time_pos])
[text] - произвольный текст;
[text_pos] и [time_pos] - угол расположения текст и времени: 1-левый верхний, 2-правый верхний, 3-
левый нижний, 4-правый нижний.
•
Экспорт основного/дополнительного потока из архива канала
obj.export_archive("[start_time]", "[end_time]", "[filename]", "[options]")
[start_time] и [end_time] - время начала и конца экспортируемого фрагмента архива, в формате
YYYYMMDD_HHMMSS;
[filename] - имя сохраняемого файла;
[options] - дополнительные опции, передаваемые в формате "name" : value:
• "is_hardware" - экспортировать архив с устройства (0 - нет)
• "want_ss" - экспортировать дополнительный поток (0 - нет)
• "video_codec" - перекодировать видео в кодек ("MPEG4" или "WMV")
• "video_bitrate" - перекодировать с использованием битрейта (значение в кбит/с)
• "video_resolution"
- изменить разрешение видео
("2560x1920", "2048x1536", "1920x1080",
"1600x1200", "1280x1024", "1280x960", "1280x720", "1024x768", "800x600", "720x576", "704x576", "640x480",
"352x288", "320x240", "176x144")
• "audio_codec" - кодек для аудио ("PCM")
• "audio_bitrate" - битрейт для аудио (64, 128) кбит/с
• "need_channel_name_watermark" - вписать в видео название канала (0 - нет)
• "need_timestamp_watermark" - вписать в видео время съёмки (0 - нет)
• "need_fliprotate" - использовать настройки поворота изображения из канала (0 - нет)
• "watermark_need_figures" - добавить фигуры (0 - нет)
• "watermark_align" - расположение вписанного текста (1 - верх-лево, 2 - верх-право, 3 - низ-лево, 4 -
низ-право)
Методы объекта класса "интерфейс оператора"
obj = object("Интерфейс оператора maskaev-pc")
• Экспорт основного/дополнительного потока из архива канала
obj.archive_export("[channel]", "[start_time]", "[end_time]", "[filename]", [on_device])
obj.archive_export_ss("[channel]", "[start_time]", "[end_time]", "[filename]", [on_device])
[channel] - имя канала или его GUID;
[start_time] и [end_time] - время начала и конца экспортируемого фрагмента архива;
[filename] - имя сохраняемого файла;
[on_device] - экспорт архива с устройства (не 0).
• Открыть архив канала
obj.archive_open_inplace("[channel]", "[start_time]")
[channel] - имя канала или его GUID;
[start_time] - время позиционирования.
• Добавить каналы на монитор
obj.assign_channels("[csv_channels]", [monitor_n])
217
[csv_channels] - список каналов через запятую;
[monitor_n] - номер монитора.
• Изменить настройки внешнего вида окна камеры, точно также как и при помощи диалогового окна настроек
внешнего вида.
obj.change_view_settings("[name]", "[value]")
[name] - имя настройки:
"opts_[GUID_канала]_use_common"
"opts_[GUID_канала]_figures_on"
"opts_[GUID_канала]_figures_mode"
"opts_[GUID_канала]_border_mode"
"opts_[GUID_канала]_keep_ratio"
"opts_[GUID_канала]_show_osd"
"opts_[GUID_канала]_show_channel_name"
"opts_[GUID_канала]_show_channel_bold"
"opts_[GUID_канала]_switch_to_ss_pixels"
"opts_[GUID_канала]_turtle_enable"
Если вам необходимо изменить настройки внешнего вида
всех
камер,
то
вместо
[GUID_канала] используете common.
Например:
obj = object("Интерфейс оператора maskaev-pc")
obj.change_view_settings("opts_common_figures_on", "1")
obj.change_view_settings("opts_common_figures_mode", "3")
obj.change_view_settings("opts_syQURNtf_show_osd", "1")
obj.change_view_settings("opts_syQURNtf_show_channel_name", "0")
[value] - значение настройки.
•
Включить/выключить экономичный режим
obj.eco_start("[channel]", [monitor_n])
obj.eco_stop("[channel]", [monitor_n])
[channel] - имя канала или его GUID;
[monitor_n] - номер монитора.
•
Включить/выключить управление PTZ-камерой
obj.ptz_start("[channel]", [monitor_n])
obj.ptz_stop("[channel]", [monitor_n])
[channel] - имя канала или его GUID;
[monitor_n] - номер монитора, на котором будет производиться управление PTZ-камерой.
•
Управлять PTZ-камерой
obj.ptz_focus_auto("[channel]", [monitor_n])
obj.ptz_iris_auto("[channel]", [monitor_n])
obj.ptz_set_coordinates("[channel]", [monitor_n], [pan], [tilt], [zoom])
obj.ptz_set_focus("[channel]", [monitor_n], [speed])
obj.ptz_set_iris("[channel]", [monitor_n], [speed])
obj.ptz_set_zoom("[channel]", [monitor_n], [speed])
obj.ptz_start("[channel]", [monitor_n])
obj.ptz_stop("[channel]", [monitor_n])
obj.ptz_turn_x("[channel]", [monitor_n], [speed_pan])
obj.ptz_turn_y("[channel]", [monitor_n], [speed_tilt]
218
[channel] - имя канала или его GUID;
[monitor_n] - номер монитора, на котором будет производиться управление PTZ-камерой;
[pan], [tilt], [zoom] - координаты поворота (дробное);
[speed], [speed_pan], [speed_tilt] - скорость поворота (целое).
•
Отобразить монитор поверх всех окон
obj.raise_monitor([monitor_n])
[monitor_n] - номер монитора.
•
Сохранить скриншот из архива
obj.screenshot("[channel]", "[time]", "[filename]")
obj.screenshot_ex("[channel]", "[time]", "[filename]", "[directory]", [make_thumb])
[channel] - имя канала или его GUID;
[time] - время кадра из архива;
[filename] - имя сохраняемого скриншота;
[directory] - директория на сервере, в которую сохраняется скриншот;
[make_thumb] - создать миниатюру (0 - нет).
•
Отобразить канал или шаблон на мониторе
obj.show("[name]", [monitor_n])
obj.show_channel("[name]", [monitor_n])
obj.show_template("[name]", [monitor_n])
obj.show_template_by_guid("[name]", [monitor_n])
[name] - имя канала или шаблона;
[monitor_n] - номер монитора.
•
Показать архив канала на мониторе или в шаблоне
obj.show_archive("[name]", [monitor_n], "[start_time]", "[end_time]")
[name] - имя канала или шаблона;
[monitor_n] - номер монитора;
[start_time] и [end_time] - время начала и конца фрагмента архива.
•
Отобразить html-страницу на мониторе или в шаблоне
obj.show_html("[source]", "[url]")
obj.show_html_on_monitor([monitor_n], "[source]", "[url]")
obj.show_html_on_templete([monitor_n], "[name]", "[source]", "[url]")
[monitor_n] - номер монитора;
[name] - имя шаблона;
[source] - идентификатор минибраузера;
[url] - адрес отображаемой html-страницы.
•
Обновить активный монитор
obj.update_active_monitor([csv_channels])
[csv_channels] - список каналов через запятую.
• Встроенный редактор скриптов
219
Диалог с пользователем
Попросить у пользователя ввести строку можно функцией ask()
def hello(n):
message("Привет, %s!" % n)
def fail():
alert("Оператор отказывается отвечать!")
ask("Как вас зовут?", hello, fail)
ask("Как вас зовут?", hello, fail, 60, "Василий")
Диалог после завершения вызовет одну из функций. Первая функция должна быть с одним параметром, в
который помещается ответ на вопрос. Другая функция вызывается если нажата кнопка "Отмена" или Esc.
Можно указать таймаут в секундах, после которого окно само закрывается с отменой, а также начальную
строку.
Попросить выбрать один из нескольких вариантов можно функцией question()
def yes(): message(1)
def no(): message(2)
def dont_know(): message(3)
def other(): message(4)
question("Давно ли вы перестали пить коньяк по утрам?",
"Да", yes,
"Нет", no,
"Не знаю", dont_know,
"Другое", other,
60)
Кнопок в диалоге может быть несколько. Первая кнопка является кнопкой по умолчанию, то есть выбирается
если нажать "Enter". Можно указать таймаут, после которого также автоматически выбирается первый
вариант.
Более развернутый пример использования в примере tov_general.
220
События в скриптах
Чтобы подписаться на события в системном журнале, нужно использовать activate_on_events()
def f(ev):
message("Случилось %s" % ev.type)
activate_on_events("", "", f)
activate_on_events("Motion Start", "", f)
activate_on_events("", "Камера 1", f)
Первым параметром можно задать фильтр по типу событий. Возможные типы событий можно посмотреть в
редакторе правил. Вторым параметром можно задать фильтр по имени или идентификатору объекта. Оба
фильтра могут быть заданы одновременно.
Внутри события можно найти тип события, время, объект от которого пришло событие, а также параметры
p1, p2, p3.
def f(ev):
message("Случилось %s" % ev.type)
message("Идентификатор объекта %s" % ev.origin)
message("Имя объекта %s" % ev.origin_object.name)
message("Время %s" % time.strftime("%H:%M:%S %d.%m.%Y",
time.localtime(ev.ts/1000000)))
activate_on_events("", "", f)
С объектом origin_object можно работать как с любым другим объектом.
Параметры p1, p2, p3 используются в зависимости от типа события. Например событие "Login Successful, %1
from %2" имеет два параметра, которые можно найти в p1 и p2.
221
Параметры и ресурсы в скриптах
Чтобы создать в скрипте блок параметров и/или добавить в скрипт дополнительные ресурсы, необходимо в
начале кода поместить следующий блок:
"""
<parameters>
<company>My Company</company>
<title>My Script</title>
<version>1.0</version>
<parameter>
<type>caption</type>
<name>Настройки</name>
</parameter>
<parameter>
<type>channel</type>
<id>param_channel_1</id>
<name>Камера</name>
<value></value>
</parameter>
<parameter>
<type>integer</type>
<name>Параметр 1</name>
<id>param_1</id>
<value>100</value>
<min>1</min>
<max>100000</max>
</parameter>
<resources>
<resource>httpserver.py</resource>
<resource>index.html</resource>
</resources>
</parameters>
"""
При этом вкладка параметров в редакторе скриптов будет выглядеть так:
После этого значение параметра, указанное в тегах value может быть использовано в скрипте при помощи
идентификатора параметра, указанного в тегах id:
def f():
message("Камера %s" % param_channel_1)
message("Параметр 1 = %s" % param_1)
f()
В качестве типа параметра, указанного в тегах type, могут быть использованы следующие значения:
• caption - название (например, название группы параметров)
<parameter>
<type>caption</type>
<name>Настройки</name>
</parameter>
• integer - целое число
<parameter>
<type>integer</type>
<name>Параметр 1</name>
<id>param_1</id>
<value>100</value>
<min>1</min>
<max>100000</max>
</parameter>
• float - вещественное число
222
<parameter>
<type>float</type>
<name>Параметр 1</name>
<id>param_2</id>
<value>6.00</value>
<min>1.00</min>
<max>10.00</max>
</parameter>
•
string - строка (например, название шаблона)
<parameter>
<type>string</type>
<name>Шаблон для вывода текущей сводки</name>
<id>tpl_for_events</id>
<value>AutoTRASSIR</value>
</parameter>
•
boolean - логическое выражение
<parameter>
<type>boolean</type>
<id>autoupdate_events</id>
<name>Автообновление результатов измерений</name>
<value>0</value>
</parameter>
•
date - дата
<parameter>
<type>date</type>
<id>date_start</id>
<name>Дата начала</name>
<value>2014-03-01</value>
</parameter>
•
time - время
<parameter>
<type>time</type>
<id>time_start</id>
<name>Время начала</name>
<value>10:00:00</value>
</parameter>
•
string_list - список значений через запятую
<parameter>
<type>string_list</type>
<id>cams</id>
<name>Камеры</name>
<value>cam1,cam2,cam3</value>
</parameter>
•
string_from_list - список значений для выбора
<parameter>
<type>string_from_list</type>
<id>user_function</id>
<name>Пользовательская функция</name>
<value>U1</value>
<string_list>U1,U2,U3,U4,U5,U6,U7,U8,U9,U10</string_list>
</parameter>
•
channel - поле для выбора канала из подключенных к серверу TRASSIR
<parameter>
<type>channel</type>
223
<id>channel_id</id>
<name>Камера</name>
<value></value>
</parameter>
• objects - поле для выбора объектов TRASSIR
<parameter>
<type>objects</type>
<id>objects_id</id>
<name>Объекты</name>
<value></value>
</parameter>
• server - поле для выбора сервера TRASSIR
<parameter>
<type>server</type>
<id>server_id</id>
<name>Сервер</name>
<value></value>
</parameter>
В тегах resources указывается относительный путь к файлу, который будет выполнятся вместе со скриптом.
224
Использование ActivePOS в скриптах
Чтобы получать события ActivePOS используется функция activate_on_pos_events()
import time
def f(ev):
message("Уникальный номер события: %s" % ev.op_id)
message("Тип события: %s" % ev.type)
message("ID терминала: %s" % ev.pos_terminal)
message("Имя терминала: %s" % ev.pos_terminal_name)
message("Ассоциированный канал видео: %s" % ev.associated_channel)
message("Флаги: %s" % ev.flags)
message("Номер позиции: %s" % ev.position)
message("Текст: %s" % ev.text)
message("Цена за ед: %0.2f" % (ev.price/100.0))
message("Вес: %0.3f" % (ev.weight/1000.0))
message("Количество: %s" % ev.quantity)
message("Время приема на сервере: %s" %
time.strftime("%H:%M:%S %d.%m.%Y",
time.localtime(ev.ts_received/1000000)))
message("Время как указано в чеке: %s" %
time.strftime("%H:%M:%S %d.%m.%Y",
time.localtime(ev.ts_in_receipt/1000000)))
activate_on_pos_events(f)
Цена задается целым числом в копейках, а вес в граммах. Время приема сообщения может отличаться
от времени установленного на кассовом терминале. Время приема используется для нахождения нужного
момента в видеоархиве, а время на ККМ для поиска.
Скриптом можно находить подозрительные ситуации. С помощью функции pos_fraud() можно привлечь
внимание оператора и записать в чек тревожное событие. По наличию такого события в чеке можно создать
фильтр для поиска и подсветки.
import time
def f(ev):
if time.localtime().tm_hour < 23: return
if ev.type!="POS_POSITION_ADD": return
u = ev.text.decode("utf-8").upper().encode("utf-8")
for w in ["ПИВО", "ВИНО", "ВОДКА", "КОНЬЯК"]:
if u.find(w) != -1:
pos_fraud(ev, "Это ж алкоголь после 23-х")
return
activate_on_pos_events(f)
Функцией upper() строка приводится в верхний регистр
(все большие буквы). Для работы этого
преобразования строка должна быть в юникоде (строки в TRASSIR закодированы в utf-8).
• ActivePOS - контроль кассовых операций
• Формат DSSL XML для ActivePOS
• Примеры правил и скриптов
225
Использование AutoTRASSIR в скриптах
Чтобы реагировать на события AutoTRASSIR используется функция activate_on_lpr_events()
def f(ev):
message("Уникальный номер события: %s" % ev.id)
message("Номер: %s" % ev.plate)
message("Уверенность распознавания: %s" % ev.quality)
message("Страна: %s" % ev.country)
message("Шаблон: %s" % ev.tpl)
message("Время въезда в кадр: %s" % ev.time_enter)
message("Время лучшего вида: %s" % ev.time_bestview)
message("Время выезда из кадра: %s" % ev.time_leave)
message("Идентификатор канала: %s" % ev.channel)
message("Идентификатор сервера: %s" % ev.server)
message("Скорость (при использовании радара): %s" % ev.radar_speed)
message("Найдено в списках: %s" % ev.found_on_lists)
message("Флаги: %x" % ev.flags)
activate_on_lpr_events(f)
Флаги можно протестировать побитовым логическим "И" (обозначается знаком "&") и констант LPR_*.
def f(ev):
message("Номер машины: %s" % ev.plate)
if ev.flags & LPR_UP: message("Едет вверх от камеры")
if ev.flags & LPR_DOWN: message("Едет вниз к камере")
if ev.flags & LPR_BLACKLIST: message("В черном списке")
if ev.flags & LPR_WHITELIST: message("В белом списке")
if ev.flags & LPR_INFO: message("В информационном списке")
if ev.flags & LPR_EXT_DB_ERROR: message("Ошибка внешней БД")
if ev.flags & LPR_CORRECTED: message("Номер исправлен оператором")
activate_on_lpr_events(f)
226
Правила
Мастер по созданию правил предназначен для простой настройки правил в системе видеонаблюдения
TRASSIR. Он позволяет задать нужную реакцию на то или иное событие в системе за несколько кликов, без
необходимости глубоко вникать в систему скриптов.
Любое правило состоит из активации и действия, также можно указать одно или несколько условий.
Активация - это событие, при возникновении которого запускается правило. Можно выбрать следующие
типы активации:
1. По событию - правило будет запускаться при получении выбранного события от любого объекта. Можно
указать как один, так и несколько типов событий, на которые будет реагировать правило. Также с помощью
ссылки Фильтр можно выбрать конкретные объекты, по событию от которых будет запускаться правило.
2. По горячей клавише - правило будет запускаться по нажатию горячей клавиши оператором. Например:
3. По расписанию - позволяет запускать правило в определенное время. Расписание необходимо создавать
перед созданием правила.
4. По изменению состояния - правило будет запускаться при изменении состояния выбранного объекта.
Например, при изменении состояния канала.
5. По изменению настроек - правило будет запускаться при изменении каких-либо настроек в системе,
например при изменении FPS на какой-либо плате или ip-устройстве:
В качестве реакции на событие-активатор правило запускает до пяти Действий. Вы можете добавить
следующие действия:
1. Ожидать - позволяет задавать ожидание между действиями. Также ожидание можно выбрать в качестве
первого действия, и тогда правило будет срабатывать с отсрочкой. Ожидание задается в секундах,
максимальное время ожидания - 24 часа(86400 секунд):
2. Вызвать действие - позволяет управлять объектами в системе. Например, можно включить постоянную
запись на одном из каналов:
3. Проиграть звук - воспроизводит один из предустановленных звуковых файлов.
4. Изменить настройки - изменяет настройки какого-либо из объектов в системе. Например, можно
изменить FPS на одном из каналов:
5. Экспорт видео - экспортирует видео из архива с выбранной камеры за n-секунд, начиная с текущего
момента.
227
6. Сохранить кадр - сохраняет кадр с выбранной камеры за n-секунд, начиная с текущего момента.
7. Отправить письмо - будет отправлен e-mail на указанный адрес. Для данного действия необходима
настроенная учетная запись e-mail. В поле Тема Вы можете, например, вкратце описать событие, а в теле
письма - подробно описать ситуацию и возможные пути ее решения. Если в предыдущих Действиях был
задан экспорт архива, экспортированный файл можно приложить к письму.
8. Отправить смс - позволяет отправить сообщение SMS с уведомлением. На текущий момент данный
функционал не поддерживается.
Условие - это логическое выражение, с помощью которого правилу можно задать конкретный, узкий диапазон
срабатывания. В качестве условия можно задать значения настроек или состояния объектов. Для каждого
конкретного типа активации можно задать имя и/или уникальный ID(guid) отправителя, а также указать
конкретный тип события, если в качестве активатора задано несколько разных типов событий. Например,
если необходимо срабатывание правила только в определенные часы, можно создать соответствующее
расписание и в условии указать нужное состояние расписания:
Количество условий не ограничено, и между ними можно обозначить связь как and или or. В случае and
правило срабатывает тогда, когда выполнены оба условия. В случае or правило срабатывает тогда, когда
выполнено хотя бы одно условие. Также можно сочетать оба типа связок в нужном порядке, например
Условие1 and Условие2 or Условие3 and Условие4 - в таком случае правило будет отрабатывать тогда, когда
выполнены условия 1 и 2 или условия 3 и 4.
Пример условия со связкой and: активацией данного правила является изменение состояния какого-либо из
четырех каналов на "Нет сигнала"; согласно условию правило сработает только в том случае, если на всех
четырех каналах будет состояние "Нет сигнала".
Пример условия со связкой or: активацией данного правила является событие "Здоровье сервера
испортилось"; согласно условию правило отработает только в том случае, если причиной этого состояния
будет ошибка дисковой подсистемы или разрыв соединения с базой данных.
228
Пример условия со связками or и and: активацией данного правила является изменение состояния какого-
либо из четырех каналов на "Нет сигнала"; согласно условию правило сработает только в том случае, если
это состояние будет одновременно на первом и втором или одновременно на третьем и четвертом каналах.
• Скрипты
• Расписания
• Добавление учетной записи e-mail
• Примеры правил и скриптов
229
Расписания
У каждого расписания может быть 3 типа зон - зеленая, красная и синяя. Зоны могут произвольно
чередоваться друг за другом. Зон может быть произвольное количество.
Вы можете создать на сервере необходимое количество расписаний, а затем автоматизировать работу
сервера, применяя расписания с помощью правил к объектам TRASSIR.
Для создания нового расписания необходимо:
1. Открыть окно Настройки.
2. Выбрать пункт Автоматизация.
3. Нажать на ссылку Новое расписание.
4. Задать имя для расписания.
5. Установить флаг Выравнивание по 30-минутным границам, если требуется установка границ зон с
шагом в 30 минут. Если флаг будет снят, то выравнивание будет осуществляться не будет и фактический
размер зоны будет определен выделенной мышью областью.
Вне зависимости от флажка вы можете скорректировать значения начала и окончания зоны вручную с
помощью полей "от" и "до".
6. Распределить дни недели и суточное время на зоны. Для создания зоны:
• выделить с помощью мыши прямоугольную область;
• при необходимости подкорректировать значения временных границ зон вручную;
• нажать на кнопку закраски зоны.
7. Установить флаг Включить расписание. Если расписание будет выключено, то в системе не будет
генерироваться событий о входе расписания в ту или иную зону, и, соответственно, расписание работать
не будет.
После создания расписания его можно использовать, например, для управления включением или
выключением записи видеокамеры. Кроме того, одно расписание может быть использовано для управления
произвольным количеством объектов (не только камер). Для задействования расписания необходимо создать
правило с типом активации "по расписанию" и определить действия, выполняемые при входе расписания в
различные зоны.
Пример: Камера осуществляет запись помещения в нерабочие часы (ночное время). Необходимо настроить
отключение записи камеры с началом рабочего дня.
Для использования расписания необходимо:
1. Создать новое расписание в соответствии с описанной ранее процедурой.
2. В окне Настройки выбрать пункт Скрипты.
3. Нажать на ссылку Новое правило
4. Задать имя для правила и выбрать тип активации "По расписанию".
230
5. Выбрать из списка При входе расписания созданное ранее расписание, а также зону, при входе в которую
необходимо выполнить действие.
6. При необходимости - задать условие выполнения правила, либо оставить по умолчанию (правило будет
выполняться всегда при входе расписания в указанную зону).
7. В списке возможных действий нажать на ссылку Вызвать действие.
8. Выбрать объект (камеру) и выполняемое действие - record_off (выключение записи).
9. Проверить правильность установок правила и нажать на кнопку Сохранить и запустить. Правило будет
активировано в системе и при входе расписания в указанную зону для камеры Lancam-CD812 1 запись
будет отключена.
231
Добавление учетной записи e-mail
Для добавления учетной записи откройте настройки, выберите пункт Автоматизация и нажмите на ссылку
Новая учетная запись e-mail.
В настройках учетной записи укажите следующую информацию:
1. Имя учетной записи - может быть любым. Для удобства можно указать полный адрес почтового ящика.
2. Адрес сервера SMTP - здесь нужно указать адрес SMTP-сервера используемой учетной записи. Например,
для почты my_email@mail.ru SMTP-сервер - "smtp.mail.ru".
3. Порт SMTP - порт, по которому работает SMTP-сервер. Данный порт можно узнать на странице помощи
используемой учетной записи.
4. Пользователь - здесь нужно указать имя пользователя для авторизации на SMTP-сервере. В случае с
e-mail аккаунтом на mail.ru, имя учетной записи совпадает с полным адресом почтового ящика - в данном
случае это "my_email@mail.ru".
5. Пароль - в данном поле нужно указать пароль для авторизации на SMTP-сервере. Пароль нужно указывать
тот, который используется для входа в почту через ее веб-интерфейс.
• Правила
• Скрипты
• Расписания
• Примеры правил и скриптов
232
Примеры правил и скриптов
В данном разделе представлены примеры наиболее востребованных правил и скриптов. С их помощью
Вы можете на реальных примерах понять принципы автоматизации TRASSIR и настроить автоматизацию
в своей системе видеонаблюдения. К каждому примеру прилагается описание, также в примерах описаны
возможности применения правила/скрипта.
233
Правила
Отправка e-mail при потере сигнала с камеры
В данном примере будет рассмотрено правило, которое предназначено для своевременного оповещения о
неполадках на сервере, в частности об отсутствии сигнала с какой-либо приоритетной камеры в системе: при
потере сигнала с выбранной камеры будет отсылаться e-mail с уведомлением об этом событии.
1. Предварительно, необходимо создать учетную запись e-mail. После этого создайте новое правило и
выберите тип активации По событию, в появившемся окне найдите раздел Канал и поставьте галочку в
чекбоксе Сигнал потерян.
2. Далее нужно определить объекты, на событие от которых будет реагировать правило. Для этого в окне
правила нажмите на ссылку Фильтр и в списке объектов выберите интересующую Вас камеру. В нашем
случае это камера с названием "Склад".
3. После этого нажмите на ссылку Отправить письмо - появится форма для создания шаблона письма. В
результате у Вас должно получиться правило примерно такого вида:
На следующем изображении показан пример правила с противоположным действием: в том случае, если
сигнал с камеры "Склад" будет восстановлен, будет отправлено письмо с информацией о том, что сигнал
на этой камере был восстановлен.
Ниже представлен пример скрипта с расширенным функционалом: письмо будет отправляться при потере
сигнала с любой камеры, и в письме будет указано название соответствующего канала:
def send_message(event):
message_text = '''На сервере [имя сервера] пропал сигнал на камере "%s".\
234
Нужно позвонить на охрану по номеру 123456789.'''\
% event.origin_object.name
send_mail_from_account("sender@mail.ru", ["addressee@mail.ru"],\
"Тема письма: нет сигнала с камеры '%s'" % event.origin_object.name,\
message_text, [])
activate_on_events("Signal Lost", "", send_message)
Отображение камеры на весь экран при детекции движения
В этом примере мы рассмотрим правило, которое предназначено для привлечения внимания оператора к
тем камерам, на которых сам факт наличия движения является тревожным событием: при возникновении
движения на определенной камере, она будет разворачиваться на весь экран на выбранном мониторе.
1. Предварительно, необходимо включить генерацию событий о появлении движения на нужной камере.
Для этого в настройках сервера зайдите в раздел Каналы, выберите нужный канал и поставьте галочку
в чекбоксе Генерировать события о появлении движения. После этого в журнал событий начнут
поступать события о движении на данном канале.
2. Далее создайте новое правило и выберите тип активации По событию. В появившемся окне найдите
раздел Канал и поставьте галочку в чекбоксе Движение обнаружено.
3. После этого нужно определить объекты, на событие от которых будет реагировать правило. Для этого в
окне правила нажмите на ссылку Фильтр и выберите интересующую Вас камеру. В нашем случае это
камера с названием "Холодный склад".
4. Далее нажмите на ссылку Вызвать действие, в появившемся окне слева выберите раздел Интерфейс
оператора [имя сервера], а в правом выберите строку show_channel. После этого в правиле появится
возможность указать канал и монитор.
Ниже представлен пример скрипта с расширенным функционалом: любая камера, на которой будет возникать
движение, будет разворачиваться на второй монитор. Для этого нужно поставить галочку Генерировать
события о появлении движения в настройках нужных каналов, создать новый скрипт и вставить в него
следующий код:
def show_channel_with_motion(event):
object("Интерфейс оператора [имя сервера]").\
show_channel(event.origin,2)
activate_on_events("Motion Start", "", show_channel_with_motion)
Воспроизведение звука при размыкании тревожного входа
В этом примере мы рассмотрим правило, которое предназначено для привлечения внимания оператора
к тревожной ситуации путем воспроизведения звукового файла. Согласно примеру, при размыкании
тревожного входа будет воспроизводиться звуковое оповещение. С помощью тревожного входа можно
контролировать, например, дверь или окно, а также какие-либо датчики.
1. Создайте новое правило и выберите тип активации По событию. В появившемся окне найдите раздел
GPIO вход и поставьте галочку в чекбоксе Сигнал на входе пропал.
2. Далее нажмите на ссылку Фильтр и в списке объектов выберите интересующий Вас тревожный вход. В
нашем случае это объект с названием "Запасный выход(дверь)".
235
3. После этого нажмите на ссылку Проиграть звук и в выпадающем списке выберите один из
предустановленных звуков.
Ниже представлен пример правила с противоположной активацией: в том случае, если сработает замыкание
тревожного входа, будет воспроизведен звуковой файл для оповещения оператора о закрытии двери
запасного выхода.
Увеличение FPS на камере при изменении состояния устройства Орион
В этом примере мы рассмотрим правило, которое предназначено для увеличения детализации видеоряда
в случае возникновения тревожных ситуаций для их последующего подробного анализа. Согласно данному
правилу, при изменении состояния устройства АРМ Орион, будет увеличиваться FPS на одной из камер.
1. Создайте новое правило и выберите тип активации По изменению состояния. В появившемся окне
найдите раздел Orion и поставьте галочку в чекбоксе нужного устройства.
2. После этого нажмите на ссылку Изменить настройки. В окне Вставка настроек нужно раскрыть
раздел IP-устройства, выбрать нужное IP-устройство и выбрать строку channel00_fps. После этого в
появившемся поле введите нужное количество FPS.
Ниже представлен пример скрипта с расширенным функционалом, согласно которому при изменении
состояния устройства АРМ Орион, будет увеличиваться FPS на всех камерах.
def set_fps_on_all_devices(fps):
for d in settings("ip_cameras").ls():
if d.type != "Grabber": continue
for c in range(0, 16):
d["channel%02d_fps" % c] = fps
for b in settings("boards").ls():
for i in range(0, 16):
b["channel%02d_fps" % i] = fps
def condition():
236
if object_sh1p127.state("state") == "Alarm"
set_fps_on_all_devices(25)
elif object_sh1p127.state("state") == "Armed"
set_fps_on_all_devices(12)
object_sh1p127 = object("ШС 1, Прибор 127")
object_sh1p127.activate_on_state_changes(condition)
Отправка e-mail при изменении индикатора здоровья сервера
В данном примере будет рассмотрено правило, согласно которому при отключении базы данных и/или при
возникновении ошибок диска на сервере, будет отсылаться e-mail с уведомлением.
1. Предварительно, необходимо создать учетную запись e-mail. После этого создайте новое правило и
выберите тип активации По событию, в появившемся окне найдите раздел Сервер и поставьте галочку
в чекбоксе Здоровье сервера испортилось.
2. Далее нажмите на ссылку Фильтр и в окне Вставка объекта поставьте галочку в чекбоксе нужного
сервера.
3. Для того, чтобы письма отсылались только в случае отключения базы данных и/или при возникновении
ошибок диска, нужно задать соответствующие условия:
• Найдите раздел Здоровье и выберите строку disks_error_count. Затем нужно указать значение для
параметра disks_error_count: для этого в поле ввода допишите " == 1" без кавычек.
• Найдите раздел Здоровье и выберите строку db_connected. Затем нужно указать значение для
параметра db_connected: для этого в поле ввода допишите " == 0" без кавычек.
Между условиями выберите связку or.
4. Далее нажмите на ссылку Отправить письмо - появится форма для создания шаблона письма. В
результате у Вас должно получиться правило примерно следующего вида:
Ниже представлено правило, согласно которому при изменении состояния сервера на нормальное будет
отправлено письмо с уведомлением об этом.
237
Включение постоянной записи при пересечении границы детектора SIMT в выходные дни
В этом примере будет рассмотрено правило, согласно которому при пересечении границы в выходные
дни, будет включаться постоянная запись на одной из камер. Данное правило предназначено для
гарантированного осуществления записи происходящего в случае проникновения кого-либо на закрытый
объект в выходной день.
1. Предварительно, необходимо создать границу SIMT. Для этого в настройках откройте раздел Каналы и
выберите нужный канал. Далее в выпадающем списке Детектор движения выберите строку Детектор
движущихся объектов(SIMT) и нажмите на ссылку Зоны SIMT.
2. После этого нужно сделать следующее:
a. Создайте в нужном месте границу.
b. Задайте название для созданной границы.
c. Поставьте галочку в чекбоксе Создать объект. Это необходимо для того, чтобы данная граница
присутствовала в системе как объект.
d. Поставьте галочку в чекбоксе Генерировать события. Это необходимо для того, чтобы в журнал
событий от данной границы поступали события.
238
3. Далее необходимо создать расписание.
После этого создайте новое правило и выберите активацию По событию. В окне Вставка события
раскройте раздел Границы SIMT и поставьте галочку в чекбоксе Пересечение границы B -> A.
4. Далее нажмите на ссылку Фильтр и в окне Вставка объекта поставьте галочку в чекбоксе ранее
созданной границы.
5. Затем нам необходимо связать это правило с расписанием, чтобы оно отрабатывало только на выходных.
Для этого в Условии выберите строку Состояния объектов, укажите ранее созданное расписание,
нажмите color и выберите красный цвет.
6. После этого в окне правила нажмите на ссылку Вызвать действие, в окне Вставка объекта выберите
канал, на котором должна включаться постоянная запись, и строку manual_record_start.
Также возможно создание обратного правила. Ниже представлен пример, согласно которому при пересечении
границы в обратном направлении(A -> B, выход с территории) в выходные дни, постоянная запись на камере
будет отключаться.
239
Включение сирены при размыкании тревожного входа ночью
В этом примере мы рассмотрим правило, которое предназначено для поднятия тревоги в случае
проникновения на объект в ночное время. В рассматриваемом примере используется расписание, контакты
тревожного входа на двери запасного выхода и контакты тревожного выхода, подключенные к сирене - таким
образом, если дверь запасного выхода будет открыта в ночное время, включится сирена.
1. Предварительно, необходимо создать расписание.
2. Далее создайте новое правило и выберите тип активации По событию. В появившемся окне найдите
раздел GPIO вход и поставьте галочку в чекбоксе Сигнал на входе пропал.
3. После этого нажмите Фильтр и в окне Вставка объекта поставьте галочку в чекбоксе тревожного входа,
в нашем случае это "Запасный выход(дверь)".
4. Далее нам необходимо связать это правило с расписанием, чтобы оно отрабатывало только ночью. Для
этого в Условии выберите строку Состояния объектов, затем укажите ранее созданное расписание,
нажмите color и выберите красный цвет.
5. После этого в окне правила нажмите на ссылку Вызвать действие, в окне Вставка объекта выберите
тревожный выход, к которому подключена сирена, и строку set_output_high. В итоге правило должно
выглядеть примерно следующим образом:
Ниже представлен пример правила с противоположной активацией: в том случае, если дверь запасного
выхода закроется(тревожный вход будет замкнут), через 5 секунд сирена выключится(тревожный выход будет
разомкнут).
240
241
Скрипты
Изменение FPS на всех каналах ночью
В этом примере мы рассмотрим скрипт, который предназначен для изменения FPS на всех каналах по
расписанию: при наступлении ночи, FPS на всех каналах будет изменяться на 12 к/с, а при наступлении дня
- на 25 к/с.
Предварительно, необходимо создать расписание. На скриншоте ниже показана настройка расписания для
данного примера.
После этого нужно создать новый скрипт и скопировать в него следующий код.
def set_fps_on_all_devices(fps):
for d in settings("ip_cameras").ls():
if d.type != "Grabber": continue
for c in range(16):
d["channel%02d_fps" % c] = fps
for b in settings("boards").ls():
for i in range(16):
b["channel%02d_fps" % i] = fps
def condition():
if (object_schedule.state("color") == "Red") :
set_fps_on_all_devices(12)
elif (object_schedule.state("color") == "Green") :
set_fps_on_all_devices(25)
object_schedule = object("Ночь")
object_schedule.activate_on_state_changes(condition)
Рассмотрим некоторые части скрипта подробнее.
1. В этой части скрипта указывается активатор, здесь активатором является расписание. Для привязки
скрипта к любому другому расписанию достаточно заменить название расписания object("Ночь").
object_schedule = object("Ночь")
object_schedule.activate_on_state_changes(condition)
2. В функции condition описано условие, согласно которому если расписание находится в красной зоне,
переменной "fps" задается значение 12, а если в зеленой, то 25.
def condition():
if (object_schedule.state("color") == "Red") :
set_fps_on_all_devices(12)
elif (object_schedule.state("color") == "Green") :
set_fps_on_all_devices(25)
3. В данной части скрипта для всех каналов всех устройств указывается количество кадров в секунду, равное
переменной "fps".
def set_fps_on_all_devices(fps):
for d in settings("ip_cameras").ls():
if d.type != "Grabber": continue
for c in range(16):
d["channel%02d_fps" % c] = fps
for b in settings("boards").ls():
for i in range(16):
b["channel%02d_fps" % i] = fps
Ниже представлена упрощенная версия скрипта, активатором которого будут горячие клавиши F5 и F6.
def set_fps_on_all_devices(fps):
for d in settings("ip_cameras").ls():
242
if d.type != "Grabber": continue
for c in range(16):
d["channel%02d_fps" % c] = fps
for b in settings("boards").ls():
for i in range(16):
b["channel%02d_fps" % i] = fps
def channel_fps_25():
set_fps_on_all_devices(25)
def channel_fps_12():
set_fps_on_all_devices(12)
activate_on_shortcut("F5", channel_fps_25)
activate_on_shortcut("F6", channel_fps_12)
Включение экономичного режима по всем устройствам типа "Lanser" в выходные дни
В этом примере мы рассмотрим скрипт, согласно которому все устройства семейства Lanser в будние дни
будут работать в штатном режиме, а на выходных - в экономичном.
Предварительно, необходимо создать расписание. На скриншоте ниже показана настройка расписания для
данного примера.
После этого нужно создать новый скрипт и скопировать в него следующий код.
def economy_mode_on_all_nvr(on):
for d in settings("ip_cameras").ls():
if d.type != "Grabber": continue
if d["family"] == "NVR":
d["economy_mode"] = on
def condition():
if (object_schedule.state("color") == "Red") :
economy_mode_on_all_nvr(1)
elif (object_schedule.state("color") == "Green") :
economy_mode_on_all_nvr(0)
object_schedule = object("Выходные дни")
object_schedule.activate_on_state_changes(condition)
Рассмотрим некоторые части скрипта подробнее.
1. В этой части скрипта указывается активатор, здесь активатором является расписание. Для привязки
скрипта к любому другому расписанию достаточно заменить название расписания object("Выходные
дни")
object_schedule = object("Выходные дни")
object_schedule.activate_on_state_changes(condition)
2. В функции condition описано условие, согласно которому если расписание находится в красной зоне,
переменной "on" задается значение 1, а если в зеленой, то 0.
def condition():
if (object_schedule.state("color") == "Red") :
economy_mode_on_all_nvr(1)
elif (object_schedule.state("color") == "Green") :
economy_mode_on_all_nvr(0)
3. В данной части скрипта параметру "economy_mode" для всех устройств семейства "Lanser" присваивается
значение, равное переменной "on".
def economy_mode_on_all_nvr(on):
for d in settings("ip_cameras").ls():
if d.type != "Grabber": continue
if d["family"] == "NVR":
243
d["economy_mode"] = on
Ниже представлен пример упрощенного скрипта, согласно которому устройства Lanser будут переходить в
экономичный режим / выходить из него по горячим клавишам F5 и F6 соответственно.
def economy_mode_on_all_nvr(on):
for d in settings("ip_cameras").ls():
if d.type != "Grabber": continue
if d["family"] == "NVR":
d["economy_mode"] = on
def economy_mode_on():
economy_mode_on_all_nvr(1)
def economy_mode_off():
economy_mode_on_all_nvr(0)
activate_on_shortcut("F5", economy_mode_on)
activate_on_shortcut("F6", economy_mode_off)
Замыкание тревожного выхода при проезде машины из белого списка AutoTRASSIR
В этом примере мы рассмотрим скрипт, который предназначен для автоматического управления шлагбаумом:
при проезде машин из белого списка шлагбаум будет открываться. Это реализовано при помощи функции
"белый список" AutoTRASSIR и тревожного выхода.
Предварительно необходимо настроить внутренний список или подключить внешний список. После этого
нужно создать новый скрипт и скопировать в него следующий код.
lock = False
class TaskLocker:
def __init__(self):
global lock
if lock:
self.have_lock = False
return
else:
self.have_lock = True
lock = True
gates_open(self)
def __del__(self):
if self.have_lock:
global lock
lock = not 1
def gates_close(lock):
object("Output 1").set_output_low()
def waiting(lock):
timeout(10 * 1000, lambda: gates_close(lock))
def gates_open(lock):
object("Output 1").set_output_high()
waiting(lock)
def aquire_lock():
TaskLocker()
def the_lpr_handler(event):
if event.flags & LPR_WHITELIST:
aquire_lock()
activate_on_lpr_events(the_lpr_handler)
Рассмотрим некоторые блоки подробнее.
1. В этой части скрипта указывается активатор, здесь активатором является событие от AutoTRASSIR.
activate_on_lpr_events(the_lpr_handler)
2. В функции the_lpr_handler(event) проверяется, найден ли номер в белом списке. Если распознанный номер
найден в белом списке, запускается функция aquire_lock().
244
def the_lpr_handler(event):
if event.flags & LPR_WHITELIST:
aquire_lock()
message("Машина в белом списке")
3. Функция aquire_lock() вызывает класс TaskLocker().
def aquire_lock():
TaskLocker()
4. Класс TaskLocker предназначен для того, чтобы скрипт отрабатывал до конца. В том случае, если действия
в скрипте достаточно продолжительны по времени исполнения, а активация скрипта инициализируется до
окончания его предыдущего выполнения, класс TaskLocker предотвратит повторный запуск скрипта до тех
пор, пока не будут выполнены все действия скрипта в рамках его предыдущей активации.
lock = False
class TaskLocker:
def __init__(self):
global lock
if lock:
self.have_lock = False
return
else:
self.have_lock = True
lock = True
gates_open(self)
def __del__(self):
if self.have_lock:
global lock
lock = not 1
5. Функция gates_open(lock) замыкает тревожный выход Output 1 и вызывает функцию waiting(lock).
def gates_open(lock):
object("Output 1").set_output_high()
waiting(lock)
6. Функция waiting(lock) запускает ожидание, равное
10 секундам, после чего вызывает функцию
gates_close(lock).
def waiting(lock):
timeout(10 * 1000, lambda: gates_close(lock))
7. Функция gates_close(lock) размыкает тревожный выход Output 1.
def gates_close(lock):
object("Output 1").set_output_low()
Ниже представлена версия скрипта, согласно которому при нахождении номера в черном списке будет
воспроизводиться звуковой файл.
def play_sound(filename):
import platform
if platform.system() == 'Windows':
import winsound
winsound.PlaySound(filename, winsound.SND_FILENAME\
| winsound.SND_ASYNC | winsound.SND_NOWAIT)
else:
alert('Not implemented')
def the_lpr_handler(event):
if event.flags & LPR_BLACKLIST:
play_sound(r"C:\DSSL\Trassir-3.0.2239/sounds\alarm.wav")
activate_on_lpr_events(the_lpr_handler)
245
Сохранение скриншотов AutoTRASSIR в разные папки
В этом примере будет рассмотрен скрипт, который предназначен для сохранения скриншотов машин из
белого списка, черного списка или с недостаточно распознанным номером в разные папки. Это реализовано
при помощи списков AutoTRASSIR и функции сохранения скриншотов.
Предварительно, необходимо настроить внутренний список или подключить внешний список. После этого
нужно создать новый скрипт и скопировать в него следующий код.
def condition(event):
if event.quality == 0 :
obj(event.channel).screenshot_ex("", r"C:\DSSL\Screenshots\Low_quality")
elif event.flags & LPR_WHITELIST :
obj(event.channel).screenshot_ex("", r"C:\DSSL\Screenshots\Whitelist")
elif event.flags & LPR_BLACKLIST :
obj(event.channel).screenshot_ex("", r"C:\DSSL\Screenshots\Blacklist")
activate_on_lpr_events(condition)
Рассмотрим некоторые части скрипта подробнее.
1. В этой части скрипта указывается активатор, здесь активатором является событие от AutoTRASSIR.
activate_on_lpr_events(condition)
2. В функции condition описано условие, согласно которому:
• если процент распознавания хотя бы одного символа в знаке равен нулю, с канала сохраняется скриншот
и помещается в папку "C:\DSSL\Screenshots\Low_quality"
if event.quality == 0 :
obj(event.channel).screenshot_ex\
("",r"C:\DSSL\Screenshots\Low_quality")
• если распознанный номер найден в белом списке, с канала сохраняется скриншот и помещается в папку
"C:\DSSL\Screenshots\Whitelist"
elif event.flags & LPR_WHITELIST :
obj(event.channel).screenshot_ex\
("",r"C:\DSSL\Screenshots\Whitelist")
• если распознанный номер найден в черном списке, с канала сохраняется скриншот и помещается в папку
"C:\DSSL\Screenshots\Blacklist"
elif event.flags & LPR_BLACKLIST :
obj(event.channel).screenshot_ex\
("",r"C:\DSSL\Screenshots\Blacklist")
Скриншот при регистрации кассира
В этом примере мы рассмотрим скрипт, который будет активироваться по событию от СККО ActivePOS.
В качестве события указана регистрация кассира, а в качестве действия - сохранение скриншота с
ассоциированного канала. Таким образом, при регистрации на кассе будет сохранен скриншот с кассиром -
это позволит при необходимости верифицировать личность кассира.
def shot(event):
if event.type == "POS_CASHIER_REGISTRATION":
obj(event.associated_channel).screenshot_ex("",r"C:\DSSL\Shots\Cashiers")
activate_on_pos_events(shot)
1. В этой части скрипта указывается активатор, здесь активатором является событие от ActivePOS.
activate_on_pos_events(shot)
2. В функции shot(event) описано условие, согласно которому если событие является регистрацией кассира,
с ассоциированного канала сохраняется скриншот в папку "C:\DSSL\Shots\Cashiers".
246
def shot(event):
if event.type == "POS_CASHIER_REGISTRATION":
obj(event.associated_channel).screenshot_ex\
("",r"C:\DSSL\Shots\Cashiers")
Установка тревожной закладки в чек при продаже алкоголя ночью
В каждом магазине существуют определенные сценарии событий, которые являются тревожными и требуют
проверки. TRASSIR ActivePOS позволяет помечать такие события с помощью тревожных закладок и
дописывать к ним произвольный комментарий, после чего можно проводить выборку этих событий для их
дальнейшего анализа. В этом примере мы рассмотрим скрипт, который помечает продажу алкоголя ночью
как тревожное событие.
Предварительно, необходимо создать расписание. На скриншоте ниже показана настройка расписания для
данного примера.
После этого создайте новый скрипт и вставьте в него следующий код:
def condition(ev):
if (object("Ночь").state("color") == "Red"): return
if ev.type!="POS_POSITION_ADD": return
u = ev.text.decode("utf-8").upper().encode("utf-8")
for w in ["ПИВО", "ВИНО", "ВОДКА", "КОНЬЯК"]:
if u.find(w) != -1:
pos_fraud(ev, "Внимание! Незаконная продажа алкоголя!")
return
activate_on_pos_events(condition)
Рассмотрим некоторые части скрипта подробнее.
1. В данной части скрипта указывается активатор, здесь активатором является событие от ActivePOS.
activate_on_pos_events(сondition)
2. В функции condition проверяется, находится ли расписание "Ночь" в красной зоне, а также является ли
событие добавлением позиции. В случае положительного результата, в названии товара осуществляется
поиск таких слов, как "ПИВО", "ВИНО", "ВОДКА", "КОНЬЯК"(можно добавить и другие названия, которые
встречаются в реализуемых товарах в Вашем магазине). Если одно из этих слов в названии товара будет
найдено, с помощью метода pos_fraud в чек будет вставлена тревожная закладка, а под тревожным
событием появится заданный комментарий.
def condition(ev):
if (object("Ночь").state("color") == "Red"): return
if ev.type!="POS_POSITION_ADD": return
u = ev.text.decode("utf-8").upper().encode("utf-8")
for w in ["ПИВО", "ВИНО", "ВОДКА", "КОНЬЯК"]:
if u.find(w) != -1:
pos_fraud(ev, "Внимание! Незаконная продажа алкоголя!")
return
Экспорт архива при отмене чека
В этом примере мы рассмотрим скрипт, согласно которому при отмене чека или при отмене позиции будет
запускаться экспорт архива с камеры над кассой, в экспортированный файл войдет запись, включающая в
себя 15 секунд до события и 15 секунд после него.
Для начала необходимо создать новый скрипт и скопировать в него следующий код.
from time import strftime
from time import time
from time import localtime
247
from os import path
def export_wait(filename, callback):
status = get_archive_export_status(path.basename(filename))
if status==1:
timeout(1000, lambda: export_wait(filename, callback))
elif status==0 or status==2:
alert("AVI export failed")
callback()
else:
if not path.exists(decode(filename)):
alert("Exported file %s not found!" % filename)
callback()
def action0_2():
pass
def start_export(ev, t1, t2, filename):
object("Интерфейс оператора m-gilyazov").archive_export\
(ev.associated_channel, t1, t2, path.basename(filename), 0)
timeout(1000, lambda: export_wait(filename, lambda: action0_2()))
def condition(event):
if event.type == "POS_RECEIPT_CANCEL"\
or event.type == "POS_POSITION_CANCEL":
t = time()
t1 = '%.0f' % ((t-30)*1000000)
t2 = '%.0f' % (t*1000000)
shots_path = r"C:\DSSL\Screenshots\cancel"
filename = event.pos_terminal_name + strftime('%Y%m%d_%H%M%S',\
localtime(t)) + '.avi'
filename = shots_path + '/' + filename
timeout(15000, lambda: start_export(event, t1, t2, filename))
activate_on_pos_events(condition)
Рассмотрим некоторые части скрипта подробнее.
1. В данной части скрипта указывается активатор, здесь активатором является событие от ActivePOS.
activate_on_pos_events(сondition)
2. В функции condition проверяется, является ли событие отменой позиции или отменой чека. В случае
положительного результата запускается функция start_export. В функции condition также указано
ожидание(30 секунд), имя файла на выходе и путь к папке, куда будет сохранен экспортированный файл.
def condition(event):
if event.type == "POS_RECEIPT_CANCEL"\
or event.type == "POS_POSITION_CANCEL":
t = time()
t1 = '%.0f' % ((t-30)*1000000)
t2 = '%.0f' % (t*1000000)
shots_path = r"C:\DSSL\Screenshots\cancel"
filename = event.pos_terminal_name +\
strftime('%Y%m%d_%H%M%S', localtime(t)) + '.avi'
filename = shots_path + '/' + filename
exported_files[event.pos_terminal_name] = filename
timeout(15000, lambda: start_export\
(event, t1, t2, filename))
3. Функция start_export запускает экспорт архива с заданными ранее параметрами, а также запускает функцию
export_wait.
def start_export(ev, t1, t2, filename):
object("Интерфейс оператора m-gilyazov").archive_export\
(ev.associated_channel, t1, t2, path.basename(filename), 0)
timeout(1000, lambda: export_wait(filename, lambda: action0_2()))
4. Функция export_wait проверяет, ведется ли сейчас экспорт архива с прошлой активации скрипта и в случае
отрицательного ответа запускает функцию action0_2.
def start_export(ev, t1, t2, filename):
object("Интерфейс оператора m-gilyazov").archive_export\
248
(ev.associated_channel, t1, t2, path.basename(filename), 0)
timeout(1000, lambda: export_wait(filename, lambda: action0_2()))
Изменение чувствительности детектора по расписанию
В этом примере мы рассмотрим скрипт, который предназначен для изменения чувствительности детектора
движения по расписанию. Он позволяет снизить количество срабатываний детектора на шумы ночью.
Предварительно, необходимо создать расписание. На скриншоте ниже показана настройка расписания для
данного примера.
После этого нужно создать новый скрипт и скопировать в него следующий код.
night = \
'''22 18
zone_mask Зона 1
2 0 0
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111'''
day = \
'''22 18
zone_mask Зона 1
5 0 0
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111
1111111111111111111111'''
def md_settings(md):
for d in settings("ip_cameras").ls():
if d.type != "Grabber": continue
if d["family"] == "Hikvision":
d["channel00_md_setup"] = md
def condition():
if (object_schedule.state("color") == "Red") :
md_settings(night)
elif (object_schedule.state("color") == "Green") :
md_settings(day)
object_schedule = object("From Dusk Till Dawn")
249
содержание .. 3 4 5 6 ..
|
||
|
|
|