1 - Подключение оборудования

В данном разделе документации мы расскажем об общей концепции работы с оборудованием в системе MajorDoMo.

Модель работы представлена на данной диаграмме:

scale 4/5
!theme plain
participant "Физическое\nустройство" as device
box "MajorDoMo" #LightBlue
participant "Модуль работы\nс определённым\nоборудованием" as module
participant "Виртуальный\nобъект" as object #LightGreen
participant "Внутренняя логика" as logic
participant "Интерфейс\nпользователя" as ui
end box
actor "Пользователь" as user

device<->module: Взаимодействие с устройством \n(протокол взаимодействия)
module<->object: Изменение свойства
module->object: Активация метода
object<->logic: Изменение свойства
object<->logic: Активация метода
object<->ui: Изменение свойства
object<->ui: Обновление интерфейса
object<->ui: Активация метода
ui<->user: Взаимодействие\nс пользователем

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

Модуль взаимодействия с оборудованием – программный код, являющийся частью платформы MajorDoMo, который “знает” протокол взаимодействия с оборудованием и умеет осуществлять двунаправленный обмен данными и управляющими командами между физическими устройствами и связанными с ними сущностями виртуальных объектов системы. Подобные модули обычно не являются частью ядра системы и устанавливаются дополнительно через маркет дополнений.

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

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

Интерфейс пользователя – один из предоставляемых системой способов взаимодействия (веб-интерфейс, мобильное приложение, голосовой помощник и т.п.)

2 - Объектная модель

Теория

Объектная модель – одна из основных концепций, лежащих в основе платформы MajorDoMo. Понимание этой концепции позволит максимально полно раскрыть потенциал системы, хоть и не является обязательным для базовой настройки и использования платформы (см. раздел Простые устройства).

Объектная модель разделяет некоторые принципы ООП (объектно ориентированного программирования), но не является в буквальном смысле полным его воплощением.

Итак, основной связующей сущностью в системе MajorDoMo является виртуальный объект, который для упрощения можно представить как некий цифровой двойник устройства/предмета/явления в реальном мире.

Для примера возьмём датчик температуры в спальне. Каждый объект обладает свойствами, т.е. какими-то характеристиками, присущими объекту. В нашем примере это может быть текущее значение и время измерения. Кроме того, объекты могут включать в себя определённые действия, которые могут быть ими (или над ними) проведены – эти действия называются методы. Для нашего примера методом может быть действие измерить значение.

@startuml
Class "Объект: Датчик температуры в спальне" {
+ Свойство "Текущее значение" и его значение
+ Свойство "Время измерения" и его значение
..
+ Метод "Измерить значение" и его реализация
}
@enduml

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

@startuml
Class "Класс: Датчики температуры" as tempSensors #LightGreen {
+ Описание свойства "Текущее значение"
+ Описание свойства "Время измерения"
..
+ Реализация метода: Измерить значение
}

Class "Объект: Датчик температуры в спальне" as sensorBedroom {
+ Значение свойства "Текущее значение"
+ Значение свойства "Время измерения"
..
+ Ссылка на метод: Измерить значение
}
Class "Объект: Датчик температуры на кухне" as sensorKitchen {
+ Значение свойства "Текущее значение"
+ Значение свойства "Время измерения"
..
+ Ссылка на метод: Измерить значение
}

tempSensors <|-- sensorBedroom
tempSensors <|-- sensorKitchen

@enduml

Классы объектов, в свою очередь, могут иметь собственную иерархию, что позволяет объединять их в классы более высокого уровня. Для примера добавим в наше дерево класс Датчики влажности и объединим их вместе с датчиками температуры в общий “родительский” класс Датчики:

@startuml
scale 4/5

Class "Класс: Датчики" as sensors #LightGreen {
+ Описание свойства "Текущее значение"
+ Описание свойства "Время измерения"
..
+ Реализация метода: Измерить значение
}

Class "Класс: Датчики влажности" as humSensors #LightGreen {
+ Ссылка на свойство "Текущее значение"
+ Ссылка на свойство "Время измерения"
..
+ Реализация метода: Измерить значение
}


Class "Класс: Датчики температуры" as tempSensors #LightGreen {
+ Ссылка на свойство "Текущее значение"
+ Ссылка на свойство "Время измерения"
..
+ Реализация метода: Измерить значение
}

Class "Объект: Датчик температуры в спальне" as sensorBedroom {
+ Значение свойства "Текущее значение"
+ Значение свойства "Время измерения"
..
+ Ссылка на метод: Измерить значение
}
Class "Объект: Датчик температуры на кухне" as sensorKitchen {
+ Значение свойства "Текущее значение"
+ Значение свойства "Время измерения"
..
+ Ссылка на метод: Измерить значение
}

Class "Объект: Датчик влажности на кухне" as sensorHumKitchen {
+ Значение свойства "Текущее значение"
+ Значение свойства "Время измерения"
..
+ Ссылка на метод: Измерить значение
}

sensors <|-- tempSensors
sensors <|-- humSensors

humSensors <|-- sensorHumKitchen

tempSensors <|-- sensorBedroom
tempSensors <|-- sensorKitchen

@enduml

Диаграмма выше отображает следующие особенности модели:

  • Общие свойства и методы описаны на максимально высоком уровне общности (класса)
  • Классы более низкого уровня “наследуют” свойства и методы классов уровней выше
  • Реализация метода класса высокого уровня может оперировать свойствами объектов на любом уровне ниже
  • Реализация методов классов может быть различной на разных уровнях

На нашем примере, мы можем вызывать метод “Датчик температуры в спальне.Измерить значение” и будет исполнен код, описанный в реализации метода класса Датчики температуры, который, в свою очередь, может задействовать код метода на уровне класса Датчики.

Практика

Ниже представлены примеры основных экранов Панели управления MajorDoMo, связанных с настройкой классов и объектов.

Дерево классов/объектов

Дерево классов/объектов

В разделе Панель управления → Объекты → Объекты представлено общее дерево Классов и Объектов, добавленных в систему. Ссылки в правой части списка позволяют перейти к редактированию описания класса, к свойствам класса, к методам класса, к объектам данного и дочерних классов, а также “Расширить” класс путём добавления дочернего класса, наследующего свойства и методы родительского.

Описание класса

Настройка класса позволяет указать родительский класс для данного, название класса, а так же описание. Последнее поле является информационным и его можно использовать для краткого описание назначения класса. Кроме того, присутствует функциона экспорта настроек класса с объектами и без – этот функционал можно использовать, чтобы переносить класс между системами.

Свойства класса и их параметры

Настройки свойства класса включают:

  • Название – системное имя свойства. По нему происходит обращение для установки и считывания значения свойства.
  • Описание – информационное поле
  • Запускать метод при изменении – метод класса, который будет автоматически запущен при установке значения данного свойства
  • Хранить историю (дней) – период максимального хранения истории значений для данного свойства (в днях). При значении 0 (по-умолчанию) история значений свойства не хранится.
  • Тип данных – тип данных, хранимых в свойстве (Общий формат подходит для хранения как текстовых, так и числовых значений)
  • Ключевые данные – признак, определяющий, что значение свойства будет выводится в списках объектов в интерфейсе раздела Объекты (не влияет на функционал работы со свойством).

Методы класса

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

Объекты класса

В объектах есть возможность указать их местоположение (локацию/комнату) – это информационный признак, не влияющий на функционал работы с объектом.

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

Также объекты могут исполнять методы классов, которые, в свою очередь, можно “переписать” для конкретного объекта, при этом остаётся возможность исполнить “родительский” метод класса до либо после выполнения собственной реализации метода.

3 - Простые устройства (ПУ)

О концепции

Концепция “Простые устройства” (ПУ) возникла в процессе работы над упрощением настройки системы для конечного пользователя. Помимо этого, Объектная модель, хоть и является максимально гибкой в настройке, не включает в себя единый стандарт для настройки типового оборудования Умного Дома, что, в свою очередь, необходимо для дальнейшей интеграции устройств со сторонними интерфейсами взаимодействия, например такими как ассистент Алиса от Яндекса или Siri от Apple.

Таким образом, можно представить назначение модуля Простые устройства следующим списком:

  • Упрощённый механизм добавление в систему типового оборудования
  • Настройка основных параметров типового оборудования
  • Установка связей между различным оборудованием через правила взаимодействия
  • Интерфейс пользователя для управления оборудованием
  • Интеграция добавленных устройств в сторонние сервисы управления (голосовые помощники)

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

Поддерживаемые типы устройств

Тип устройств
Реле / управляемый выключатель
Робот-пылесос
Медиа-проигрыватель
Телевизор
Термостат
Кондиционер
Диммер (источник света с регулируемой яркостью)
RGB (источник света с регулируемым цветом)
IP-камера
Датчик движения
Датчик открытия
Датчик протечки
Датчик дыма
“Открываемое” (привод ворот/окон/дверей)
Счётчик (воды, электричества и т.п.)
Клавиша (активатор)
Общий сенсор
Сенсор температуры воздуха
Сенсор влажности воздуха
Сенсор влажности почвы
Сенсор уровня CO2
Сенсор уровня радиации
Общий сенсор процентного состояния
Сенсор давления
Сенсор уровня мощности
Сенсор напряжения
Сенсор уровня тока
Сенсор уровня освещённости

Связи между устройствами

Тип связиИсточникВозможности
Действие по событию: переключениеДатчик движения, Кнопка, Датчик открытия, IP-камераВключение/выключение связанного устройства по событию
Действие по событию: включить на времяДатчик движения, Кнопка, Датчик открытия, IP-камераВключение связанного устройства на заданное время по событию
Действие по событию: установить цветДатчик движения, Кнопка, Датчик открытия, IP-камераУстановка цвета связанного устройства по событию
Управление по термостатуТермостатВключение/выключение связанного устройства в зависимости от состояния термостата
Действие по значению сенсораРазличные сенсорыВключение/выключение связанного устройства в зависимости от значения сенсора (выше/ниже порога значений)
Передача данных сенсораРазличные сенсорыУстановка значения температуры связанного устройства (термостат/кондиционер) по внешнему сенсору

Пример настройки

Список устройств

Общая информация

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

Связанные устройства

Добавление связи:

Детали связи:

Расписание

Действия

Интерфейс

Предустановленный интерфейс управления устройствами доступен по адресу:

http://IP_адрес_сервера/apps/devices.html

Вариант размещения устройств на сцене:

4 - Интерфейс

4.1 - Стартовый экран

По-умолчанию стартовый экран для пользователя представляет собой веб-страницу, состояющую из нескольких секций:

Поведение (тип стартового экрана) можно изменить зайдя в Панель управления → Настройки → Общие настройки → Homepage Layout

Типы стартовых экранов:

Пользователь получит выбранный стартовый экран при открытии веб-интерфейса системы (при переходе на http://IP-адрес-сервера/)

4.2 - Сцены

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

http://IP_адрес_сервера/popup/scenes.html

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

http://IP_адрес_сервера/popup/scenes/{ID}.html

(вместо {ID} указывается цифровой идентификатор сцены)

Общие настройки

Детали сцены включают:

  • Название – наименование сцены
  • Приоритет – приоритет сцены в общем списке (чем больше значение, тем раньше показывается сцена)
  • Флаг Не включать в список переключающихся сцен – при использовании, сцена будет исключена из общего списка переключаемых сцен и может быть показана только по прямой ссылке.
  • Режим Автоматически изменять размер сцены – при включении масштаб сцены будет автоматически изменён под экран устройства
    • По ширине и высоте – с учётом ширины и высоты (чтобы сцена отображалась целиком)
    • По ширине – только с учётом ширины (возможен вертикальный скроллинг)
    • По высоте – только с учётом высоты (возможен горизонтальный скроллинг)
  • Фоновое изображение – ???
  • Обои – ???
    • fixed – ???
    • no repeat – ???
  • Фон для устройств (Тема) – светлая/тёмная тема для отображения устройств
  • Контроль доступа – доступ к сцене (см. раздел Контроль доступа)

Так же для сцены доступны функции:

  • Создать копию (клонировать) – создание новой сцены с копией всех элементов текущей;
  • Экспорт – экспорт сцены и элементов в файл;
  • Просмотр – открытие данной сцены в режиме просмотра отдельно от остальных сцен;

Элементы

Сцена состоит из элементов разных типов. Каждый тип элементов имеет определённые характеристики и некоторые особенности использования.

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

Основные характеристики элементов (доступность некоторых характеристик зависит от типа элемента):

  • Название
  • Приоритет
  • Сцена
  • Тип
  • Связанный объект / метод / свойство
  • Использовать элемент
  • Стиль
  • Анимация появления
  • Позиционирование
    • Абсолютное
    • Друг за другом
  • Позиционировать относительно
  • Отступ слева
  • Отступ сверху
  • Расположить в контейнере
  • Авто-повтор
  • Контроль доступа – подробнее в разделе Контроль доступа
  • Состояния (см. ниже)

Состояния элемента

  • Название
  • Код
  • Выполнить при клике
    • Ничего не делать
    • Выполнить сценарий
    • Запускать объект.метод
    • Код
    • Показать меню при клике
    • Показать домашнюю страницу при клике
    • Показать другую сцену
    • Открыть ссылку при клике
  • Условие отображение
    • n/a (всегда показывать)
    • Простое
    • Расширенное
    • Переключить на сцену при активации
  • Приоритет

Ниже приведены основные типы элементов сцен.

Устройство

Добавление на сцену Простого Устройства (ПУ). Добавление данного типа элемента аналогично использованию вкладки Устройства (см. ниже описание), но позволяет дополнительно настроить позиционирование и эффект появления на сцене.

Выключатель

Элемент с иконкой, названием и отображением состояния объекта в зависимости от значения связанного свойства. Также данный элемент вызывает методы turnOn/turnOff по нажатии на него.

Информер

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

Уведомление

Отображение сообщения на сцене при наступлении заданных условий.

Изображение

Элемент вывода изображения.

HTML

Один из самых гибких элементов – позволяет использовать произвольный HTML-код для состояний. Дополнительно можно подключить использование CSS и JavaScript-кодов, которые будут общими для всех состояний элемента.

Контейнер

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

Редактирование элемента:

Слайдер

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

Настройка Анимация появления отвечает за тип анимации слайдера (Справа-на-лево, Снизу-вверх, Моргание).

Блок Дополнительный код Javascript позволяет задать опции слайдера (полный список опций

Индикатор режима

Элемент для отображения состояния объекта, например одного из режимов работы системы. После добавления и указания связанного объекта будет автоматически создано два состояния (on/off), привязаны зависимости отображения к свойству active и указаны методы выполнения при нажатии на состояние (activate/deactivate).

Через изменение стиля можно задать иконку, отвечающую за указанный режим.

Редактирование элемента:

Клавиша

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

Редактирование элемента:

Нав. ссылка (новое окно/переход)

Два схожих элемента, служат для навигации.

При использовании элемента типа Навигационная ссылка (новое окно) по клику на сцене открывается дополнительное окно, внутри которого открывается заданная ссылка.

Если использовать элемент типа Навигационная ссылка (переход), то по клику будет осуществлён переход по ссылке.

Редактирование элемента:

Элемент вставки меню управления на сцену.

Редактирование элемента:

Объект

Элемент служит для вставки Объекта. Для показа объекта используется его Шаблон отображения.

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

Редактирование элемента:

Устройства

Закладка Устройства позволяет оперативно добавить на сцену элементы управлений Простых Устройств. При добавлении устройства можно выбрать тип шаблона отображения (полный/мини). Непосредственное расположение элементов на сцене необходимо изменить открыв сцену в режиме редактирования (см. ниже).

Виджеты

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

Пример интерфейса настройки виджета Текстовый блок:

Работа со сценой в режиме редактирования

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

4.3 - Меню управления

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

По-умолчанию меню располагается в левой секции стартового экрана, но может быть открыто напрямую по ссылке:

http://IP_адрес_сервера/menu.html

Также отдельный элемент (или ветка) доступен по прямой ссылке вида:

http://IP_адрес_сервера/menu.html?parent={ID}

{ID} – идентификатор элемента

Пример внешнего вида меню:

Настройка меню осуществляется в разделе Панель управления → Объекты → Меню управления.

Структурно меню является деревом элементов различных типов. Детали каждого типа элементов представлены ниже.

Основные параметры элемента меню

Доступность отдельных параметров зависит от типа используемого элемента.

  • ID – ???
  • Родительский пункт меню – ???
  • Название – ???
  • Приоритет – ???
  • Тип – ???
  • Иконка – ???
  • Период автообновления– определяет частоту, с которой интерфейс будет обращаться к серверу для обновления собственного состояния. Актуально в случае недоступности протокола веб-сокетов, иначе обновление элемента происходит в реальном времени, независимо от установленного значения.
  • Использовать элемент – позволяет повторно использовать уже созданный ранее элемент со всеми его настройками на месте данного
  • Только чтение – при включении данной опции, элемент отражает значение привязанного свойства, но не изменяет его. При этом связанный метод и сценарий будут вызваны (если они заданы).
  • Авто-повтор – позволяет автоматически дублировать элемент меню, используя все доступные объекты класса, к которому принадлежит Связанный объект данного пункта меню.
  • Связанный объект – ???
  • Свойство – ???
  • Метод – ???
  • Сценарий – ???
  • Код – ???
  • Задержка при ротации – определяет период времени, в течении которого будет виден данный элмент перед тем, как будет заменён другим, у которого так же установлено значение данного поля. Ротируемые элементы должны находиться на одном уровне и идти друг за другом. Ротация элементов позволяет автоматически менять выводимые данные, не расширяя размер физической области, занимаемой элементами.
  • Загружать дочерние элементы в раскрывающуюся область – ???
  • Контроль доступа – ???

Типы элементов меню

Подпись

Объект

Ссылка (+новое окно)

Новое окно

Javascript-команда

Клавиша

Выключатель

Поле выбора (select)

Поле выбора (radio)

Слайдер

Плюс-минус

Выбор времени

Дата

Текстовое поле

Выбор цвета

HTML-блок

4.4 - Домашние страницы

Раздел Домашние страницы позволяет создать навигационное меню между различными страницами управления системой.

Данный интерфейс доступен по ссылке

http://IP_адрес_сервера/pages.html

Пример навигатора домашних страниц:

Панель управления домашними страницами:

Редактирование настроек отдельной страницы:

Основные свойства страницы:

  • Название - ???
  • Приоритет - ???
  • опция Скрыть - ???
  • Период автообновления, секунд - ???
  • Иконка - ???
  • Тип - ???
    • HTML Code - ???
    • Application - ???
    • URL - ???
    • Dashboard - ???
  • Ссылка - ???
  • Контроль доступа - ???
  • Ссылка (preview) - ???

4.5 - Дашборды

Предназначение дашборда – ещё один способ быстро и просто создавать интерфейсы для работы с системой. Дашборд создаётся через раздел Домашние страницы и наполняется путём добавления панелей (вертикальные столбцы, можно задавать ширину) и виджетов (содержимое панелей). При этом дашборд ведёт себя адаптивно, т.е. при нехватки ширины панели будут перестраиваться, так что один и тот же дашборд можно вполне использовать на различных устройствах – от телевизора до мобильного телефона.

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

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

Предустановленные виджеты:

  • Часы (цифровые часы с днём недели и датой)
  • Изображение (ссылка на внешнюю картинку)
  • HTML (просто HTML-блок любого содержания)
  • Scripts (кнопка запуска выбранного сценария)
  • Menu (элемент из меню или группа элементов)
  • Application (одно из установленных приложений)
  • IFrame (ссылка на любую страницу – так можно, например, сцену вставить в виде виджета)
  • Chart (график, созданный в модуле Charts)
  • Device (устройство из модуля Простые устройства)

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

Ссылка на обсуждение дашбордов на форуме

4.6 - Планы

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

Основые возможности модуля:

  • Работа с исходным изображением в формате SVG
  • Установка стилей отображения отдельных элементов изображения по заданным условиям (показать/скрыть, прозначность, анимация и т.п.)
  • Установка реакции на нажатия на отдельные элементы изображения (запуск метода, кода, открытие меню, окна и т.п.)
  • Динамичные шаблоны текстовых элементов (авто-подстановка значений по данным из системы)
  • Использование готовых интерактивных компонентов
  • Обновление состояния всех элементов в реальном времени (технология websockets)
  • Интерфейс “зумирования” Плана (отключаемо)
  • Автоматическое изменение масштаба Плана под размер экрана (отключаемо)
  • Отдельная ссылка для просмотра Плана
  • Встраивание Плана в другие типы интерфейсов (сцены, меню и т.п.)
  • Неограниченное количество Планов

Работа с Планом строится вокруг файла в формате SVG, который вы можете создать в любом векторном редакторе. Мы рекомендуем открытый и бесплатный редактор InkScape (все примеры ниже приведены с использованием данного ПО). Дополнительно могут использоваться изображения, найденные в сети или любые другие редакторы для создания отдельных элементов (3D Max, SweetHome3D и т.д.)

Разберём процесс создания интерфейса на примере данного изображения:

Текстовые элементы

Для установки динамических текстовых элементов достаточно в самом тексте использовать конструкцию авто-подстановки вида “%Объект.Свойство%”. При выводе данного элемента будет произведена авто-замена на данные из системы. Кроме того, при изменении данных в системе, текст на изображении так же будет меняться автоматически. Вы можете использовать данную конструкцию не только отдельно, но и как часть предложения, например: “Сейчас %ThisComputer.TimeNow%” будет автоматически заменено на “Сейчас 10:35”. В графическом редакторе вы можете производить любые манипуляции над самим элементов – устанавливать шрифты, эффекты и т.п.

Графические элементы

SVG-изображение может состоять из множества графических элементов (объектов). Элементы можно рисовать самостоятельно, используя инструменты редактора, импортировать из каких-то библиотек в виде готовых векторных или растровых изображений. Кроме того, элементы можно объединять в группы, располагать на различных слоях и многое другое. Важной особенностью в нашем контексте является то, что в самом изображении все элементы хранятся как отдельные объекты с уникальным идентификатором (ID). Соответственно, чтобы мы могли в дальнейшем работать с отдельными элементами и легко их находить, необходимо выставить им понятные идентификаторы:

Редактор сам добавляет идентификаторы на все элементы, но созданные автоматически ID не несут смысловой нагрузки и будет неудобно в дальнейшем их искать для работы с ними в модуле MajorDoMo.

Таким образом, создаваемое изображение должно содержать все возможные элементы интерфейса. Также обратите внимание, что для изображения необходимо задать его размер: Файл > Свойства документа:

По окончанию работы с изображением его необходимо сохранить в формате SVG.

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

Для создания Плана необходимо перейти в Панель управления MajorDoMo, раздел Объекты > Планы.

Основные данные плана:

  • Название – название проекта
  • Изображение – созданный в графическом редакторе SVG-файл
  • Управление масштабом – признак необходимости элемента управления масштабом (кнопки увеличения/уменьшения)
  • Авто-масштабирование – признак необходимости автоматического масштабирования под размер устройства (используется при выводе Плана по отдельной ссылке).

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

После сохранения формы появляются дополнительные закладки для дополнительной настройки:

  • Общее – общие настройки Плана
  • Состояния – настройки динамического состояния элементов Плана
  • Компоненты – вставка на план элементов из библиотеки компонентов
  • Дополнительный код CSS – дополнительные стили отображения (не обязательно)
  • Дополнительный код Javasсript – дополнительные сценарии для динамики (не обязательно)
  • Просмотр – просмотр результата настройки и варианты использования Плана в системе (ссылка на План, код встраивания)

Работа с состояниями Плана

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

  • Название – произвольное название состояния
  • Элемент изображения – ID элемента изображения (см. выше про установку ID в графическом редакторе)
  • Связанный объект.Свойство – источник данных для проверки условий применения состояния
  • Условие – тип условия
  • Значение – сравнительное значение для условия
  • Применить стиль – стиль отображения, который будет применён к элементу в случае успешного выполнения условия (не обязательно)
  • Применить стиль (“иначе”) – стиль отображения, который будет применён к элементу в случае невыполнения условия (не обязательно)
  • Выполнить при клике – реакция на нажатие на элемент (не обязательно). В качестве реакции может быть: выполнение сценария, запуск метода объекта, выполнение PHP-кода, отображение элемента Меню, отображение Домашней страницы, открытие произвольной ссылки.

Приведённый выше пример устанавливает следующее поведение: графический элемент Motion1 (иконка человека) будет моргать при обнаружении движения (свойство Motion17.status=1) и скроется по окончанию движения.

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

Работа с компонентами

Основная суть компонентов – выборочная замена элементов изображения на настраиваемые объекты из библиотеки компонентов. Каждый компонент представляет собой графический объект с возможностью корректировки его отображения и работы с помощью настроек, производимых пользователем. Для вставки компонента на План, необходимо предварительно на изображение добавить графический элемент (например, обычный прямоугольник), а в настройках компонента выбрать название этого элемента, чтобы при формировании плана он был заменён соответствующим компонентом. Компонент в большинстве случаев использует базовые характеристики исходного элемента при размещении на Плане (координаты, размеры).

Пример использования компонента

Создадим на нашем плане два прямоугольника tempBox и tempBox2

Загрузим новое изображение в наш План, перейдём в закладку компоненты и добавим новый компонент, задав название и выбрав в качестве типа компонента Gauge, а в качестве заменяемого элемента tempBox:

После добавления нам становятся доступны дополнительные настройки компонента (в данном случае это стрелочный индикатор):

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

После сохранения мы можем продублировать настройки (кнопка Создать копию) и по аналогии настроить новый компонент, задав новые настройки и привязав его уже к элементу tempBox2:

В итоге при просмотре нашего Плана, на месте созданных в графическом редакторе прямоугольников мы увидим наши настроенные компоненты:

При этом компоненты работают динамически, отклоняя стрелку при изменении температуры в реальном времени.

Кроме того, пользователь может настроить действие по нажатию на экземпляр компонента таким же образом, как это делалось при настройке состояний:

Библиотека компонентов пополняется разработчиками (здесь будет ссылка на документацию).

Дополнительный код CSS

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

Например, можно добавить следующий код для того, чтобы элемент с идентификатором #roof1 был всегда с зелёной заливкой:

#roof1 {
    fill:green !important;
}

Дополнительный код Javascript

Данный раздел позволяет добавить свой javascript-код для каких-то динамических событий.

Например, данный код показывает/прячет элемент в зависимости от степени увеличения изображения:

 var zoomLevel=panZoom.getZoom();
 if (zoomLevel>2) {
  $('#roof1').hide();
 } else {
  $('#roof1').show();
 }
 setTimeout('checkZoomLevel()',1000);
}
setTimeout('checkZoomLevel()',1000);

Просмотр и использование Плана

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

Ссылка на ветку обсуждения планов на форуме

4.7 - Приложения

Отдельные модули системы могут быть представлены пользователю в виде приложений.

Список установленных приложений доступен по ссылке:

http://IP_адрес_сервера/apps.html

Техническая информация о том, как создавать модули/приложения представлена в разделе Структура модулей

5 - Общие настройки

Расположение раздела: Панель управления → Настройки → Общие настройки

Раздел состоит из нескольких секций, ниже представлена основная информация по разделам.

Общие

Computer’s name – собственное имя, от лица которого система общается с пользователем. По-умолчанию, используется имя Алиса (примечание: не связано с Алисой от Яндекса – проект MajorDoMo с таким именем главного персонажа появился задолго до того, как Яндекс выпустил своего голосового помощника с таким же именем).

Homepage layout – интерфейс пользователя по-умолчанию (см. подробнее в разделе Стартовый экран)

Language – язык интерфейса (при изменении система автоматически перезапустится)

Time zone – часовой пояс (при изменении система автоматически перезапустится)

Play sound signal before speaking – признак необходимости проигрывания звука анонса сообщения (динг-донг) – актуально, если непосредственно к серверу подключен аудио-интерфейс и установлен модуль синтеза речи

Color theme – основная цветовая схема интерфейса пользователя (тёмная/светлая)

Система

Database save period (history data), minutes – период сохранения базы данных истории значений свойств на диск (актуально при хранения базы данных в памяти)

Database save period (main data), minutes – период сохранения базы данных состояния системы на диск (актуально при хранения базы данных в памяти)

Path to DebMes logs – путь к папке хранения логов системы (по-умолчанию ./cms/debmes)

Disable logging (DebMes) – возможность полностью отключить запись логов платформы

Поведение

NobodyHome mode activation timeout (minutes) – период неактивности, после которого система перейдёт в режим “Никого нет дома” (подробнее в разделе Режимы работы)

Обработчики

В данном разделе есть возможность задать дополнительный код, который будет исполняться при некоторых системных действия (“до” либо “после” действия).

Так же здесь представлены обработчики, “подписанные” на системные события (подробнее в разделе Системные события)

Резервное копирование

Path to store backup – путь к папке хранения автоматических резервных копий (создаются ежедневно, по-умолчанию ./backup/)

CodeEditor

Настройки встроенного редактора кода.

6 - Сценарии

Расположение раздела: Панель управления → Объекты → Сценарии

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

Обязательными свойствами любого сценария являются Название и Код.

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

Варианты программирования сценария

Для программирования сценариев существует несколько способов, которые устанавливаются путём выбора опции “Использовать для программирования”. Обратите внимание, что описанные ниже варианты программирования, могут применяться не только в сценариях, но и в других частях системы, позволяющих задавать код (например, методы объектов).

Код

“Классический” способ программирования – написание программы с использованием языка программирования. Основным языком программирования, используемом в проекте, является язык PHP (на нём же написана большая часть кода проекта). Т.е. можно использовать встроенный редактор кода для написания полноценной программы, задействовав все имеющиеся в PHP функции и операторы, а так же используя дополнительный набор функций, который предоставляется проектом MajorDoMo (см. раздел Встроенные PHP функции).

Пример PHP-кода сценария:

$weather = "Сегодня ожидается ".str_replace('&deg;',' ',getGlobal('weatherToday'));
$weather .= ". Завтра ".str_replace('&deg;',' ',getGlobal('weatherTomorrow'));
$weather .= ". Сейчас на улице ".getGlobal('TempOutside').'.';
$weather = str_replace('&deg;','',$weather);
say($weather,2);

Кроме языка программирования PHP, код также может быть написан с использованием языка программирования Python, поддержка которого также реализована в системе (см. раздел Поддержка Python)

Blockly

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

Пример программы на Blockly:

Важно отметить, что программа на Blockly в итоге представляет собой всё тот же PHP-код и переключение в опцию программирования Код сохранит программу на Blockly, но покажет её именно в виде кода.

Пример представление программы выше в виде кода:

function length($value) {
  if (is_string($value)) {
    return strlen($value);
  } else {
    return count($value);
  }
}

if (length('123') > 2) {
  say('Привет', 2);
  callMethod("Dimmer11.turnOn");
}

Устройства

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

Пример:

Способы вызова сценария

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

Запуск кодом

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

runScript('MyScript'); // простой запуск
runScript('MyScript',array('param1'=>123, 'param2'=>'Test')); // запуск с передачей параметров

Переданные параметры доступны внутри кода MyScript как массив $params, т.е. их можно использовать в таком виде:

if ($params['param1']===123) { // проверка условия 
 say("Значение параметра ".$params['param2']); // часть кода
}

Запуск по времени

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

Пример расписания:

Запуск при изменении свойства

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

В данном примере сценарий начинается с проверки текущего времени:

Система автоматически связала сценарий со свойством ClockChime.time и, в случае если выбран автоматически запуск, сценарий будет исполнен каждый раз, когда изменяется указанное свойство:

Запуск как “метода”

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

Запуск по ссылке

Любой сценарий можно так же исполнить прямым открытием ссылки вида:

http://IP_адрес_сервера/objects/?script=devicesTest

Также имеется возможность передавать параметры аналогично параметрам через вызов кода:

http://IP_адрес_сервера/objects/?script=devicesTest&param1=123&param2=Test

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

7 - Таймеры/расписание

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

Расписание работы Простых Устройств (ПУ)

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

Запуск сценариев по расписанию

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

Запуск сценариев с привязкой ко свойству времени

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

Использование объектов класса Timer

В разделе Объекты имеется специальный класс Timer, для каждого из объектов которого автоматически исполняются методы onNewMinute (каждую минуту) и onNewHour (каждый час).

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

Например, при вставке приведённого ниже кода, в 8 утра по будням будет сказана фраза “Доброе утро!” и запущен сценарий myScript:

if (isWeekDay() && timeIs('08:00')) {
 say('Доброе утро!');
 runScript('myScript');
}

Кроме добавления кода в методы уже имеющегося объекта ClockChime, можно создавать собственные дополнительные объекты класса Timer – методы onNewMinute/onNewHour этих объектов будут также выполняться автоматически.

Установка таймеров в коде

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

setTimeout('имя_таймера', 'действия', задержка_сек);
// пример (создать timer1, который запустит сценарий myScript через 5 минут):
setTimeout('timer1', 'runScript("myScript");', 5*60);

При повторном создании таймера с именем уже созданного ранее, исполнение первого созданного таймера будет отменено. Кроме того, отменить действие таймера можно с помощью функции:

clearTimeout('имя_таймера');
// пример (отмена таймера timer1):
clearTimeout('timer1');

Ограничение доступа к элементам по времени

Время так же может использовать как элемент ограничения для доступа к различным частям интерфейса системы. Подробнее в разделе Контроль доступа.

8 - Режимы работы

Система “из коробки” предлагает пользователю несколько операционных режимов работы, с помощью которых можно организовать некоторые типовые задачи автоматизации. Использование этих режимов не является обязательным, но их применение может сэкономить время на настройку некоторых базовых сценариев использования Умного Дома. Также справедливо и обратное – пользователь (интегратор) может дополнить имеющиеся режимы своими собственными по аналогии с теми, что уже встроены в систему.

Режимы работы представляют собой объекты класса OperationalModes. Объекты обладают следующими свойствами:

  • active – статус активности режима
  • title – название режима
  • updated – время изменения статуса режима (в виде unix-timestamp)
  • updatedTime – время изменения статуса режима (в текстовом виде)

Также для объектов доступны следующие методы:

  • activate – метод активации режима
  • deactivate – метод де-активации режима
  • modeChanged – метод запускаемый при изменении статуса активности режима

Ниже представлен список “встроенных” режимов и краткий сценарий их использования.

NobodyHomeMode (никого нет дома)

Режим активируется в случае долгого отсутствия активности в доме. Конкретный период “неактивности” задаётся в минутах в разделе Поведение (Общих настройках). Если в качестве значение указан 0, то данный режим не будет активироваться автоматически.

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

По-умолчанию, активация/де-активация данного режима приводит к соответствующему изменению состояния следующего режима (экономия), однако, в случае необходимости эту связь можно отключить.

EconomMode (экономия)

При активации данного режима будут выключены те устройства, в настройках которых выбрана опция “Выключать в режиме экономии”; при де-активации включены устройства с опцией “Включать при выходе из режима экономии” (см. изображение ниже).

Настройки устройства, определяющих его поведение в зависимости от текущего режима:

DarknessMode (тёмное время суток)

Данный режим определяет состояние системы на предмет функционирование в светлое либо тёмное время суток. Режим автоматически активируется при наступлении времени заката (свойство ThisComputer.SunSetTime) и де-активируется при наступлении времени восхода (свойство ThisComputer.SunRiseTime).

При активации данного режима будут включены те устройства, в настройках которых выбрана опция “Включать с закатом”; при де-активации выключены устройства с опцией “Выключать с рассветом” (см. изображение выше).

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

NightMode (ночное время)

Режим с “ручной” активацией – предполагается, что пользователь активирует данный режим непосредственно перед сном. При активации данного режима будут выключены те устройства, в настройках которых выбрана опция “Выключать при входе в ночной режим” (см. изображение выше). Де-активируется режим автоматически (по-умолчанию в 08:00 утра) без каких-либо дополнительных действий.

GuestsMode (у нас гости)

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

Реализация методов активации/де-активации режима оставлена на усмотрение пользователя.

SecurityArmedMode (на охране)

Режим, означающий, что дом находится в режиме Охрана.

Реализация методов активации/де-активации режима оставлена на усмотрение пользователя.

9 - Контроль доступа

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

Пользователи

Раздел предназначен для создания отдельных пользователей системы.

Панель управления → Настройки → Пользователи

  • Имя пользователя – используется для входа
  • Пароль – используется для входа (если не задан, то переключение происходит без запроса пароля)
  • Имя
  • Цвет
  • Связанный объект – если задан, то используется для сохранения дополнительных данных, связанных с пользователем
  • Хост (адрес) – если задан, то пользователь устанавливается автоматически при входе в систему с заданного IP-адреса
  • пользователь по умолчанию для системы – если включено, то данный пользователь устанавливается по-умолчанию, если не выбран какой-то другой
  • администратор системы – если включено, то у пользователя есть доступ к панели администрирования (настройки) системы

Переключение между пользователями осуществляется из основного интерфейса по нажатию на иконку пользователей:

Кроме того, интерфейс выбора пользователя доступен по ссылке:

http://IP_адрес_сервера/popup/users.html

Контроль доступа

Во многих частях системы можно установить дополнительный контроль доступа к отдельным элементам:

По клику на “Установить” появляется следующий интерфейс:

Доступ с терминалов

Определяет доступность элемента при использовании заданных терминалов (см. раздел Терминалы).

Можно выбрать “unknown”, если необходимо, чтоб условие доступа срабатывало для неизвестного терминала.

Опция “всегда доступно за исключением выбранного” инвертирует условие доступности для заданных терминалов.

Доступно для пользователей

Определяет доступность элемента для определённых пользователей.

Можно выбрать “Anonymous”, если необходимо, чтоб условие доступа срабатывало для анонимного пользователя.

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

Доступно в часы

Определяет доступность элемента для определённого времени суток.

Условие

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

&& означает, что при установке нескольких условий, итоговый результат будет положительным в случае выполнения каждого из них (принцип И)

10 - Терминалы