Установка и настройка

little-brother edited this page Jun 14, 2017 · 33 revisions

Системные требования

Сервер
Серверная часть приложения может быть развернута практически на любом устройстве, подходящим для запуска Node.js.
Операционная система одна из: MacOS, GNU/Linux, Solaris, FreeBSD, OpenBSD, Open webOS и Windows.

Клиент
Разрешение экрана 1920х1080 и более.
Оперативная память 2Гб и более.
Браузер Chrome или Firefox.

Установка

  1. Скачать и установить Node.js.

  2. Установить инсталлятор приложения, выполнив в консоли

    npm i little-brother-setup -g
  3. Запустить инсталлятор, выполнив в консоли

    little-brother-setup

Вы можете установить приложение самостоятельно
Просмотреть инструкцию

  1. Скачайте и установите Node.js.
  2. Скачайте и распакуйте дистрибутив приложения.
  3. Перейдите к извлеченным файлам и установить приложение, выполнив
npm i

Далее требуется установить локального агента

  1. Создайте папку agent в текущей папке.
  2. Скачайте и распакуйте дистрибутив агента в папку agent, так чтобы файлы агента располагались непосредственно в папке agent.
  1. Установить агента, выполнив в папке агента
npm i

Проверить и при необходимости отредактировать в файле /agent/package.json параметр ping

nix: {"command" : "ping -w 3 ${ip} > /dev/null 2>&1"}
win: {"command" : "(ping -n 1 ${ip}|Find /I \"TTL=\" || goto next) && exit /b 0 && :next exit /b 1"}
  1. Проверить и при необходимости отредактировать в файле package.json секцию scripts:start
nix: "NODE_PATH=.:./models:./tools:./services:./include && node app.js"
Win: "set NODE_PATH=.;./models;./tools;./services;./include; && node app.js"
  1. Запустить приложение
npm start
  1. Открыть браузер, перейти на страницу http://127.0.0.1:2000 и ввести admin/admin или guest/guest, как логин/пароль.
Если при установке возникли ошибки


Приложение использует модуль для работы с базой sqlite, который должен быть скомпилирован под вашу систему.
Можно воспользоваться пакетом node-pre-gyp, позволяющим получить требуемое без установки средств разработки. Для его установки выполните

npm i node-pre-gyp -g 

И после запустите установку приложения заново.
Если и после этого вы видите ошибки, то попробуйте установить предыдущую версию Node.js.


Для запуска приложения, находясь в папке где приложение установлено, выполните
npm start

Настройка (файл config.json)

Все основные настройки системы выполняются путем редактирования файла конфигурации config.json. Перед вводом данных рекомендуется ознакомиться с возможными настройками.

Название Описание
http Настройки http-сервера
  • port - http-порт, по которому приложение будет доступно.
    По умолчанию 2000, что определяет http://127.0.0.1:2000
  • ws-port - http-порт для оповещения браузерных клиентов по протоколу websocket.
    Должен отличаться от port.
    По умолчанию 2001.
  • ws-video-port - http-порт для учета участников видео-трансляций.
    Должен отличаться от port.
    По умолчанию 2002.
  • compress - true или false
    Если true, то перед отправкой страниц сервер будет их сжимать gzip. Уменьшает объем пересылаемых данных и увеличивает нагрузку на сервер.
    По умолчанию false.
  • beautify - true или false
    Если true, то перед отправкой страницы сервер дополнительно форматирует ее, расставляя отступы и убирая лишние переносы строк, повышая тем самым читаемость html-источника.
    По умолчанию false.
  • serve-static - true или false
    Если true, то статика будет отдаваться самим приложением.
    Рекомендуется настроить nginx для этих целей. Подробнее см. здесь.
    По умолчанию true.
db Конфигурация базы данных.
use-journal true или false
Если установлено в false, то пункт Журнал не будет отображаться в главном меню.
По умолчанию true.
session Задает параметры сессий для авторизации пользователей.
Рекомендуется изменить значение secret.
locale Параметры хранения и отображения единиц измерения и даты.
Система измерений должна быть выбрана до ввода данных и в дальнейшем не может быть изменена.
  • measurement-units - система измерений, в котором будут храниться величины.
    Если metric: мм, С°, кг.
    Если english: in, °F, lbs.
    По умолчанию metric.
  • date-format - формат для вывода даты и времени
qsearch-limit Максимальное число записей возвращаемое при быстром поиске. Если false, то не ограничено.
По умолчанию 30.
PUBLIC_DIR Папка, содержащая файлы доступные из браузера
По умолчанию ./public/.
agent-list В данном разделе задается список агентов, которые будут опрашивать устройства и пересылать данные приложению.
По крайней мере один агент должен быть развернут и настроен. Агент определяется для каждого здания отдельно.

Параметры для соединения с агентом

  • id - идентификатор (латиницей, без пробелов и знаков препинания)
  • host - ip-адрес, где агент развернут. Для локального агента - 127.0.0.1
  • port - tcp-порт агента, на который будет обращаться приложение для получения данных
  • cipher - алгоритм шифрования данных между приложением и агентом. По умолчанию aes192
  • password - пароль для обмена данными. Должен совпадать с тем, что указан на агенте, как и алгоритм.
  • reconnect-delay - число секунд, перед повторной попыткой соединиться с агентом. По умолчанию 30.
Пример конфигурации для соединения с одним локальным агентом local

"agent-list" : [ { "id": "local", "host": "127.0.0.1", "port": 3000, "cipher": "aes192", "password": "little", "reconnect-delay": 30 } ]

local-agent Команда для запуска агента, после старта приложения. По умолчанию, будет запущен агент из папки agent на порту 2003. При этом агент автоматически будет перезапущен при его падении, а также автоматически закрыт при завершении работы самого приложения. agent-list должен содержать параметры подключения к этому агенту.
alert-transport-list Задает каким образом могут быть отправлены оповещения пользователям, напр. sms или email.
При задании выполняемых команд можно использовать следующие переменные, которые будут определены при наступлении события
  • ${time} - время события в формате `Unix-time`, т.е. число секунд с 1.01.1970
  • ${user.*} - атрибуты пользователя, для которого отправляется сообщение, напр. ${user.name}. По умолчанию доступны name, phone, email, comment.
  • ${device.*} - атрибуты устройства, у которого изменился статус, напр. ${device.name} и ${device.status} (число: 0 - неизвестно, 1 - норма, 2 - внимание, 3 - критично)
  • ${url} - ссылка на день в истории изменения статуса устройства, вида /device-#id/history-#time,#time. Переменная определена только при изменении статуса устройства.
  • ${agent.*} - параметры агента, у которого изменился статус, напр. ${agent.id} и ${agent.isConnected}
Пример транспорта demo для Windows, который пишет данные в файл message.txt при наступлении различных возможных событий
"alert-transport-list" : {
"demo" : {
  "on-device-warning" : "echo %DATE% %TIME%:  ${user.phone} ${device.name} ${device.status} >> message.txt",
  "on-device-warning-to-normal" : "echo %DATE% %TIME%:  ${user.phone} ${device.name} ${device.status} >> message.txt",
  "on-device-critical" : "echo %DATE% %TIME%:  ${user.phone} ${device.name} ${device.status} >> message.txt",
  "on-device-critical-to-normal" : "echo %DATE% %TIME%:  ${user.phone} ${device.name} ${device.status} >> message.txt",
  "on-agent-disconnect" : "echo Agent ${agent.id} disconnect time: ${new Date(time)} >> message.txt",
  "on-agent-connect" : "echo Agent ${agent.id} connect time: ${new Date(time)} >> message.txt",
  "options" : { "encoding": "utf8"}
},        
"email" : ...
}
      
alert-timer-list Список доступных временных таймеров в минутах, при настройке оповещения для пользователя.
По умолчанию [0, 3, 10, 30, 60, 120].
trigger-list Позволяет настроить запуск внешних приложений при наступления события, напр. воспроизведение звукового сигнала.

Доступны события
  • status-change - переменная, устройство и др. изменило статус.
  • agent-status-change - соединение с агентом было установлено или разорвано.
  • object-change - переменная, устройство и др было изменено или удалено.

condition - задает js-условие, при котором будет выполнена команда.
execution - определяет выполняемое приложение.

Пример триггера, реагирующего на изменения статуса на Внимание (2) устройства с id 3 и пишущим строку с датой и именем устройства в текстовый файл trigger.txt.

"trigger-list" : [ { "event" : "status-change", "condition" : "object.getType() == 'device' && object.id == 3 && object.status == 2", "execute" : { "command" : "echo %DATE% - ${object.name} >> trigger.txt", "options" : {} } ]



Документация будет дополнена
camera-list Список камер для видео-наблюдения.
Если список пуст или у всех камер не задано приложение для трансляции, то соответствующий раздел будет скрыт в интерфейсе.

Для декодирования видео-потока перед отправкой его в браузер используется ffmpeg, который должен быть установлен отдельно.

Параметры камеры

  • id - идентификатор камеры, цифры и английские буквы без пробелов. Используется при формировании ссылок на камеру.
  • name - имя камеры, отображаемое на заголовке вкладки
  • description - описание камеры, отображаемое как подсказка при наведении на имя камеры
  • command - приложение для запуска трансляции. По умолчанию ffmpeg. Если этот параметр не задан, то камера не будет отображаться в списке камер на странице трансляций.
  • args - аргументы для приложения трансляции
  • options - дополнительные настройки
Пример для трансляции потока с rstp-камеры

При проблемах с трансляцией, необходимо уменьшить разрешение с камеры или не транслировать звук. Подробнее по см. документацию по ffmpeg

"camera-list" : [
{
  "title" : "First camera",
  "description" : "Camera description",
  "command" : "ffmpeg",
  "args" :  [ 
	"-loglevel", "quiet",
	"-rtsp_transport", "tcp",
	"-hwaccel", "auto",
	"-i", "rtsp://184.72.239.149/vod/mp4:BigBuckBunny_175k.mov",			
	"-ar", 44100, 
	"-acodec", "aac", 
	"-ac", 1, 
	"-strict", -2, 
	"-crf", 18,
	"-c:v", "copy",
	"-preset", "ultrafast",
	"-flags", "-global_header",
	"-fflags", "flush_packets", 
	"-tune", "zerolatency", 
	"-hls_time", 1,
	"-hls_list_size", 3, 
	"-hls_wrap", 4, 
	"-hls_flags", 
	"delete_segments", 
	"-start_number", 0,
	"./public/streams/index0.m3u8"
  ],
  "options" : {}
},
{ ...параметры других камер... }    
]
      

Внимание: трансляция видео-потока в браузер может быть затратной для процессора. При использовании приложения на мобильных и старых процессорах рекомендуется убедиться, что запускаемый при старте трансляции поток ffmpeg не потребляет более 10-20% процессорного времени.

Видео-наблюдение - это экспериментальный модуль, поэтому пользовательский интерфейс для него на данный момент не реализован.
anomaly-detector Сервис, выполняющий поиск аномалий в запрашиваемых данных. Если host не задан, то раздел Поиск аномалий не доступен в главном меню.
  • host - ip адрес сервиса. По умолчанию 127.0.0.1
  • port - http порт. По умолчанию 8000
device-link-type-list Список типов соединений и их цвета между устройствами. Используется при построении диаграммы подключений на площадке, а так же при просмотре/редактировании соединений устройства.
Пример списка
 
"device-link-type-list": [
    {"name" : "LAN", "color": "blue"},
    {"name": "POWER", "color": "red"}    
]
     
device-port-socket-list Список разъемов, которые могут быть заданы для устройства. Используется при добавлении портов устройства.
Пример списка
 
"device-port-socket-list": [
  {"group": "CEE7", "socket-list": ["CEE7F", "CEE7M"]},
  {"group": "Cooper", "socket-list": ["RJ11", "RJ45"]}
]
     
device-port-socket-matching Список определяет какие порты могут быть соединены между собой. Используется при подключении порта устройства к другим устройствам, чтобы отбросить заведомо неподходящие.
Пример списка
"device-port-socket-matching": [["RJ45","RJ45"],["RJ45","RJ11"],["RJ11","RJ11"]]
device-port-socket-default-direction Направление линка для порта по умолчанию. Если в шаблоне устройства направление не задано, то направление будет установлено исходя из этого списка. Если и в нем не задано, то линк будет создан без направления. Значение -1 соответствует направлению входящее для текущего устройства.
Пример
 
"device-port-socket-default-direction": {"RJ45": -1, "RJ11": 1}
device-link-color-list Список цветов, доступных при задании цвета соединения между устройствами, 9 штук.
i18n Переопределение существующих или задание новых текстовых констант.
Пример переопределения SYSTEM_NAME и задания новой константы COST
"i18n": {
  "en": {"SYSTEM_NAME": "New name", "COST": "Cost"},
  "ru": {"SYSTEM_NAME": "Новое имя", "COST": "Стоимость"}
}
models Содержит описание структуры данных.
Список таблиц фиксирован. Поля таблиц, кроме varbinds, могут быть настроены.

Параметры для настройки поля
  • name - имя поля в базе данных. Не должно содержать пробелов и знаков препинания
  • type - тип поля в терминах базы данных, напр. text NOT NULL UNIQUE. Может быть не задано, если поле вычисляемое.
  • render - задает как поле будет отображаться. Возможные варианты: text, textarea, number, date и true.
    Если указано true, то для вывода поля будет использоваться специально подготовленный html. Если не задано, то поле не будет отображаться.
  • qsearch - true или false. Определяет участвует ли поле при быстром поиске в интерфейсе.
    По умолчанию false.
  • unit - указывает размерность. Доступны weight, length и temperature
  • optional - true или false. Маркер того, что поле необязательное и может быть удалено

Дополнительную информацию можно узнать в разделе Кастомизация

Настройка опроса устройств

При редактировании устройства выбирается протокол опроса и его параметры. Специальный протокол internal позволяет сгруппировать переменные с разных устройств на одном устройстве, что может быть полезно, когда мониторится щит, который сам не имеет никаких опрашиваемых узлов, но в который заведены опрашиваемые устройства.

Редактирование переменных устройства осуществляется на отдельной странице. По умолчанию у устройства заводятся те переменные, которые были в шаблоне устройства на момент заведения устройства. Шаблонные переменные нельзя удалить, но можно не опрашивать, убрав флаг Вкл.

Поле Раздел задает в каком блоке будет отображена переменная и её значение при выводе. Если не задан, то переменная не будет выводится в карточке устройства. Также не отображаются переменные, начинающиеся на $.

Можно указать порядок отображения переменных, просто перетащив строки таблицы как требуется.

Поле Адрес/Выражение задает как следует получать значение переменной. Смена режима происходит при двойном клике по свободному месту ячейки. Если выбран Адрес, то будут отображены поля, зависящие от протокола устройства, и значение будет получено с устройства. Переменные, использующие Выражение, вычисляются на основе использующих адрес всякий раз после опроса устройства.

В выражении можно использовать:

  • $VAR для подстановки значения переменной VAR или $VAR.
  • @TAG для подстановки значения переменной/переменных, имеющих одной из меток TAG.
  • ABS, AVG, MIN, MAX, SUM, DELTA в качестве функции, применяемой к полученному набору значений.
  • @.prop или device.prop для получения значения свойства prop текущего устройства.
Примеры выражений
  • Перевод значения из градусов из шкалы Цельсия в шкалу Фаренгейта: 9 * @TEMP / 5 + 32
  • Максимальная температура по датчикам устройства: MAX(@TEMP)
  • Общее потребление тока устройства: SUM(@PHASE)
  • Максимальный разбег потребляемого тока по фазам: MAX(DELTA(@PHASE))

Особенности построения выражений
  • Поддерживаются только метки на латинице
  • Для корректного расчета выражения 9 * @TEMP / 5 + 32 требуется, чтобы была ровно одна переменная с меткой TEMP
  • Выражение должно быть корректным с точки зрения JavaScript.

Делитель переменной определяет на что надо разделить полученное значение, прежде чем его сохранить. Это может быть полезно, если температура выдается со сдвигом на один разряд, напр. 245, а не 24.5 (в этом случае следует задать делитель равным 10). Если устройство выдает температуру в фаренгейтах, а хранить ее надо в градусах цельсия, то можно использовать делитель 1C (или 1F в обратном случае).

Тип данных влияет на то, как значения переменной будет отображаться в интерфейсе, так например 0 и 1 при типе Вкл/Выкл будут отображаться как Выкл и Вкл соответственно.

Условие для вычисления статуса позволяет задать способ для расчета статуса переменной.
Игнорируемый интервал позволяет избежать переключения статуса, когда получаемое значение колеблется возле граничных условий.

Для переменной история сохраняется только если задано условие для вычисления статуса или тип Число

Если для переменной выбрана иконка, то такая переменная считается датчиком и будет отображаться на плане площадки.

Для переменной можно указать одну из служебных меток

  • TEMP - для того, чтобы переменная рассматривалась как датчик температуры и участвовала в расчете карты температур площадки

  • PHASE - для маркировки переменной как фазы устройства. Если у устройства есть хотя бы одна переменная с меткой PHASE, то устройство считается источником питания и на своей вкладке будет иметь индикатор нагрузки.

  • IP и MAC - значения переменных, помеченные этими метками, будут отображены на сводной таблице Инструменты > IP и MAC адреса.

  • Период опроса задается для устройства, таким образом все переменные опрашиваются с одинаковым интервалом.

Устройства не опрашиваются приложением непосредственно. Для этого используется агенты - небольшие Node.js приложения, которые запускаются отдельно и передают данные по TCP. По умолчанию, при старте приложения в том же потоке запускается агент, который в отличии от обычных агентов не создает локальную базу устройств и не создает копию отправляемых сообщений на диске, для предотвращения потери еще не отправленных сообщений при падении.

Если связь с агентом теряется, то будут отправлены оповещения и в интерфейсе здания, использующие этого агента, будут иметь индикатор слева, а также сообщение поверх всех страниц дочерних элементов.

Настройка ловушек

Ловушка (trap) - особый вид сообщений, когда инициатором отправки является устройство, а не приложение. Наиболее часто встречается SNMP trap.

Опросом устройств занимаются агенты, как и обработкой ловушек. Чтобы агент мог получать SNMP traps, необходимо установить бесплатный пакет Net SNMP на компьютере агента.

Конфигурация агента заключается в редактировании config.json с заданием приложения улавливателя для каждого протокола и его свойств (допускается несколько улавливателей для одного протокола)

"catcher-list" : [
  {
    "protocol": "snmp",
    "command": "snmptrapd",
    "args": ["-A", "-n", "-f", "-Lo"],
    "options": {},
    "regexp": "\\[(.*?)\\]"  
  }
]

При получении сообщения от устройства агент применит к нему регулярное выражение, заданное в regexp, для получения ip-источника, проверит список опрашиваемых устройств на совпадение с их ip и, если совпадение будет найдено, то незамедлительно опросит устройство. С точки зрения приложения информация, запрошенная по таймеру опроса, и по требованию после ловушки, не различима.

Не забудьте настроить устройство на отправку ловушек на ip агента для SNMP устройств.

Таким образом, приложение может реагировать на приходящие ловушки, но делает это своеобразно.

Добавление шаблонов устройств

Шаблоны устройств хранятся в папке /public/vendors. После добавления новых шаблонов в эту папку необходимо сначала удалить файл templates.json, содержащий кеш шаблонов, а потом перезапустить приложение.

Новые шаблоны можно создать самостоятельно или заказать. В планах реализация библиотеки шаблонов.

Рекомендации

  • Демонизируйте приложение и его агентов

    Приложение на Node.js может иногда завершаться из-за ошибки. Для непрерывной работы приложения его необходимо демонизировать, т.е. перезапускать автоматически при падении. Это возможно делать как системными средствами, так и одним из пакетов Node.js, напр. forever, pm2, supervisord и других.

    Для установки forever необходимо выполнить

    npm i forever -g
    

    Для демонизации приложения можно отредактировать в файле package.json секцию scripts:start

    nix: "NODE_PATH=.:./models:./tools:./services:./include forever start app.js -o 0"
    
  • Не опрашивайте устройства чаще, чем это необходимо, а также ограничьте список опрашиваемых переменных

  • Избегайте вычислять статус для переменных возвращающих текст в качестве результата

    История по переменной храниться только в том случае, если возвращаемые значения число или задано условие для вычисления статуса. Текстовые значения занимают много места при хранении, что может привести к быстрому росту файла истории.

  • Используйте SSD для хранения исторических данных

    При увеличении объема файла истории /db/history.sqlite возможно увеличение времени на вставку новых данных в таблицы из-за перерасчета индекса. Вы можете либо перенести данный файл на SSD, или просто очистить устаревшие данные.

    // To-Do: Пример скрипта

  • Для обслуживания статических запросов (данные из /public) используйте веб-сервер

    Node.js не очень хорошо подходит для отдачи статического контента (файлы), поэтому рекомендуется настроить дополнительный веб-сервер, например nginx.

    Пример nginx.conf для работы на 2017 порту приложения, расположенного в папке ~/workspace/little-brother и запущенного на 2000 порту.
    worker_processes  1;
    events {
      worker_connections  1024;
    }
    

    http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65;

    server { listen 2017; server_name localhost; root ~/workspace/little-brother;

    location /public/ {
      try_files $uri $uri/ =404;
    }
    
    location / {
      proxy_pass http://localhost:2000;
    }
    

    } }

  • Используйте агентов для опроса устройств

    Обращение по сети к несуществующим или отключенным устройствам создает дополнительную нагрузку на процессор, что может негативно повлиять на отзывчивость системы, а также на вставку новых данных в таблицу историй.

    Агента желательно настроить на другом оборудовании, если

    • Замечены проблемы с производительностью системы
    • Опрашиваются устройства, которые располагаются в удаленной подсети с ненадежным каналом связи к ней.
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.