Контроллеры Wiren Board используют в самых разнообразных задачах: системы вентиляции, диспетчеризации и автоматизации инженерных систем зданий: ЦОД, бассейнов, многоквартирных и частных домов, офисов, магазинов и т.п. И везде есть потребность контроля параметров системы и управления ей.

В комплекте с контроллером идёт программное обеспечение, которое позволяет закрыть большинство задач построения и эксплуатации системы автоматизации: графические и текстовые панели, архив данных с графиками, драйверы для устройств, скрипты wb-rules.

Веб-интерфейс контроллера работает во всех современных браузерах, а значит единственным условием для выбора панели будет наличие современного браузера. В качестве панели у меня будет телефон Poco X3 Pro, с разрешением экрана 2400x1080 px и диагональю 6 дюймов. 

В статье мы сделаем панель управления автоматизацией двухкомнатной квартиры, где есть кухня, коридор, санузел, спальня и зал. Чтобы было веселее, исходники рисунков можете взять на Гитхабе flat-dash-demo.

Как это работает

В центре ПО контроллера Wiren Board находится MQTT-брокер, куда публикуют данные драйвера, веб-интерфейс и сторонний софт, если он есть. Адрес, куда публикуется то или иное сообщение, называется топиком.

Для удобства работы с топиками у них есть виртуальное представление, которое представляет каждый топик в виде устройство/контрол. Это виртуальное представление, оно используется в скриптах автоматизации на wb-rules и для отрисовки топиков в веб-интерфейсе контроллера.

MQTT-каналы в веб-интерфейсе контроллера
MQTT-каналы в веб-интерфейсе контроллера
Представление устройств
Представление устройств

Редактор SVG-панелей позволяет привязать элементы векторного рисунка к каналам. Привязок может быть одновременно несколько:

  • Чтение — позволяет читать из канала текстовые или числовые данные, например, температуру.

  • Запись — позволяет задать два значения, которые надо записать в канал при нажатии на элемент. Обычно это 1 и 0, но можно задать свои.

  • Видимость — можно выбрать канал и задать условие, при котором элемент будет показан или скрыт.

  • Стиль оформления — здесь можно прописать зависимость стиля элемента от значения в выбранном канале. Например, менять цвет элемента, его заливку, прозрачность и т.п.

Кроме того, доступны переходы между панелями по клику, долгому клику и смахиванию влево или вправо.

Привязка делается мышкой в веб-интерфейсе контроллера Wiren Board, для этого вам надо загрузить векторный рисунок в контроллер, а потом по очереди выбирать элементы мышкой и расставлять привязки.

Пример привязки
Пример привязки

Проектируем

Сперва нам надо создать рисунок, я буду использовать свободный векторный редактор Inkscape — он доступен для всех основных операционных систем: Windows, Linux, MacOS.

Экран в телефоне довольно маленький, поэтому популярная компоновка в виде плана квартиры с элементами управления системами нам не подойдёт — места мало и элементы получатся маленькими. 

Классическая компоновка панели для квартиры
Классическая компоновка панели для квартиры

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

Также будет две сценарных кнопки: «Выключить везде свет» и «Все ушли». Третья кнопка «Отопление» открывает страницу, где можно задать уставку для котла. 

Не забудем и про съём показаний со счетчиков — для них выделим отдельную карточку.

Пример компоновки карточками
Пример компоновки карточками
Страница ввода уставки температуры
Страница ввода уставки температуры

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

Аналогичным образом можно сделать панель для системы вентиляции, котельной, офиса или целого торгового центра. 

Пример многостраничной панели для шкафа контроля энергоснабжения — при нажатии на фазу открывается страница с подробными показаниями
Пример многостраничной панели для шкафа контроля энергоснабжения — при нажатии на фазу открывается страница с подробными показаниями

Готовим рисунок

Открываем редактор Inkscape и устанавливаем размеры страницы, у меня это будет 2400 x 1080 пикселей, у вас могут быть другие. Выбираем единицы измерения px — так удобнее работать.

Настройка размеров страницы
Настройка размеров страницы

Нанесём на рисунок элементы управления: лампочки и информационные штуки, вроде датчиков температуры, влажности и CO2. Иконки я обычно использую из набора Material Design, взять их сразу в SVG можно на сайте pictogrammers.com.

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

Изменение размера иконки
Изменение размера иконки
Остальные скриншоты процесса
Карточка с комнатой готова
Карточка с комнатой готова
Дублировать карточки удобно клавишами Ctrl+D
Дублировать карточки удобно клавишами Ctrl+D
Дублируем вторую карточку и получаем третью комнату
Дублируем вторую карточку и получаем третью комнату
Результат
Результат

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

Окно редактора, выбор цвета для элемента
Окно редактора, выбор цвета для элемента

Элементы будущей панели
Элементы будущей панели
Вторая страница с настройками уставки
Вторая страница с настройками уставки

Делаем из рисунка интерактивную панель

В качестве данных для дашборда я буду использовать программный эмулятор на wb-rules, вы можете поступить также для тестов или расставить привязки к реальным устройствам, если они у вас есть.

Настройка эмулятора данных

Если вы хотите использовать эмулятор:

  1. Перейдите по ссылке wb-flat-emulator и скопируйте содержимое js-файла.

  2. Перейдите в веб-интерфейс контроллера на вкладку «Правила».

  3. Создайте новое правило и вставьте скопированное содержимое файла в редактор.

  4. Нажмите кнопку «Сохранить».

  5. Проверьте, что на вкладке «Устройства» создалось виртуальное устройство с именем «Моя квартира».

Скрипт-эмулятор, который я использую
Скрипт-эмулятор, который я использую
Виртуальное устройство на вкладке Устройства
Виртуальное устройство на вкладке Устройства

Загрузим оба рисунка в контроллер и привяжем элементы картинки к реальным устройствам, для этого у вас должен быть уровень доступа «Администратор». Подробнее о процессе читайте в документации.

Создание панелей:

  1. Откройте веб-интерфейс контроллера, потом откройте список панелей.

  2. Добавьте в список новую SVG-панель, загрузите в неё наш рисунок и задайте имя.

  3. Выберите мышкой элементы на рисунке и укажите привязки к каналам: действие, вывод информации или смена стиля.

  4. Нажмите кнопку «Сохранить» и перейдите в режим демонстрации.

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

У нас остались незадействованные кнопки — для них не нашлось нужных контролов устройств «Отопление», «Выключить весь свет» и сценарий «Все ушли». Ими мы займемся дальше.

Список SVG-панелей, кнопка «Добавить» добавляет новую панель
Список SVG-панелей, кнопка «Добавить» добавляет новую панель
Ещё скриншоты процесса
Для загрузки рисунка в контроллер, нажмите кнопку «Загрузить SVG»
Для загрузки рисунка в контроллер, нажмите кнопку «Загрузить SVG»
Выберите канал с данными
Выберите канал с данными
Канал выбран, а в поле «Значение» мы указали, что надо округлять до десятых и добавить в конце единицу измерения
Канал выбран, а в поле «Значение» мы указали, что надо округлять до десятых и добавить в конце единицу измерения
Настройка управления лампой и установка цветов для двух состояний: включено и выключено
Настройка управления лампой и установка цветов для двух состояний: включено и выключено
Демонстрация панели
Демонстрация панели

Переходы между страницами

Страницы — это обычные SVG-панели, поэтому вы просто рисуете и загружаете в контроллер несколько рисунков, а потом настраиваете переходы между ними.

Загрузите рисунок с настройкой уставки в контроллер и понятно назовите новую SVG-панель — это имя вам нужно потом выбрать в списке переходов, например, «Уставка котла».

На панели у нас есть кнопка «Назад», которая является группой из прямоугольника и текста. До этого мы выбирали мышкой одиночные элементы простым кликом мышки, при этом было совершенно неважно, состоят они в группах или нет.

Чтобы выбрать группу, зажмите на клавиатуре клавишу Alt и кликните на один из элементов группы — элементы, которые входят в группу, начнут мигать, а в подсказке «Тип элемента» будет указано «группа».

Теперь выберите для группы одно из действий: «Клик (нажатие)» и режим «Переход». После этого в выпадающем списке выберите панель, которая откроется при заданном действии, например «Главная панель». Аналогично делается переход по действиям «Долгий клик (удержание)» или «Смахивание».

Теперь назначьте переход по кнопке «Отопление» с первой страницы на вторую.

Аналогичным образом можно назначать на кнопки и другие действия, например включить/выключить свет. Для этого вместо режима «Переход» надо выбрать «Запись в канал».

Настройка перехода с панели «Уставка котла» на «Главную панель»
Настройка перехода с панели «Уставка котла» на «Главную панель»
Настройка перехода с панели «Главной панели» на «Уставку котла»
Настройка перехода с панели «Главной панели» на «Уставку котла»

Дополнительные возможности с помощью скриптов

Функции панели можно расширять за счёт скриптов на JavaScript-подобном движке правил wb-rules (документация на Github).

Реализуем:

  1. Реакцию на кнопки «Выключить всё» и «Все ушли» — сценарные кнопки.

  2. Изменение температуры уставки котла кнопками «Плюс» и «Минус» — стандартный интерфейс термостата.

Скрипт

Создадим новый скрипт panel-logic.js и опишем в нём виртуальное устройство с четырьмя кнопками «Выключить всё», «Все ушли», «Прибавить температуру», «Убавить температуру» и числовым значением для уставки.

defineVirtualDevice('panel-logic', {
    title: 'SVG-панель' ,
    cells: {
      GoOut: {
        title: "Все ушли",
	    type: "switch",
	    value: false,
        order: 1
	    },
      OffAll: {
        title: "Выключить всё",
	    type: "pushbutton",
	    value: false,
        order: 2
	    },
      SettingTemp: {
        title: "Уставка температуры",
	    type: "value",
	    value: 25,
        units: "°C",
        readonly: false,
        order: 3
	    },
      TempUp: {
        title: "Прибавить температуру",
	    type: "pushbutton",
        order: 4
	    },
      TempDown: {
        title: "Убавить температуру",
	    type: "pushbutton",
        order: 5
	    },
    }
})
Скрипт виртуального устройства, виртуальное представление и внешний вид устройства в веб-интерфейсе
Скрипт виртуального устройства, виртуальное представление и внешний вид устройства в веб-интерфейсе

Сперва настроим работу сценарных кнопок: 

  • При нажатии на кнопку «Выключить всё» будут выключаться все светильники.

  • При нажатии на кнопку «Все ушли» выключим все светильники и запишем в уставку 22 °С.

В процессе нам понадобятся пути к контролам — их проще всего взять на странице «Настройки» → «Каналы MQTT». Также можно кликнуть на контрол в карточке устройства — путь к контролу с его названием будет скопирован в буфер обмена.

Кнопка «Выключить всё». Создаём правило, где подписываемся на контрол, изменение которого нам важно и делаем так, чтобы при нажатии на кнопку всё освещение в квартире выключалось. Изменения состояний контролов освещения я вынес в отдельную функцию — это позволит переиспользовать её в сценарии «Все ушли».

// Кнопка «Выключить всё»
defineRule({
  whenChanged: ["panel-logic/OffAll"],
  then: function (newValue, devName, cellName) {
    if (newValue){
      turnAllOff(); // вызов функции «Выключить всё»
    }
  }
});

// Функция «Выключить всё»
function turnAllOff() {
    // my-flat — это имя виртуального устройства эмулятора
    dev["my-flat/hall_light"] = false;
    dev["my-flat/kitchen_light"] = false;
    dev["my-flat/bathroom_light"] = false;
    dev["my-flat/breadroom_light"] = false;
    dev["my-flat/questroom_light"] = false;
}

Добавим реакцию на переключатель «Все ушли»: копируем блок с whenChanged, меняем название топика, за которым будем следить, и внутри блока then описываем новые действия.

// Кнопка «Все ушли»
defineRule({  
  whenChanged: ["panel-logic/GoOut"],
  then: function (newValue, devName, cellName) {
    if (newValue){
      turnAllOff(); // вызов функции «Выключить всё»
      dev["panel-logic/SettingTemp"]= 22; // устанавливаем температуру
    }
  }
});

// Кнопка «Выключить всё»
defineRule({
  whenChanged: ["panel-logic/OffAll"],
  then: function (newValue, devName, cellName) {
    if (newValue){
      turnAllOff(); // вызов функции «Выключить всё»
    }
  }
});

// Функция «Выключить всё»
function turnAllOff() {
    // my-flat — это имя виртуального устройства эмулятора
    dev["my-flat/hall_light"] = false;
    dev["my-flat/kitchen_light"] = false;
    dev["my-flat/bathroom_light"] = false;
    dev["my-flat/breadroom_light"] = false;
    dev["my-flat/questroom_light"] = false;
}

Осталось реализовать логику изменения уставки котла: при нажатии на кнопку «Прибавить температуру» добавлять один градус, а при нажатии на кнопку «Убавить температуру» — вычитать. Чтобы было удобно менять шаг в будущем, я вынес его в переменную stepTemp.

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

var stepTemp = 1
// Кнопка «Прибавить температуру»
defineRule({
  whenChanged: ["panel-logic/TempUp"],
  then: function (newValue, devName, cellName) {
    // получаем текущее значение и прибавляем stepTemp
    dev["panel-logic/SettingTemp"] = dev["panel-logic/SettingTemp"] + stepTemp   
  }
});

// Кнопка «Убавить температуру»
defineRule({
  whenChanged: ["panel-logic/TempDown"],
  then: function (newValue, devName, cellName) {
    // получаем текущее значение и вычитаем stepTemp
    dev["panel-logic/SettingTemp"] = dev["panel-logic/SettingTemp"] - stepTemp
  }
});

Скрипт целиком вы найдёте на Гитхабе panel-logic.js.

Ниже приведён пример правила, которое записывает заданное значение уставки в контрол модуля управления котлом. Синтаксис уже вам знаком — пишете правило, которое реагирует на изменение уставки в панели, и отправляете значение реальному устройству.

defineRule({
  whenChanged: ["panel-logic/SettingTemp"],
  then: function (newValue, devName, cellName) {
    // получаем текущее значение SettingTemp и отправляем его в котёл
    // вместо module-opentherm/SetTemp подставьте путь к контролу реального устройства
    dev["module-opentherm/SetTemp"] = dev["panel-logic/SettingTemp"]   
  }
});

Привязки

После того, как мы описали дополнительную логику, привяжем контролы вновь созданного виртуального устройства к элементам SVG-панелей.

Все эти действия вы делали раньше, я не буду повторяться, но пару скриншотов покажу.

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

Оформление иконки кнопки
Оформление иконки кнопки
Привязка кнопки «Прибавить температуру» — обратите внимание, мы выбрали группу с клавишей Alt
Привязка кнопки «Прибавить температуру» — обратите внимание, мы выбрали группу с клавишей Alt

Полноэкранный режим

По умолчанию веб-интерфейс контроллера работает в окне браузера, у которого адресная строка с заголовком съедает довольно много места, особенно на мобильных устройствах. 

Поэтому мы добавили несколько режимов: 

  • полноэкранный кнопкой — скрывает строку браузера, верхнюю панель, и в левой навигационной панели остаётся только список графических и текстовых панелей, а также пункт «История».

  • полноэкранный параметром в адресной строке — такой же, как предыдущий, но не скрывает строку браузера, и в нём нет кнопки выхода в нормальный. Включается добавлением параметра ?fullscreen=true в адрес панели. Обычно этот режим используют на АРМ оператора, где браузер запущен в режиме киоска.

  • HMI — это особый режим, который выводит панели на весь экран и убирает все другие элементы интерфейса: левую навигационную панель, верхнюю панель. Включается добавлением в адрес панели параметра ?hmi=true. Режим часто используют для создания HMI-панелей из планшетов, а чтобы скрыть интерфейс браузера, используют приложение Fully Kiosk Browser.

К сожалению, API браузеров не позволяют скрывать интерфейс браузера по команде из адресной строки — пользователь должен явно нажать кнопку, или запустить браузер в режиме киоска.

Полноэкранный режим, включаемый кнопкой
Полноэкранный режим, включаемый кнопкой
Другие режимы
Полноэкранный, включаемый параметром
Полноэкранный, включаемый параметром
HMI-режим для планшетов
HMI-режим для планшетов

Заключение

В статье мы создали многостраничную интерактивную SVG-панель в стандартном ПО контроллера Wiren Board  с дополнительной логикой на wb-rules. Такие панели могут использоваться для любых систем на этом контроллере: умный дом, вентиляционная установка, котельная, теплица и т.д.

Видео с работой панели в реальном устройстве смотрите ниже, а исходники из статьи — в нашем репозитории на Github по ссылке flat-dash-demo.

Пишите вопросы и предложения в комментариях.

Комментарии (7)


  1. siplix
    10.10.2023 12:28
    +1

    Очень жду от вас реализацию многопользовательского web-интерфейса.
    SVG дашборды прекрасно закрывают потребность в простых интерфейсах, но иногда необходимо дать доступ к интерфейсу для обслуживающего персонала (мониторинг показаний датчиков и т.д.), а давать полноценный доступ к параметрам не хочется.
    Может быть хотя бы сделаете возможность запускать отдельный web-интерфейс с пользовательскими правами доступа на отдельном порту? Вопросы безопасности в таком случае полостью ложатся на нас - интеграторов.


  1. RSATom
    10.10.2023 12:28
    +1

    Подскажите как решили (если решали) проблему вспухания аккумулятора планшета при постоянном его подключении к питанию? Я пару лет назад ставил дешевый китайский планшет для использования в системе видеоглазка на входной двери, и аккумулятор у меня вспух через полгода. После второго вспухшего аккумулятора я плюнул и сделал внешний зарядник для внешнего же 18650 аккумулятора (для возможности быстрой смены при необходимости) - что в итоге благополучно работает уже чуть более чем полгода, но сами понимаете, эстетически, это все выглядит сильно так себе...


    1. RSATom
      10.10.2023 12:28
      +1

      а, да, я пробовал запускать планшет вообще без аккумулятора, но токи потребления на старте оказались выше мощности используемого зарядного устройства (5V 2A, но пробовал и мощнее, из доступных) и планшет попадал в бесконечный цикл перезапуска...


      1. RSATom
        10.10.2023 12:28
        +1

        Пробовал даже йонисторы для компенсации скачка потребления на старте - но не сработало...


        1. av0000
          10.10.2023 12:28
          +1

          Если есть РУТ, можно поставить программный ограничитель заряда - год "несвежий" Mi-5 работает и не пухнет. Ну или народ городит внешнюю схему отключения: берётся "киоск", умеющий отдавать наружу процент заряда батареи (в моём случае был HabPanel, вроде, и WallPanel) - по MQTT получаем заряд и через внешнее реле включаем/отключаем зарядку в диапазоне 30-70 примерно.


    1. wofs Автор
      10.10.2023 12:28

      Подскажите как решили (если решали) проблему вспухания аккумулятора планшета при постоянном его подключении к питанию?

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

      У себя в квартире буду использовать панель без АКБ — тот же планшет, только с внешним питанием. Стоит дороже планшета с Авито, зато ничего не вспухает. Расскажу о ней в одной из будущих статей.


      1. RSATom
        10.10.2023 12:28

        Я пытался найти такой планшет, но цена получалась как минимум 3x от моего планшета. Кроме того найти продавца тоже оказалось непросто...

        Но существует ненулевой шанс что я просто напросто использовал неверные ключевые слова при поиске...