Умный дом majordomo: знакомство и настройка многофункциональной системы

Содержание:

3.6  Что такое «циклы системы»?

Циклы — это программный код в файлах /scripts/cycles_ *.php . Данный код обеспечивает функционирование отдельных «фоновых» процессов, не связаных с непосредственным ответом на запрос пользователя, а именно: обновление системного времени, периодические операции, выполнение запланированных задач, опрос показаний отдельного оборудования. Корректный запуск системы предполагает одновременный запуск системных циклов. Часть циклов может быть закрыто автоматически после запуска в виду того, что их работа не актуальна в соответствии с имеющимся оборудованием или настройками пользователя.

Методы

Методы представляют собой описание возможных действий объекта (или действий над объектом).

Например, у нас есть класс «Окна»  — который может иметь методы «Открыть» и «Закрыть».
Т.е. все объекты класса «Окна» так же будут иметь этот метод и мы можем открыть Объект «Окно в десткой» вызвав метод «Окно в детской.Открыть».

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

Пример (метод объекта):

Пример (код метода):

PHP

if ($this->getProperty(‘status’)) {
say(«Движение в гараже»);
}

1
2
3

if($this->getProperty(‘status’)){

say(«Движение в гараже»);

}

Пример (вызов метода):

PHP

callMethod(‘myObject.myMethod’,$params); // $params не обязательный массив параметров

1 callMethod(‘myObject.myMethod’,$params);// $params не обязательный массив параметров

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

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

Пример (привязка свойства/метода к пункту меню управления):

Поделитесь в соц сетях

Функционал Public Calls в Connect-е

В разделе CONNECT панели управления есть закладка Public Calls

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

Ссылку можно открывать просто в браузере или даже из скрипта.

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

Идеи использования:

  1. Обмен данными между несколькими системами MajorDoMo (одна система через getURL может инициировать событие в другой, причём у первой даже может не быть аккаунта в Connect-е)
  2. Интеграция со сторонними системами и интернет-сервисами (сторонняя система «дёргает» ссылку и MajorDoMo об этом узнаёт)
  3. Выдача прав на использование некоторых функций системы третьим лицам (передайте ссылку кому-нибудь, попросите добавить в закладки и объясните, что будет происходить при переходе — реализация сценария полностью на ваше усмотрение)

getURLBackground(‘URL’); — Запрос URL в фоне (если не важен результат

1.6  Оправдана ли покупка всего оборудования для использования в системе с экономической точки зрения?

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

Сервера «умного дома»

Мажордомо

Сайт проекта MajordomoПреимущества:

  • Ориентировано в основном на бывший СССР, т.к. поддержка на русском.
  • PHP знаком многим.
  • Много модулей, ориентированных на доступные в экс-СССР сервисы и железки.
  • Есть образы под Raspberry Pi
  • Мультиплатформер: Линукс-Винда-АРМы

Недостатки

  • Установка по инструкции — не всегда дает результат, даже если ты систему переставлял сто раз до этого.
  • Образ под Малину имеет некоторые модули, которые автор образа поставил до того, как накатал образ…
  • База для системы разворачивается через PHP MyAdmin…
  • Некоторые модули давно не поддерживаются, некоторые кривовато написаны и могут загнать процессор под 100% нагрузку, при том, что вроде как всего раз в час получают какую-то информацию…
  • «Защита? Какая защита?! Умный дом не должен иметь доступа из инета!»

Home Assistant

Плюсы

  • Просто ставится.
  • Из коробки подхватывает сразу как МиХоум устройства, так и имеющие прошивку ESPHome.
  • Довольно гибкая настройка логики без программирования как такового.
  • Мультиплатформер: Винда, Линь, АРМы

Минусы

  • С документацией напряг, особенно на русском.
  • Концепция настроечных файлов на начальном этапе слегка напрягает.
  • Заточенных под Яндекс погоду, курсы валют и некоторые «местные» сервисы модулей нет, или я их пока не нашел…

PhpMyAdmin

Многим нужен для комфортной работы phpmyadmin (интерфейс для доступа к базе данных). Решил показать на всякий случай, как его тоже добавить. Но я думаю суть вы уже уловили))) Добавляем очередной сервис в docker-compose.yml

PHP

phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
environment:
— PMA_HOST=mysql
— PMA_PORT=3306
restart: always
ports:
— 8085:80
depends_on:
— mysql

1
2
3
4
5
6
7
8
9
10
11

phpmyadmin

imagephpmyadminphpmyadmin

container_namephpmyadmin

environment

-PMA_HOST=mysql

-PMA_PORT=3306

restartalways

ports

-808580

depends_on

-mysql

И поднимаем всю связку

PHP

docker-compose up -d

1 docker-compose up-d

Phpmyadmin доступен на порту http://<айпиадрес_сервера>:8085.

Для входа можно использовать юзера root или же пользователя под которым входит majordomo. Оба пароля мы прописывали при поднятии контейнера mysql/mariadb.

Общие функции

DebMes($errorMessage, $logLevel) — записывает сообщение в главный лог файл. Параметр $logLevel не является обязательным, и по умолчанию установлен как «debug».

say($ph,$level,$from_user_id) — говорит фразу (использует глобальные переменные $voicemode» и $commandLine ).
$level — указывает уровень важности фразы (в зависимости от текущих настроек минимального уровня произношения, фраза может быть либо озвучена голосом либо просто записана в историю сообщений).
$from_user_id — от имени кого будет сказана фраза ($from_user_id в данном случае будет равен идентификатору текущего пользователя). sayTo (ФРАЗА, УРОВЕНЬ, НАЗНАЧЕНИЕ) — в качестве НАЗНАЧЕНИЯ можно использовать системное имя терминала и если это терминал на MajorDroid, то ему отправится команда для произношения

В любом случае из этой функции создаётся событие SAYTO (вида: processSubscriptions(‘SAYTO’, array(‘level’ => $level, ‘message’ => $ph, ‘destination’ => $destination));), которое может быть перехвачено сторонними модулями — на заметку тем, кто захочет создать свой модуль для организации работы с различными устройствами доставки сообщений на определённый канал

sayTo (ФРАЗА, УРОВЕНЬ, НАЗНАЧЕНИЕ) — в качестве НАЗНАЧЕНИЯ можно использовать системное имя терминала и если это терминал на MajorDroid, то ему отправится команда для произношения. В любом случае из этой функции создаётся событие SAYTO (вида: processSubscriptions(‘SAYTO’, array(‘level’ => $level, ‘message’ => $ph, ‘destination’ => $destination));), которое может быть перехвачено сторонними модулями — на заметку тем, кто захочет создать свой модуль для организации работы с различными устройствами доставки сообщений на определённый канал.

sayReply(ФРАЗА, УРОВЕНЬ, ОТВЕТ_НА_ЧТО) — последние два параметра не обязательны. Эта функция ведёт себя следующим образом:

  1. Если указан параметр ОТВЕТ_НА_ЧТО, то система попытается найти терминал, с которого был запрос, содержащий данную фразу
  2. Если не указан параметр ОТВЕТ_НА_ЧТО, то система выберет терминал, с которого был любой запрос в течении последних 5 секунд
  3. Если терминал найден, то ответ будет направлен на него (с помощью той же функции sayTo)
  4. Если терминал не найден, то ответ будет озвучен в обычном порядке (аналогично просто использованию функции say).

processCommand($command) — отправляет текстовую команду на исполнение (например, «скажи сколько время»). Сами команды настраиваются методе ThisComputer->commandReceived.

getGlobal($varname); — получения значения глобального свойства

setGlobal($varname,$value); — установка глобального свойства

processLine($line); — запуск скрипта синхронизации

getRandomLine($filename); — взятие случайной строки из текстового файла. $filename может быть сокращённым, например file1 и тогда будет браться файл ./texts/file1.txt

playSound($filename); — проигрывание файла (mp3,wav,etc.). $filename может быть сокращённым, например file1 и тогда будет браться файл ./sounds/file1.mp3

playMedia($path); — играть музыку из каталога $path

runScript($id,$data); — выполняет скрипт с заданным id. В качестве id может использоваться имя

runScriptSafe($id,$data); — выполняет скрипт безопасно в фоне

isOnLine($host) — проверяет доступность хоста из Устройства OnLine (1/0).

3.8  Какие средства диагностики есть у системы?

Для отладки и диагностики в систему встроено сразу несколько функциональных возможностей. Во-первых, работа основных циклов протоколируется в лог-файлы и складывается в папку /debmes/ , там же хранится общий лог системы с отдельным файлом за каждый день. Кроме того, в панели управления имеется модуль XRay, основная задача которого показать состояние системы на текущий момент во всех подробностях (значения свойств, история запуска сценариев, таймеры и т.п.). Дополнительно в панели управления есть модуль «Ошибки системы», в который сохраняется большинство случаев некорректного поведения системы (ошибки кода, базы данных и т.п.).

Общие направления

  • «Я купил реле Livolo и теперь гашу свет с пультика!» — это ниша всяческого «тупого» управления, автоматического поддержания температуры котла, автоматического проветривания и т.д. Это то, на что морщатся вообще все «Умнодомщики», но когда-то мы все проходили этот шаг. Некоторые — бегом и не оглядываясь.
  • «БРЭнДЫ» — Сяоми, Рубитек, Сименс и еще с десяток компаний, производящих оборудование для умного дома… Есть релешки от них, есть датчики от них, можно на их сервере или их железке расписать логику взаимодействия и будет вам щазтье… Пока не рухнет сервер, производитель не выпустит новую версию базового блока, или еще какая фигня… Делятся на три подгруппы: с закрытым API, с открытым API и «мне пофиг, я поменял в нем прошивку!»… Дело иметь лучше с 2 и 3, в идеале — вообще с 3
  • «А у меня есть бензольное колечко свой сервер!» — собственно вариант для продвинутых. Мы почти ни от кого не зависим и можем делать почти что захотим…

1.6  Оправдана ли покупка всего оборудования для использования в системе с экономической точки зрения?

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

Установка

Аппаратная часть

Прежде, чем начать развертывание, следует подобрать оборудование для системы. Под «Мажордомо» допустимо использовать практически любой не очень старый компьютер или ноутбук. Но, как правило, при реализации смарт-дома используют одноплатные миникомпьютеры: они бесшумны, надежны, дешевы и достаточно производительны

Для этой задачи хорошо подходят платы Raspberry Pi 2/3, на примере которых мы далее рассмотрим основные моменты установки и конфигурирования.

Развертывание программы

Версии ПО существуют и под Windows, и для Linux. Неискушенному пользователю стоит выбрать Windows-вариант, поскольку он проще в настройке и конфигурации. В рамках данной статьи мы приведем базовые шаги в случае с Linux и RPI.

Win-версия устанавливается как обычное приложение. Для RPI разработчики создали и поддерживают специально собранный образ, доступный на странице https://mjdm.ru/skachat-majordomo/:

Существует возможность развертывания и с нуля на «чистый» Raspbian (или другую версию Linux). Для этого необходимо присутствие в ОС:

  • сервера базы данных MySQL (MariaDB);
  • веб-сервера, например, Apache;
  • интерпретатора php с некоторыми модулями и оболочки PhpMyAdmin.

Установка MajorDoMo и его тонкая настройка подробно описаны в официальной документации к Windows- и Linux-вариантам. Энтузиасты также создали скрипт автоматизации, который развертывает весь программный комплекс самостоятельно. Получить его и запустить инсталляцию можно следующими командами:

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

Скрипт запросит пароль пользователя root создаваемой БД MySQL и учетной записи Pi. Данные аккаунта Pi вводить необходимо в любом случае, даже если такого пользователя в системе нет.

Иных действий не понадобится. После завершения работы скрипта будет выдано сообщение «Готово».

На этом этапе следует перезагрузить компьютер, после чего интерфейс умного дома MajorDoMo станет доступен для настройки через браузер по IP-адресу или имени узла md.lan. Имеется также доступ по протоколу SSH и проброс vlc over http.

Пример главной страницы:

Дополнительно потребуется установить PhpMyAdmin:

А также Java и сервер Blynk (нужен для разработки и функционирования приложений на iOS/Android).

Для добавления расширенной конфигурации выполняется команда:

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

После этого можно приступать к тонкой настройке и сопряжению с периферией.

Что это такое

Majordomo — свободно распространяемая кроссплатформенная программа, предоставляющая все необходимы инструменты для организации смарт-жилища:

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

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

Таким образом, MajorDoMo — сервер «умного дома» обеспечивающий согласованную работу прочих его компонентов. Он может быть установлен как на обычный ПК, так и ноутбук или поддерживаемый микрокомпьютер (например, Raspberry Pi, Arduino и прочие). Программа получает данные от сопряженных с ней датчиков и отдает заданные владельцем команды, исполняемые конечными устройствами и контроллерами.

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

3.6  Что такое «циклы системы»?

Циклы — это программный код в файлах /scripts/cycles_ *.php . Данный код обеспечивает функционирование отдельных «фоновых» процессов, не связанных с непосредственным ответом на запрос пользователя, а именно: обновление системного времени, периодические операции, выполнение запланированных задач, опрос показаний отдельного оборудования. Корректный запуск системы предполагает одновременный запуск системных циклов. Часть циклов может быть закрыто автоматически после запуска в виду того, что их работа не актуальна в соответствии с имеющимся оборудованием или настройками пользователя.

4.5  Что значит «связанный» объект/свойство/метод?

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

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

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

4.6  Что такое «чат системы», «командная строка», «консоль»?

  • Чат системы — история сообщений от системы, а так же форма ввода команд на естественном языке. Данный модуль доступен в пользовательском интерфейсе и встроен в Меню по-умолчанию. Так же его можно встроить в сцену или обратиться по прямой ссылке /command.php
  • Командная строка — средство операционной системы (не системы MajorDoMo) для запуска системных команд. Обычно используется для первоначальной настройки платформы и тонкой настройки операционной системы
  • Консоль — встроенная в панель управления MajorDoMo строка ввода (ссылка Консоль в блоке заголовка панели). Данная строка позволяет отправлять инструкции языка программирования PHP. Например, можно там написать say(«Привет»,2); и инструкция будет выполнена, а именно произнесено слово «Привет»

Работа с объектами

addClass(‘ESP8266’); // Создаем класс
addClassObject($class, $objName); — Создать объект от родительского класса. Передаются строки$obj=getObject($name); — получает объект по имени $name. с полученным объектом можно работать используя следующие методы:
$obj->callMethod(‘method_name’,$params); $obj->setProperty(‘property_name’,$value);
$obj->getProperty(‘property_name’);
$obj-> description; Доступ к описанию объекта
$this->object_title; — Доступ к имени объекта

callMethod(‘Object.Method’, $params); — вызывает метод объекта с заданными параметрами (последнее указывать не обязательно). Параметры передаются массивом, например array(«value»=>0)

PHP

$command=’Сколько время’;
callMethod(‘ThisComputer.commandReceived’,array(‘command’=>$command));

1
2

$command=’Сколько время’;

callMethod(‘ThisComputer.commandReceived’,array(‘command’=>$command));

cm — альтернативное имя предыдущей функции

$value=getGlobal(‘Object.Property’); — получения значения свойства объекта

gg — альтернативное имя предыдущей функции

setGlobal(‘Object.Property’,$value); — установка значения свойства объекта

sg — альтернативное имя предыдущей функции

$objects=getObjectsByClass(‘class_name’); — возвращает массив объектов указанного класса в виде название.Пример перебора объектов в цикле и установки значения свойств:

PHP

$objects=getObjectsByClass(«class_name»);
foreach($objects as $obj) {
setGlobal($obj.».property_name»,1);
}

1
2
3
4

$objects=getObjectsByClass(«class_name»);

foreach($objectsas$obj){

setGlobal($obj’TITLE’.».property_name»,1);

}

getObjectsByProperty($property_name,$condition=,$condition_value=); — возвращает массив названий объектов, имеющих свойство $property_name. опционально можно задать условие, под которое попадает значение. Условия могут быть == (или =), >=, >, <=, <, <> (или !=)

Регистрация приватного навыка

Навыки умного дома — специальная категория навыков Алисы, предназначенных для голосового управления домашними устройствами. Навыки создаются в  платформы Яндекс Диалогов.

Основные шаги по созданию навыка это:

  1. Настройка связки аккаунтов OAuth 2.0.
  2. Добавление навыка и выбор его типа.
  3. Заполнение информационных полей.
  4. Модерация навыка.
  5. Публикация навыка.

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

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

  • Название — понятное вам название связки.
  • Идентификатор приложения — значение OAuth2 ID из настроек модуля Yandex Home.
  • Секрет приложения — значение OAuth2 KEY из настроек модуля Yandex Home.
  • URL авторизации — адрес вебхука авторизации (см. предыдущую статью), например, 
  • URL для получения токена — адрес вебхука получения токена (см. предыдущую статью), например, 
  • URL для обновления токена — тот же самый, что и пунктом выше, например, 
  • Идентификатор группы действий — оставляем пустым.
  • Идентификатор OAuth приложения — оставляем пустым.

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

Тип навыка выбираем Умный дом.

  • Название — указываем название навыка.
  • Endpoint URL — адрес вебхука обработчика навыка (см. предыдущую статью), например, .

  • Приватность — обязательно ставим галочку Не показывать в каталоге.
  • Подзаголовок — пишем краткое описание навыка.
  • Имя разработчика — фамилия, имя.
  • E-mail разработчика — пишем аккаунт Яндекс.Почты.
  • Сайт для верификации прав использования бренда — оставляем пустым.
  • Описание — произвольное описание нашего навыка.
  • Заметки для модератора — оставляем пустым.
  • Иконка — логотип навыка в формате PNG или JPG.

Связка аккаунтов — в выпадающем списке выбрать ранее созданную связку.

Сохраняем изменения, после чего становится активной кнопка На модерацию. Кликаем на нее и отправляем наш навык на модерацию. На сегодняшний день модерация автоматическая и происходит мгновенно.

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

Опубикованный приватный навык появится в списке навыков умного дома в приложении Яндекс (или в его веб-версии ).

На следующем шаге можно приступать к объединению аккаунтов.

1.1  Что такое Умный Дом?

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

  • Безопасность— повышение уровня безопасности за счёт постоянного контроля параметров работы технологических систем (отопление, водоснабжение, электричество и т.п.), а так же интеграция охранных компонентов (сигнализация, видео-наблюдение, GPS-трэкинг)
  • Экономия— поддержка оптимальных параметров энерго-потребления (электричество/тепло) и автоматический перевод систем в экономичный режим
  • Комфорт— централизованное управление всеми системами, автоматические сценарии последовательных действий, работа с мульти-медиа.

4.5  Что значит «связанный» объект/свойство/метод?

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

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

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

Zigbee2MQTT

Как и в случае установки mosquitto — создадим папку под конфиги.

PHP

mkdir ./zigbee2mqtt

1 mkdir.zigbee2mqtt

И добавим наш сервис zigbee2mqtt в конец файла docker-compose.yml

PHP

zigbee2mqtt:
container_name: zigbee2mqtt
#image: koenkk/zigbee2mqtt:arm32v6 # arm32 (raspberry pi)
image: koenkk/zigbee2mqtt:latest # x86_64/amd64
restart: always
volumes:
— ./zigbee2mqtt:/app/data
devices:
— /dev/ttyACM0:/dev/ttyACM0
user: ‘1000:20’
depends_on:
— mosquitto

1
2
3
4
5
6
7
8
9
10
11
12

zigbee2mqtt

container_namezigbee2mqtt

#image: koenkk/zigbee2mqtt:arm32v6 # arm32 (raspberry pi)

imagekoenkkzigbee2mqttlatest# x86_64/amd64

restartalways

volumes

-.zigbee2mqttappdata

devices

-devttyACM0devttyACM0

user’1000:20′

depends_on

-mosquitto

Не забываем добавить пользователя в группу dialout (20), чтобы он смог работать с usb стиком

PHP

sudo usermod -aG dialout <имя_пользователя>

1 sudo usermod-aG dialout<имя_пользователя>

Пробуем опять создать и запустить контейнеры стака.

PHP

docker-compose up -d

1 docker-compose up-d

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

PHP

nano ./zigbee2mqtt/configuration.yaml

1 nano .zigbee2mqttconfiguration.yaml

Вписываем/исправляем примерно до следующего вида

PHP

# разрешаем подключаться новым девайсам (активируем режим сопряжения при запуске)
permit_join: true

# Настройки MQTT
mqtt:
# MQTT базовый топик для публикации сообщений
base_topic: zigbee2mqtt
# MQTT URL
server: ‘mqtt://mosquitto’ #да именно так, т.к. мы хост указали в контейнере москита
# MQTT авторизация, если требуется
user: user
password: password

# Настройки порта
serial:
# Путь к стику CC2531
port: /dev/ttyACM0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# разрешаем подключаться новым девайсам (активируем режим сопряжения при запуске)

permit_jointrue

 
# Настройки MQTT

mqtt

# MQTT базовый топик для публикации сообщений

base_topiczigbee2mqtt

# MQTT URL

server’mqtt://mosquitto’#да именно так, т.к. мы хост указали в контейнере москита

# MQTT авторизация, если требуется

useruser  

passwordpassword

 
# Настройки порта

serial

# Путь к стику CC2531

portdevttyACM0

И перезапускаем контейнер

PHP

docker-compose restart zigbee2mqtt

1 docker-compose restart zigbee2mqtt

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

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

PHP

ls /dev/serial/by-id/usb-*

1 lsdevserialby-idusb-*

Среди результатов найти стик, думаю не проблема

На всякий случай скажу, что искать что то содержащее Texas_Instruments)).

Запланированные задачи и события

AddScheduledJob(‘title’,’commands’,$datetime, $expire=60); — $expire в секундах

ClearScheduledJob(‘title’); — может использоваться маска типа «title%»

SetTimeOut(‘title’,’commands’, $timeout); — $timeout в секундах (аналог AddScheduledJob(‘title’,’commands’,time()+$timeout));

ClearTimeOut(‘title’); — аналог ClearScheduledJob(‘title’);

timeOutExists(‘title’); — возвращает идентификатор запланированной задачи (или 0, в случае отсутствия)

registerEvent($eventName, $details=»,$expire_in=365); — регистрация события $eventName

registeredEventTime($eventName); — возвращает время последней регистрации события $eventName (-1 если еще не было такого события)

Работа с шаблонами

PHP

$new_pattern=array();
$new_pattern=1; // флаг того, что шаблон будет одноразовый
$new_pattern=1; // флаг того, что шаблон не будет реагировать на системные уведомления, только пользовательские
$new_pattern=’say(«‘.$matches.'»,0,’.$from_user_id.’);’; // код реакции нашего шаблона
addPattern($matches,$new_pattern,1); // добавляем описанный шаблон
say(«Добавлена реакция на слово \»».$matches.»\»»,2); // подтверждаем то, что реакция добавлена

1
2
3
4
5
6

$new_pattern=array();

$new_pattern’ONETIME’=1;// флаг того, что шаблон будет одноразовый

$new_pattern’SKIPSYSTEM’=1;// флаг того, что шаблон не будет реагировать на системные уведомления, только пользовательские

$new_pattern’SCRIPT’=’say(«‘.$matches2.'»,0,’.$from_user_id.’);’;// код реакции нашего шаблона

addPattern($matches1,$new_pattern,1);// добавляем описанный шаблон

say(«Добавлена реакция на слово \»».$matches1.»\»»,2);// подтверждаем то, что реакция добавлена

context_activate($id); — Активировать вручную нужный контекст (ступень шаблона) (вместо $id нужно вставить цифровой код шаблона — он виден в ссылке при редактировании шаблона/контекста). context_clear(); — позволяет сбросить текущий контекст у текущего пользователя.clearTimeOut(‘user_’.context_getuser().’_contexttimeout’); — удаление таймера события при не ответеcontext_getuser(), по всей видимости возвращает id текущего пользователя.
Если нам для чего то потребуется имя, то зная id достать его из базы данных не трудно.
Полный код команды Забудь:

PHP

context_clear();
clearTimeOut(‘user_’.context_getuser().’_contexttimeout’);
say(‘Контекст забыт.’);

1
2
3

context_clear();

clearTimeOut(‘user_’.context_getuser().’_contexttimeout’);

say(‘Контекст забыт.’);

Дашборд

Дашборд по факту является одним из типов домашних страниц (новые дашборды создавать надо именно там), но заслуживает отдельного внимания, как самостоятельный интерфейс. Сделан он на базе freeboard.io. Его уникальность в том, что с ним удобно работать как на больших устройствах, так и с мобильных версий браузеров. Интерфейс плиточный, и подстраивается под размер экрана регулируя количество столбцов по ширине экрана. Степень кастомизации, как и у меню — довольно таки низкая. Допустимо использовать сторонние виджеты данного проекта, но чтобы их интегрировать — потребуются некоторые знания.

Указание статичных адресов контейнеров

После того как указали параметры сети — можно присвоить статичные адреса контейнерам. Рекомендую не занимать первые адреса в сети, либо же указывать адреса всем контейнерам без исключения. Т.к., допустим, если вы указали адрес 172.1.0.2 контейнеру, контейнер, которому адрес не присвоен может занять его, если запустится раньше, и контейнер с указанным адресом не сможет запуститься вовсе. Для контейнера статичный ip присваивается следующим образом (на примере phpmyadmin)

PHP

phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
networks:
majordomo:
ipv4_address: 172.1.0.20
environment:
— PMA_HOST=mysql
— PMA_PORT=3306
restart: always
ports:
— 8085:80

1
2
3
4
5
6
7
8
9
10
11
12

phpmyadmin

imagephpmyadminphpmyadmin

container_namephpmyadmin

networks

majordomo

ipv4_address172.1.0.20

environment

-PMA_HOST=mysql

-PMA_PORT=3306

restartalways

ports

-808580

После этого из локальной машинки можно будет обращаться к контейнеру по указанному ip адресу…напоминаю — эта сеть существует только «внутри сервера». Снаружи — все сервисы доступны только по ip-адресу сервера и прокинутым наружу портам (по крайней мере в режиме сети bridge)

Вывод данных (информация)

Вывод информации в меню в большинстве случаев осуществляется через стандартную конструкцию вида

%Объект.Свойство%

1 %Объект.Свойство%

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *