- PVSM.RU - https://www.pvsm.ru -

Всем привет, на Хабре уже есть несколько статей про автоматизацию игр типа «квесты в реальности» (раз [1], два [2], три [3], четыре [4], пять [5]...), я хотел бы тоже поделиться своим опытом участия в подобном проекте. В далеком 2015 году мои друзья решили организовать квест типа escape-room «Ограбление банка» в нашем [6] городе. Они знали, что я давно увлекаюсь различной автоматикой, в том числе системами типа «умный дом» на базе open source решений, поэтому попросили помощи в организации игры. Мне эта идея показалось интересной и я согласился — хотелось применить свой опыт и решения для чего то более интересного, чем поморгать лампочкой у себя в квартире.
Я постарался принять участие в полном цикле реализации проекта — от внесения правок в сценарий до последующей обкатки задач, выявления и исправления багов, последующие доработки. Я посетил несколько игр у нас в городе (в 2015 их можно было пересчитать по пальцам одной руки), не для фана, а скорее для получения опыта и реверс-инжиниринга решений, и это было хорошо заметно по реакции организаторов. Но после участия в игре в Москве, я понял настоящий масштаб «бедствия» и мне сильно захотелось сделать не хуже с технической стороны свою работу. Итак, квест «Ограбить банк» в г. Твери, за подробностями как он создавался и развивался в течении нескольких лет прошу под кат.
После того, как мои коллеги объяснили мне на пальцах, что от меня хотят и как всё должно работать, у меня в голове буквально за пару минут сформировалась архитектура: центральный сервер с платформой ioBroker [7], локальные контроллеры на базе плат и модулей Arduino, обмен данными с сервером и между контроллерами по протоколу MQTT. В итоге архитектура получилась примерно следующая:

Помимо взаимодействия контроллера задачи с центральным сервером, нужно было наладить взаимодействие между контроллерами разных квестовых задач. Для этого, по моему мнению, идеально подходил протокол MQTT с брокером на центральном сервере. Клиенты — контроллеры публикуют на сервер свои состояния, подписываются на команды от сервера и состояния других контроллеров. Для реализации этого решения был использован адаптер MQTT [8] — он одновременно был и MQTT брокером и позволял создать иерархию топиков в дереве объектов ioBroker, чтобы использовать данные для визуализации и управления (скриншот ниже еще старой версии “админки”).

Впоследствии я не пожалел, что выбрал именно такое решение:
По потокам данных получается всего несколько вариантов, самый простой из них — в контроллере задачи №1 возникает событие (нажали кнопку), он публикует в определенный топик состояние кнопки и ее состояние отображается изменением цвета графического элемента на визуальной форме АРМ оператора.

Не менее простой и обратный вариант — нужно вручную включить реле через контроллер задачи №1, подается управляющее событие через VIS-адаптер, который меняет состояние топика этого контроллера, причем с ask=false. Адаптер MQTT получает изменение топика с ask=false, значит этот топик не от контроллера прилетел, соответственно происходит публикация изменения в контроллер, который в свою очередь публикует в ответ подтверждение с ask=true.

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

В проект еще нужно было добавить задачу взаимодействия с компьютером. Интерфейс был написал на php, страничка крутилась на WEB-сервере с автозапуском в полноэкранном режиме браузера. Интеграция с основной системой осуществлялась посредством драйвера simple-api [9] — через php просто дергались определенные http-запросы к ioBroker. Сам системный блок был спрятан в недрах офисного стола, управление интерфейсом осуществлялось мышкой, а беспроводная клавиатура была у диспетчера квеста.
Визуализация для оператора была разработана в драйвере VIS [10] для одного разрешения — монитора оператора, но впоследствии сотрудники квеста смогли пользоваться и мобильными планшетами с этим же интерфейсом, оказалось удобно для сброса при подготовке к новой игре и для диагностики системы. Интерфейс получился спартанский, без модных дашбордов и рюшек-переключателей, но зато понятный, простой и быстрый. Особенной логики, слоев, графиков и прочего в интерфейсе не нужно было, только иконки для отображения состояния оборудования, кнопки для управления и несколько текстовых полей для вывода режима работы контроллеров и лога работы системы.

На момент разработки проекта других вариантов оформления визуализации особенно и не было. Позже появились адаптеры визуализации как для мобильных устройств (я использую material [11]), так и для стационарных планшетов/компьютеров: habpanel [12], lovelace [13], tileboard [14] и другие.
Основная логика была заложена в коде контроллеров, но общее взаимодействие, инициализация параметров для запуска, сервисные функции и пр. — реализовано на основном сервере с помощью адаптера javascript [15]. Код писался на JS с использованием встроенных функций [16] ioBroker с последующим «переездом» на blockly [17] (этот функционал появился позднее начала работ по проекту).

Всего было задействовано несколько скриптов:
Все контроллеры на базе плат Arduino UNO (впоследствии несколько контроллеров пришлось переделать под платы Arduino MEGA — не хватало памяти) оснащались платой расширения Ethernet на базе чипа W5100. Обмен данными между контроллерами и сервером (как писал выше) по протоколу MQTT. Разработка алгоритмов в Arduino IDE велась с использованием стандартных библиотек. По железной части ничего сверхъестественного — максимальное использование готовых модулей и плат расширения с минимумом пайки и без изготовления кастомных плат — всё на макетных платах. Управление нагрузками через модули с реле обычными и твердотельными, транзисторные ключи для светодиодов индикации и маломощной нагрузки. По механической части старался как можно меньше применять подвижные элементы: микровыключатели, толкатели, Э/М замки и больше использовать готовые модули светодиод-фотодиод (открытые оптопары), твердотельные реле, обычные магнитные замки, считыватели бесконтактных карт и герконовые датчики. Несколько фото ниже:




Питание контроллеров на месте осуществлялось через самодельные POE-переходники — по витой паре незадействованные жилы «вещали» 12В постоянного тока. Преобразование на платах контроллеров через готовые платы DC-DC до 5В — от которых питались сами платы Arduino + Ethernet и маломощная нагрузка с логикой 5В: слаботочные светодиоды, реле и пр. Более мощная нагрузка 12В: магнитные замки, мощные реле или контакторы, различная светотехника — использовались отдельные кабельные линии проводом ШВВП или ПВС. В основной шкаф автоматики подвели два ввода 220В переменного тока и через АВР на контакторах подключили ИБП, который в свою очередь был подключен через байпас, для удобства обслуживания. Для питания всей автоматики и слаботочки, в шкафу установили мощные блоки питания 2 по 12В и один на 5В. От шкафа автоматики пустили кабельные линии 220В для питания компьютеров и различной периферии квеста: от пых-пых до виу-виу))


Остальные решения довольно стандартные для подобных проектов. Система видеонаблюдения на проводных IP-камерах, обязательно с ИК-подсветкой и встроенными микрофонами. Видеопоток используется в одной из задач квеста и дополнительно обрабатывается на ПК диспетчера квеста, используется open source программное обеспечение (ZoneMinder). Локальную сеть контроллеров Arduino отделили от остальных сетей, чтобы поток от видеокамер не нагружал и без того слабые чипы W5100 ethernet-плат.
Громкая связь с участниками игры с использованием обычного советского усилителя и встроенных потолочных динамиков.
В конце хотел описать немного центральный сервер. Платформа ioBroker развернута на ARM-одноплатнике BananaPi, мощности которого оказалось достаточно для всех задач. Окружение — операционная система Armbian, пару bash скриптов для работы с GPIO и для создания резервных копий в облако на Яндекс.Диск. Используются несколько GPIO для индикации состояния работы отдельных модулей и адаптеров (светодиоды) и кнопка для корректного выключения системы. На фото 19” шкафа выше видно, что плата в стандартном дешевом корпусе из оргстекла, впоследствии она была установлена в 1U корпус с нормальным блоком питания и прочей периферией.
Основную архитектуру мы с коллегами довольно хорошо продумали заранее (я делал проект) и многие узлы удалось собрать и протестировать «на столе», поэтому кардинальных изменений не было. Мелкие «шероховатости» исправлялись на месте. Основные проблемы, решение которых заняло довольно много времени:
Весь проект от изучения и согласования сценария до запуска первых тестовых групп занял около полугода — да много, но это был первый опыт и к тому же, я почти не отставал от основных работ по стройке/ремонту помещений. Плюс к тому, было много работы «в стол» — в основном при использовании отдельных модулей Arduino, потому как они работали не совсем так, как я предполагал. При реализации проекта максимально старались придерживаться следующих принципов:
По итогу, в первые пару недель получилось избавиться от всех мелких недостатков и сейчас система почти в первоначальном окружении работает уже больше 4-х лет.
Автор: Андрей Андреев
Источник [18]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/umny-j-dom/321297
Ссылки в тексте:
[1] раз: https://habr.com/ru/post/385799/
[2] два: https://habr.com/ru/post/381949/
[3] три: https://habr.com/ru/company/technoworks/blog/258585/
[4] четыре: https://habr.com/ru/post/396483/
[5] пять: https://habr.com/ru/post/375307/
[6] нашем: https://ru.wikipedia.org/wiki/%D0%A2%D0%B2%D0%B5%D1%80%D1%8C
[7] ioBroker: https://github.com/ioBroker
[8] MQTT: https://github.com/ioBroker/ioBroker.mqtt
[9] simple-api: https://github.com/ioBroker/ioBroker.simple-api
[10] VIS: https://github.com/ioBroker/ioBroker.vis
[11] material: https://github.com/ioBroker/ioBroker.material
[12] habpanel: https://github.com/iobroker-community-adapters/ioBroker.habpanel
[13] lovelace: https://github.com/ioBroker/ioBroker.lovelace
[14] tileboard: https://github.com/ioBroker/ioBroker.tileboard
[15] javascript: https://github.com/ioBroker/ioBroker.javascript
[16] функций: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#content
[17] blockly: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/blockly.md
[18] Источник: https://habr.com/ru/post/456230/?utm_source=habrahabr&utm_medium=rss&utm_campaign=456230
Нажмите здесь для печати.