Система предназначена для удалённого управления и сбора информации с устройств, а также создания автоматизации. ПО DasClient которое обеспечивает автоматизацию не зависит от сервера, но может быть настроенно на подключение к серверу для удалённого управления объектом и централизованного анализа информации.
- Схема (Scheme) - описание всей структуры для взаимодействия с элементами на объекте через API. Схема содержит в себе описание секций и устройств, а также используемых типов, и хранит в себе скрипты автоматизации. Это глобальная единица в системе, т.е. одна схема полностью описывает объект автоматизации (Здание, Цех, Электронный продукт и т.д.)
- Устройство (Device) - описывает физическое устройство которое передаёт/получает данные. Например: Группа реле управляемая черз GPIO. "Устройства (Device)" не обязательно описывают физическое устройство, это может быть виртуальная сущность.
- Элемент устройства (Device_Item) - описывает еденицу входящих/выходящих данных, например датчик температуры или реле.
- Плагин (Plugin_Type) - устройству может быть назначен плагин, который будет читать значения из физического устройства и передавать их в Элемент устройства (Device_Item) и в обратном направлении.
- Секция (Section) - описывает физические отделения на объекте автоматизации (Например: Тамбур, Секция с помидорами, Секция с огурцами)
- Группа элементов (Device_Item_Group, DIG) - описывает логическое разделение элементов устройств на гуппы (Например: Освещение, Отопление, Полив)
- Уставки (DIG_Param) - у каждой группы могут быть задаваемые пользователем параметры
- Состояния (DIG_Status) - описывает состояния группы элементов о которых нужно информировать пользователя
- Режим (DIG_Mode) - Для каждой группы можно выбрать режим (Например: Ручной, Автоматический)
- Устройство (Device) - описывает физическое устройство которое передаёт/получает данные. Например: Группа реле управляемая черз GPIO. "Устройства (Device)" не обязательно описывают физическое устройство, это может быть виртуальная сущность.
- Журналы
- Журнал значений (Log_Value) - хранит изменения значений элементов устройста.
- Журнал событий (Log_Event) - хранит текстовые сообщения генерируемые в системе во время работы.
- Журнал уставок (Log_Param) - хранит изменения значений уставок.
- Журнал состояний (Log_Status) - хранит изменения состояний групп.
- Журнал режимов (Log_Mode) - хранит изменения режимов групп.
- DasClient - Основное ПО обесспечивающее автоматизацию
- Язык: С++. Библиотеки: STL, Boost, Qt (Network, DBus, SQL, Script), Botan
- Используемые внутренние библиотеки: Das, DasPlus, DasDBus, Helpz (Service, DB, DTLS)
- Описание:
- База данных (Структура проекта, журнал событий, запись изменения значений)
- DTLS Клиент (для подключения к серверу)
- JS движок для отработки автоматизации
- Плагины для доступа к физическим устройствам (Modbus, OneWireTherm, WiringPi, DS18B20, HTU21, Uart, FileIO, Camera, Random)
- DasServer - Серверная часть для централизованного управления
- Язык: С++. Библиотеки: STL, Boost, Qt (Network, DBus, SQL), Botan
- Используемые внутренние библиотеки: Das, DasPlus, DasDBus, Helpz (Service, DB, DTLS)
- Описание:
- DTLS Сервер (Шифрованный UDP для общения с программой Клиент)
- База данных
- DasWebApi
- Язык: С++. Библиотеки: STL, Boost, Qt (Network, DBus, SQL, Script), Served
- Используемые внутренние библиотеки: Das, DasPlus, DasDBus, Helpz (Service, DB, Network)
- Описание:
- WebSocket сервер (Для мгновенного отображения изменений и управления)
- RestfulApi сервер
- Stream сервер
- DasTelegramBot - Телеграм бот для уведомлений о событиях, и простого управления
- Язык: С++. Библиотеки: STL, Boost, Qt (Network, DBus, SQL), TgBot
- Используемые внутренние библиотеки: Das, DasPlus, DasDBus, Helpz (Service, DB)
- DasModern - GUI Клиент \ Мобильное приложение
- Язык: С++, Qt/QML. Библиотеки: STL, Qt (QML, QuickControls2, WebSockets)
- DasEmulator - Эмулятор Modbus (Имитации работы физического устройства для тестирования и отладки)
- Язык: С++. Библиотеки: STL, Qt (Network, DBus, SQL, Gui, SerialBus)
- Используемые внутренние библиотеки: Das, DasPlus, Helpz (DB)
- libDas - Основная библиотека содержащая инструменты для работы с основными частями системы
- libDasPlus - Библиотека содержит инструменты для работы со структурой базы данных и другими частями системы
- libDasDBus - Содержит описание основного DBus интерфейса для межпроцессорного взаимодействия между частями системы
- libHelpz - Вспомогательные базовые библиотеки для функционирования системы
- Base - Логирование, Распаковка настроек, Шаблоны для потоков и десериализации в функцию
- DBMeta - Инстументы для описания базовых классов используемых в libHelpzDB
- DB - Работа с базой данных (Зависит от: DBMeta)
- Network - Работа с протоколом высокого уровня (Зависит от: Base)
- DTLS - Сетевое взаимодействие с использованием протокола высокого уровня поверх DTLS (Зависит от Network)
- Service - Использование служб
- DasBack - Backend (Серверная часть сайта)
- Язык: Python. Библиотеки: Django, PyJWT, DRF, OpenPyXL
- DasFront - Frontend (Браузерная часть сайта)
- Язык: TypeScript. Библиотеки: Angular, RxJS
На компьютер объекта автоматизации устанавливается программа DasClient. Если планируется использовать локальное подключение и управлять объектом напрямую без сервера, то так же устанавливаются программы DasWebApi, DasBack и DasFront. Если объект управляется через сервер то на сервере создаётся новая схема или её псевдоним (alias) с уникальным именем для подключения объекта, а также специальная учётная запись с которой объект будет подключаться к серверу. Перед первым запуском для DasClient создаётся база данных, структуру таблиц можно развернуть с помощью программы DasBack. После чего в конфигурационный файл /opt/das/DasClient.conf заносяться настройки для подключения к базе данных, а также данный для авторизации на сервере (логин, пароль и имя схемы).
После запуска службы dasclient программа загружает схему из базы данных. Схема передаётся в скриптовый движок для предоставления API на основе схемы. Затем движок выполняет скрипты для автоматизации объекта. Параллельно с этим запускается опрос устройств схемы и подключение к серверу. Устройства опрашиваются с установленным пользователем интервалом или в некоторых случаях по алгоритму заложенному в сам плагин опроса. После очередного опроса новые значения передаются в схему. Изменённые значения передаются на сервер и сохраняются там в журнал если настроен соответствующий алгоритм сохранения, если передать на сервер не удалось, то значения по такому же алгоритму сохраняются в локальный журнал. Так же значения передаются в скриптовой движок для взаимодействия с ними скриптами автоматизации. Скрипты получая новые значения анализируют их и на основе уставок установленных пользователем могут отправить команду на изменение значения какого либо физического устройства, а так же изменить состояние и тем самым уведомить пользователя. Все изменения в схеме, в том числе сделанные скриптами, отправляются на сервер и там храняться в соответствующих журналах.
Сервер при подключении к нему запрашивает хэши схемы, отдельно для всех таблиц содержащих общие данные, а также для каждой таблицы с уникальными для объекта данными. Если хэш различается, то в случае с общими данными запрашиваются хэши для каждой таблицы общих данных, а затем если и те различаются, то значения конкретной таблицы. Если различающиеся данные относятся к общим, то сервер передаёт на DasClient актуальные данные, а если уникальные для объекта, то приводит данные в базе к виду как на клиенте. Если синхронизация не удалась, то сервер выставляет состояние подключения "Ошибка синхронизации структур" и повторяет её. Также сервер запрашивает данные журналов для передачи их на сервер если что то накопилось в отсутствии подключения. Также сервер запрашивает текущее время на клиенте, а также версии ПО.
Соединение с сервером не разрывается. По нему передаются новые данные от клиента, а также управляющие команды от сервера на клиент. В отсутствии активности с заданным интервалом передаётся PING для проверки соединения.
Используя DBus сервер передаёт все данные приходящие от клиента в приложения DasWebApi и DasTelegramBot.
Пользователь зайдя на сайт использует веб приложение DasFront. При загрузки оно используя Restful api получает у приложения DasBack и DasWebApi структуру выбранного пользователем проекта, после чего используя WebSocket устанавливает постоянное соедиенение с приложением DasWebApi для мгновенного получения изменений схемы, а также передачи управляющих команд.
Таким образом новые данные, например с датчика температуры, читаются плагином DS18B20 загруженнымм в ПО DasClient шифруются и передаются по DTLS (TLS over UDP) на сервер, затем по DBus передаются в ПО DasWebApi которое по WebSocket отправляет их в приложение DasFront и отображаются пользователю.
git clone --recursive -j8 [email protected]:WorkerBeesTeam/das.git
или
git clone [email protected]:WorkerBeesTeam/das.git
cd das
git submodule update --init --recursive
pip3 install mysqlclient sqlparse
python3 manage.py dumpdata auth.User auth.Group das.Das --indent=2 > das/fixtures/initial_data.json
python3 manage.py dumpdata gh_item.Device_Item_Type gh_item.LayoutType gh_item.SignType --indent=2 > gh_item/fixtures/initial_data.json
python3 manage.py loaddata das/fixtures/initial_data.json
CREATE USER 'DasUser'@'localhost' IDENTIFIED BY '???????';
GRANT ALL PRIVILEGES ON das_django.* TO 'DasUser'@'localhost';
GRANT ALL PRIVILEGES ON das_django_%.* TO 'DasUser'@'localhost';
GRANT CREATE ON . TO 'DasUser'@'localhost';
FLUSH PRIVILEGES;
./botan keygen > dtls.key
./botan gen_self_signed dtls.key deviceaccess.ru > dtls.pem
find /var/log -type f -delete
apt-get autoremove && apt-get autoclean && apt-get cleancat /dev/zero > /root/zeros; sync; rm /root/zeros
#zerofree -v /dev/sdd2#dd if=/dev/da0 conv=sync,noerror bs=128K | gzip -c | ssh [email protected] dd of=centos-core-7.gz
mount -t cifs -o user=kirill //192.168.202.70/share tmp/
dd if=/dev/mmcblk0 conv=sync,noerror bs=128K | gzip -c | dd of=tmp/raspberry.img.gzgzip -d -c tmp/raspberry.img.gz | dd of=/dev/sdd
wget https://ftp.gnu.org/gnu/gdb/gdb-7.12.tar.gz tar -pxzf gdb-7.12.tar.gz cd gdb-7.12 export PATH=/mnt/second_drive/projects/das/raspberry/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin:$PATH ./configure --with-python=yes --target=arm-linux-gnueabihf make sudo make install
На сервере:
socat tcp-l:54321,reuseaddr,fork file:/dev/ttyUSB0,nonblock,waitlock=/var/run/ttyUSB0.lock
На клиенте:
socat pty,link=$HOME/vmodem0,waitslave tcp:gh1:54321
export LD_LIBRARY_PATH=/usr/local/lib export TSLIB_CONSOLEDEVICE=none export TSLIB_FBDEVICE=/dev/fb0 export TSLIB_TSDEVICE=/dev/input/event0 export TSLIB_CALIBFILE=/usr/local/etc/pointercal export TSLIB_CONFFILE=/usr/local/etc/ts.conf export TSLIB_PLUGINDIR=/usr/local/lib/ts
ts_calibrate
Включить экран если погас:
echo -ne "\033[9;0]" >/dev/tty1
На сервере:
gdbserver :1234 /opt/Das/DasGlobal -e
На клиенте:
./arm-linux-gnueabihf-gdb --args /mnt/second_drive/build/das/Raspberry_Root/DasModern -e set sysroot /mnt/second_drive/projects/das/raspberry/work/sysroot/ set solib-search-path /mnt/second_drive/projects/das/raspberry/work/qt5pi/ target remote gh3:1234 continue
This README would normally document whatever steps are necessary to get your application up and running.
- Quick summary
- Version
- Learn Markdown
- Summary of set up
- Configuration
- Dependencies
- Database configuration
- How to run tests
- Deployment instructions
- Writing tests
- Code review
- Other guidelines
- Repo owner or admin
- Other community or team contact