Самый простой и удобный протокол для управления различными “умными” устройствами, на мой взгляд – это MQTT. На этом сайте Вы можете найти перечень публичных облачных MQTT-серверов (брокеров), с помощью которых можно связать один или несколько микроконтроллеров с устройствами управления (например смартфоном) или даже между собой. Но использование только публичных MQTT-брокеров не всегда удобно, например когда требуется обмен информацией между разными микроконтроллерами в пределах одной локации. Например: у меня на даче сведения о уличной температуре и влажности собирает гаражная метеостанция, а использует эти данные не только она, но и множество других устройств – управление вентиляцией, отоплением, подогревом погреба и т.д. Конечно, можно натекать на каждое устройство свои автономные “уличные” датчики, но это лишние датчики, провода, выводы; да и датчик далеко не всегда можно разместить так, чтобы он давал правильные показания. А через MQTT брокер это сделать не сложно – нужно только подписаться на любом устройстве на данные метеостанции и всё, получай данные. Проблемы начинаются, когда пропадает доступ к сети интернет, и это бывает к сожалению, не редко. В таком случае устройства уже не могут обмениваться информацией между собой и вся схема рушится. Если с погодными данными можно как-то смирится, то данные о срабатывании охранных и аварийных сенсоров должны распространяться между устройствами практически мгновенно. Очевидное решение описанной проблемы – использовать локальный брокер. Вторая причина, по которой стоит установить свой личный брокер – временные задержки при обмене информацией между устройствами. И третья не очень очевидная выгода от использования локального брокера – возможность избавиться от необходимости создания защищенного (TLS) соединения между устройствами и сервером, ведь эти подключения будут происходить только за NAT-ом. Недостаток тоже имеется – “просто так” подключиться со смартфона к локальному брокеру вне сети не получится, но эту проблему можно решить.
1. На базе Raspberry Pi. Самый очевидный вариант. Можно довольно просто развернуть на “малинке” образ какого-нибудь linux-а, установить mosquitto или его аналог и пользоваться в свое удовольствие. Мощности малинки хватит с запасом. А как вариант можно развернуть на ней полноценную систему “умного дома” типа Home Assistant (или другую, вариантов много), тогда Вы автоматически получаете связанный с умным домом MQTT-брокер, и “велосипед изобретать” не потребуется. Но мне “умный дом” не приглянулся вовсе, я предпочитаю создавать маленькие автономные устройства, решающие четко ограниченные задачи; а объединять их все только на уровне панели управления MQTT. Кроме того, в этом варианте меня напрягла необходимость покупать и постоянно кормить электричеством (хоть и относительно немного) отдельное устройство.
2. На базе ESP8266. Существует проект esp_mqtt, который позволяет создать на базе ESP8266 маленький MQTT-брокер. Достоинства: маленький размер и малое энергопотребление. Правда и ограничений в этом случае довольно много – в частности по количеству клиентов и хранимых сообщений. Можно наплодить из ESP целую кучку таких брокеров и создать разветвленную сеть. Я рассматривал это как “запасной вариант”.
2. На базе домашнего роутера. Но зачем покупать лишнее устройство, если можно поставить MQTT брокер на домашний роутер, ведь роутер всё равно нужен и к тому же работает круглые сутки. Существуют прошивки для многих роутеров на базе OpenWRT, куда можно поставить что угодно. Правда мне не хотелось перепрошивать свой роутер кастомной прошивкой, ведь в случае ошибки можно превратить роутер в кирпичик с лампочками. Да и, судя по отзывам, OpenWRT не всегда так удобна, как родная прошивка роутера. Но сейчас на Keenetic-и добавили поддержку “Менеджера пакетов OPKG“, и теперь не требуется перепрошивать роутер, чтобы получить возможность устанавливать на него дополнительные пакеты. OPKG — это свободно распространяющийся менеджер пакетов для встраиваемых систем. Вот этой возможностью мы и воспользуемся.
Что потребуется
1. Роутер Keenetic с поддержкой OPKG. Насколько я понял из официальной инструкции, это могут быть следующие модели: Keenetic Omni (KN-1410), Keenetic Extra (KN-1710/1711), Keenetic Giga (KN-1010), Keenetic Ultra (KN-1810), Keenetic Viva (KN-1910), Keenetic Giant (KN-2610), Zyxel Keenetic II / III, Zyxel Keenetic Extra, Zyxel Keenetic Extra II, Zyxel Keenetic Giga II / III, Zyxel Keenetic Omni, Zyxel Keenetic Omni II, Zyxel Keenetic Viva, Zyxel Keenetic Ultra, Zyxel Keenetic Ultra II, а также Keenetic DSL (KN-2010), Duo (KN-2110) и Zyxel Keenetic DSL, LTE, VOX.
Следует иметь в виду, что младшие модели с небольшим объемом RAM и слабым процессором могут просто не потянуть дополнительную нагрузку в виде mosquitto, особенно если роутер уже нагружен большим объемом передаваемого трафика. У меня уже имелся достаточно мощный Keenetic Giga с двухядерным процессором и 256MB RAM. Старый Keenetic 4G не тянул не только OPKG, но даже и кастомную OpenWRT. Поэтому, когда пришло время менять роутер на даче, я даже не задумывался, какую модель выбрать – купил точно такую же Giga. Да, это достаточно дорогой выбор, но “любишь кататься, люби и бензин покупать”… Поэтому процесс установки будет описан именно для нее. Думаю, что для других моделей Keenetic процесс установки практически не будет отличаться от описанного.
PS: Я вполне допускаю, что роутеры других производителей ещё круче и лучше, и так же допускают установку пакетов OpenWRT “из коробки” – но эта статья не про них.
2. USB-накопитель с разделом ext4. Я купил себе крохотную флешку на 32Gb, дабы не сильно торчала из корпуса роутера. Для создания раздела ext4 в системе Windows для этого можно воспользоваться бесплатным приложением MiniTool Partition Wizard Free. Процесс подготовки подробнее будет описан ниже.
Это всё, что требуется. Плюс немного мысленных усилий и гугла в помощь. Приступаем.
1. Устанавливаем необходимые компоненты
Заходим в панель управления (“админку”) роутера. Находим раздел “Управление” – “Общие настройки” – “Обновления и компоненты”. Нажмите кнопку “Изменить набор компонентов”:
Установка необходимых компонентов
Что потребуется установить:
- Пакеты OPKG / Поддержка открытых пакетов – Система управления пакетами на основе OPKG. Основной компонент, что нам требуется.
- Пакеты OPKG / Модули ядра для поддержки файловых систем – Поддержка различных файловых систем для OPKG.
- USB-накопители / Файловая система Ext – Необходим для работы с файловой системой Ext на USB-накопителях.
- USB-накопители / Общий доступ к файлам и принтерам (TSMB CIFS) – Предоставляет доступ к USB-накопителям и принтерам для компьютеров под управлением Windows. необходим будет, чтобы иметь возможность подключаться к флешке по сети и копировать на нее или с нее файлы, редактировать файл конфигурации mosquito.
- Базовые компоненты / Сервер SSH – Позволяет безопасно подключаться к командной строке устройства. Это нам потребуется. Я не на 100% уверен, что именно этот компонент будет задействован впоследствии, по подключаться к командной строке придется. Поэтому лучше поставить, не убудет.
Остальные компоненты – по желанию и необходимости (если Вы ещё ничего не меняли). Не забываем нажать кнопку “Установить обновление” внизу, ждем несколько минут, пока роутер скачает необходимые пакеты, установит их и перезагрузится. А в это время можно заняться подготовкой USB-накопителя…
2. Подготавливаем USB-накопитель
Как я уже написал выше, для установки OpenWRT-пакетов на Keenetic необходимо предварительно подготовить внешний USB-накопитель и установить на него систему пакетов репозитория Entware. Повторю здесь цитату из официальной инструкции: Для использования пакетов OPKG необходим USB-накопитель, подключенный к интернет-центру. Диск должен быть отформатирован в файловой системе EXT. Мы рекомендуем использовать современную и актуальную журналируемую файловую систему EXT4. Для работы накопителей с EXT4 в роутере Keenetic должен быть установлен компонент “Файловая система Ext”.
Небольшое примечание: в инструкции по установке Asterisk на роутер настойчиво рекомендуют использовать файловую систему EXT2, чтобы снизить износ Flash-памяти. Хм, теперь я не уверен в том, что EXT4 это оптимальный выбор для OPKG, но все-таки я отформатировал флешку, как описано в “основной” инструкции. Какую ФС предпочтете Вы – решать Вам. Я не думаю, что с EXT2 OPKG будет хуже работать.
Небольшая сложность здесь в том, что Windows сама по себе не умеет работать с файловыми системами EXT. Для подготовки потребуется дополнительная программа MiniTool Partition Wizard Free или аналогичная. Скачиваем, устанавливаем, запускаем. Вставляем накопитель в USB-разъем, находим в списке нужный раздел, и запускаем его форматирование как EXT4, примерно как показано на рисунке ниже:
Форматирования раздела в EXT4
Не забудьте нажать кнопку “Apply” слева внизу (применить внесенные изменения). Ждем, довольно долго… 32GB форматируется больше получаса. После форматирования Windows “не видит” эту флешку, так что на нее напрямую ничего скопировать не получится. Вставляем подготовленную флешку в порт Keenetic-а. Заходим в интерфейс Keenetic и убедимся, что накопитель доступен. Для этого необходимо отрыть раздел “Управление” – “Приложения“:
Проверяем успешное монтирование диска
Теперь нужно подключить этот накопитель к приложению “Сеть Windows“, дабы иметь возможность скопировать на него файлы по сети. Находим приложение “Сеть Windows” на этой же странице, только ниже и кликаем по его названию:
Активируем приложение “Сеть Windows”
Убедимся, что доступ к диску по сети имеется, при необходимости можно настроить доступ с помощью кнопки “Добавить общий ресурс”:
Настройка приложения “Сеть Windows”
На компьютере с помощью файлового менеджера открываем диск по сети (в ОС Windows можно использовать Проводник) “Сеть > Ваш Роутер > Ваш ресурс” и убеждаемся, что всё успешно работает.
Так выглядит пока ещё пустой USB-диск на роутере
Можно приступать настройке OPKG и установке системы пакетов репозитория Entware.
3. Установка репозитория Entware на USB-накопитель
Инструкция на сайте keenetic. Для моделей Omni (KN-1410), Extra (KN-1710/1711), Giga (KN-1010), Ultra (KN-1810), Viva (KN-1910), Giant (KN-2610) и Zyxel Keenetic II / III, Extra, Extra II, Giga II / III, Omni, Omni II, Viva, Ultra, Ultra II используйте для установки архив mipsel – mipsel-installer.tar.gz.
Для моделей DSL (KN-2010), Duo (KN-2110) и Zyxel Keenetic DSL, LTE, VOX используйте для установки архив mips – mips-installer.tar.gz
У меня Giga (KN-1010), поэтому я скачиваю первый вариант. Затем в корне раздела диска необходимо создать директорию install, куда скопировать скачанный файл mipsel-installer.tar.gz. Внимание: регистр символов важен! Не Install, и не INSTALL, а именно install.
Создаем папку install на USB-диске на роутере
В веб-интерфейсе роутера перейдите на страницу “Настройка” – “OPKG” для выбора накопителя. Выберите накопитель, в поле “Сценарий initrc” добавьте opt/etc/init.d/rc.unslung, после чего сохраните изменения.
Настройка OPKG
После нажатия кнопки “Сохранить” роутер зависнет на пару минут, это нормально. После этого перейдите на страницу “Диагностика” и откройте Системный журнал роутера (кнопкой “Показать журнал”). В нем вы должны увидеть следующие записи:
Системный журнал
PS: Официальная инструкция: Установка системы пакетов репозитория Entware на USB-накопитель.
4. Настройка репозитория Entware
Для дальнейшей настройки нам понадобится SSH-клиент, например PUTTY для работы с протоколами SSH и Telnet. Если он у Вас ещё не установлен, то скачиваем и устанавливаем. Дальнейшие действия рассматриваются на его примере.
Запускаем, выбираем режим SSH, указываем адрес Вашего роутера (у меня он несколько “нестандартный”, так как несколько роутеров объединены в сеть) и порт 222, как на рисунке:
PUTTY
На страшный запрос о добавлении сертификата сервера в кеш обязательно отвечаем “Да”, после чего появится черное-черное окно терминала в черной-черной комнате. На запрос login as вводим root, на запрос пароля вводим keenetic (в пароле вводимые символы никак не отображаются):
login as: root root@192.168.111.1's password: keenetic
После чего мы попадаем в командный интерфейс:
Терминал Entware
Первым делом необходимо сменить пароль доступа к терминалу Entware. Примечание: пользователь root в интерфейсе самого роутера нигде не участвует, он необходим только для доступа к Entware. Для этого введите команду passwd и дважды введите новый пароль:
Смена пароля
Теперь можно обновить opkg-пакеты, для этого введите команду opkg update:
~ # opkg update Downloading http://bin.entware.net/mipselsf-k3.4/Packages.gz Updated list of available packages in /opt/var/opkg-lists/entware Downloading http://bin.entware.net/mipselsf-k3.4/keenetic/Packages.gz Updated list of available packages in /opt/var/opkg-lists/keendev ~ #
Для удобства настройки сразу установим Midnight Commander, с помощью него многие операции можно выполнить существенно проще. Для этого следует выполнить команду opkg install mc:
~ # mc -sh: mc: not found ~ # opkg install mc Installing mc (4.8.26-1b) to root... Downloading http://bin.entware.net/mipselsf-k3.4/mc_4.8.26-1b_mipsel-3.4.ipk .... Configuring libiconv-full. .... Configuring mc. ~ # mc
Midnight Commander
На этом подготовку к установке MQTT-брокера можно считать завершенной.
5. Установка Mosquitto
Находим нужный нам пакет. Полный список пакетов можно найти здесь:
Основной список пакетов для mipsel Дополнительный список пакетов Keenetic для mipsel
Открываем основной список, в строке фильтра вводим mqtt и смотрим результаты:
Находим пакеты для сервера mosquitto
Нам нужен пакет для сервера mosquitto, их два: простая версия (nossl) и защищенная (ssl). Я выбрал второй вариант. Для установки пакета вводим команду opkg install mosquitto-ssl и ждем завершения:
~ # opkg install mosquitto-ssl Installing mosquitto-ssl (2.0.10-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/mosquitto-ssl_2.0.10-1_mipsel-3.4.ipk Installing zlib (1.2.11-3) to root... Downloading http://bin.entware.net/mipselsf-k3.4/zlib_1.2.11-3_mipsel-3.4.ipk Installing libopenssl (1.1.1k-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/libopenssl_1.1.1k-1_mipsel-3.4.ipk Installing libcap (2.48-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/libcap_2.48-1_mipsel-3.4.ipk Installing libwebsockets-openssl (4.1.6-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/libwebsockets-openssl_4.1.6-1_mipsel-3.4.ipk Installing cJSON (1.7.14-3) to root... Downloading http://bin.entware.net/mipselsf-k3.4/cJSON_1.7.14-3_mipsel-3.4.ipk Configuring libcap. Configuring zlib. Configuring libopenssl. Configuring libwebsockets-openssl. Configuring cJSON. Configuring mosquitto-ssl. ~ #
Установка выполнена, переходим к настройке.
6. Настройка Mosquitto
Файл конфигурации mosquitto находится в каталоге /opt/etc/mosquitto/ и называется mosquitto.conf. В большинстве инструкции авторы советуют оставить этот файл неизменным, а все настройки выполнять в отдельном файле (прилинковав его к первому), мотивируя это тем, что так удобнее (на самом деле так решил только первый, настоящий автор, а остальные просто тупо скопипастили, не задумываясь). Мне этот подход показался не удобным и я сделал по другому – оригинальный файл скопировал с переименованием в mosquitto.default (дабы иметь возможность вернуть оригинал, если накосячу), а все настройки выполнял в основном файле, попутно переводя транслейтом не совсем понятные мне места.
1. Вначале стоит добавить пользователя, от имени которого будет запускаться mosquitto. Негоже запускать его от имени root, так как это ведет к снижению уровня безопасности всего роутера. Для добавления нового пользователя в консоли вводим команду adduser mosquitto, а затем два раза вводим пароль:
~ # adduser mosquitto Changing password for mosquitto New password: *********** Bad password: too weak Retype password: *********** passwd: password for mosquitto changed by root ~ #
После чего в файле конфигурации mosquitto.conf необходимо раскомментировать строку General configuration / user mosquitto:
# When run as root, drop privileges to this user and its primary # group. # Set to root to stay as root, but this is not recommended. # If set to "mosquitto", or left unset, and the "mosquitto" user does not exist # then it will drop privileges to the "nobody" user instead. # If run as a non-root user, this setting has no effect. # Note that on Windows this has no effect and so mosquitto should be started by # the user you wish it to run as. user mosquitto
Перезапускаем роутер. Снова подключаемся к роутеру по SSH и пробуем запустить mosquitto командой mosquitto -c /opt/etc/mosquitto/mosquitto.conf -d, после чего проверяем успешность запуска с помощью команды ps:
~ # mosquitto -c /opt/etc/mosquitto/mosquitto.conf -d
~ # ps
PID USER VSZ STAT COMMAND
1 root 1100 S init
.........................
1079 mosquitt 7264 S mosquitto -c /opt/etc/mosquitto/mosquitto.conf -d
1080 root 3880 R ps
Здесь важно убедится, что сервер нормально запустился под только что созданным пользователем. Если это не так (сервер пишет, что пользователь mosquitto не найден), то можно попробовать обходной путь из этой статьи. Однако на новой версии у меня всё заработало без танцев с бубном.
2. Добавляем mosquitto в автозагрузку при включении или перезапуске роутера. Для этого необходимо создать скрипт в каталоге /opt/etc/init.d с названием Smosquitto. Префикс “S” означает, то данный скрипт будет включён в автозапуск (префикс “K” означает, то данный скрипт будет исключён из автозапуска). Удобнее всего это сделать с помощью mc:
Создание скрипта автозапуска
Для этого запускам mc, переходим в каталог /opt/etc/init.d, нажимаем клавиши shift+f4 (открывается пустой файл) и вставляем следующие строки:
#!/bin/sh PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin mosquitto -d -c /opt/etc/mosquitto/mosquitto.conf
Затем сохраняем файл с помощью клавиши f2, указав имя файла Smosquitto. Как вариант, можно сделать это по сети. Затем нужно сделать этот скрипт исполняемым командой chmod +x /opt/etc/init.d/Smosquitto.
3. Создаем рабочие каталоги или разрешаем доступ к уже существующим. Для нормальной работы mosquitto потребуется иметь доступ на запись как минимум в два каталога (а на первых порах лучше в три). Поскольку мы будем запускать брокер от пользователя с “не root”, права на доступ к файлам и папкам у него будут минимальными – только на чтение (по большей части, исключение составляет каталог пользователя). Поэтому придется вначале вручную создать необходимые директории и разрешить пользователю mosquitto доступ к ним.
Я создал следующую структуру каталогов (возможно, она не является оптимальной, Вы можете изменить по своему вкусу):
- /opt/etc/mosquitto [чтение и выполнение] – Этот каталог будет создан автоматически при установке. Здесь находятся файл конфигурации, позже я добавил файл со списком пользователей, файл со списком разрешений, служебные скрипты (перезапуск например). Ничего дополнительно настраивать не требуется.
- /opt/etc/mosquitto/persistence [полный доступ, владелец] – Этот каталог предназначен для хранения базы данных брокера. Можно, конечно, обойтись и без этого, но тогда все retained сообщения будут потеряны при случайной перезагрузке роутера или отключении электричества. Для того, чтобы брокер мог беспрепятственно создавать файлы и писать туда данные, дадим полный доступ.
- /opt/var/log [чтение, запись и поиск (выполнение)] – сюда будем писать журнал. На первых порах он гораздо удобнее системного журнала. Потом, когда всё отлажено, чтобы не следить за размером файла, можно оставить вывод сообщений только в системный журнал роутера. Хотя, в принципе, ничто не мешает писать логи в другой каталог, например /opt/etc/mosquitto/log
- /opt/var/run [чтение, запись и поиск (выполнение)] – а в этом каталоге сервер сохраняет pid-файл, который определяет, запущен процесс или нет. Сюда же роутер пишет другой похожий файл, так что здесь ему самое место.
Обратите внимание! Для всех пакетов OPKG все директории обязательно должны начинаться с /opt/!
Приступаем к настройке каталогов и раздаче прав. С собственно /opt/etc/mosquitto делать ничего не требуется – пользователь mosquitto по умолчанию имеет права на чтение и выполнение, а большего и не нужно. Переходим в этот каталог, создаем новый persistence и назначаем ему нового владельца:
~ # cd /opt/etc/mosquitto ~ # mkdir persistence ~ # chown -R :mosquitto persistence ~ # chown -R mosquitto persistence
Менять владельца требуется, так как мы зашли в SSH-терминал под пользователем root, а доступ нужно дать пользователю mosquitto. Поэтому при создании каталога владельцем автоматически станет тот, кто его создал (я тебя породил, я тебя и убью, да-да, именно так). Можно ограничится chmod 777, но я решил сделать кардинально.
Теперь проверьте, существуют ли каталоги /opt/var/log и /opt/var/run. Если их ещё нет, создайте. Проще и удобнее всего это сделать с помощью mc (Midnight Commander). После этого необходимо дать полные права на эти каталоги:
~ # chmod 777 /opt/var/log ~ # chmod 777 /opt/var/run
Тут уж ничего не поделаешь – изменять владельца нельзя, добавить только пользователя mosquitto (как это можно сделать в виндах) – тоже. Ограничится только чтением + записью тоже не удалось (файлы не создавались). Пришлось давать все права и всем (777).
Альтернативный вариант, предложенный в комментариях. Можно попробовать выполнить следующие команды:
~ # touch /opt/var/run/mosquitto.pid ~ # touch /opt/var/log/mosquitto.log ~ # chown mosquitto:mosquitto /opt/var/run/mosquitto.pid ~ # chown mosquitto:mosquitto /opt/var/log/mosquitto.log
С одной стороны, это более правильный вариант. Команда touch создает пустой файл, затем с помощью команды chown меняем владельца данного файла на mosquitto. Единственный момент – после того, как любой из файлов будет удален “вручную” (например из-за большого размера файла журнала), потребуется вновь повторить данные команды.
4. Настраиваем mosquitto.conf. Файл конфигурации mosquitto.conf я полностью очистил и заполнил только теми значениями, которые я изменял. Просто “выдергивал” из заранее скопированного в отдельную папку “дефлотного” нужные мне параметры и вставлял в основной файл. Можно править этот файл по сети, но нужно иметь в виду что файл должен быть в кодировке UTF-8 с BOM. Можно править файл с помощью mc прямо в консоли роутера.
Первым делом нужно указать, на каком порту сервер будет “слушать” входящие подключения. Пока оставим один порт – 1883, без TLS. Честно говоря, в локальной сети TCP + TLS не очень то и требуется, ведь все соединения происходят только внутри за NAT-ом и в некоторой степени изолированы от внешнего интернета. Да, порт 1883 сервер слушает по умолчанию, без указаний сверху. Но если не указывать listener, то принимать входящие подключения он будет только со своего IP, а всех остальных “пошлет лесом”. Подключения по WebSocket я тоже отключил, за ненадобностью. Итак:
# ================================================================= # Listeners # ================================================================= # Порт без SSL listener 1883 protocol mqtt
Далее пройдемся по общим настройкам. Некоторые параметры имеют те же самые значения “по умолчанию”, что и у меня. Смысл их указания в том, что в будущем после обновления значения “по умолчанию” могут и измениться, а указанием в файле я фиксирую их состояние. Но и огромное количество значений я не стал трогать.
# ================================================================= # General configuration # ================================================================= # Пользователь, от имени которого будет запущен mosquitto user mosquitto # Файл идентификатор запущенного сервиса pid_file /opt/var/run/mosquitto.pid # Разрешить сохраняемые сообщения retain_available true # Лимит кучи (оставил на будущее) memory_limit 0 # Разрешить подключение без указания идентификатора клиента allow_zero_length_clientid true auto_id_prefix auto- # Удалять подключения старше 1 месяца persistent_client_expiration 1m # Помещать сообщения QoS0 в очередь queue_qos0_messages false # Интервал публикации системной информации sys_interval 60
Лимит кучи для брокера я пока оставил без ограничений (0), но если в будущем окажется, что брокер выжирает всю доступную память на роутере, то придется умерить его аппетиты. Уменьшил интервал публикации системной информации, дабы сильно не грузить роутер почти бесполезными данными (по умолчанию 10 секунд).
Далее указываем, где брокер будет хранить базу данных. Указываем ему путь на ранее созданную папку:
# ================================================================= # Persistence # ================================================================= # Разрешить сохранение базы данных на диске persistence true # Каталог для хранения локальной базы данных persistence_location /opt/etc/mosquitto/persistence # Имя файла локальной базы данных persistence_file mosquitto.db # Интервал записи данных на диск в секундах autosave_interval 1800 # Сохранять по интервалу времени (true - по количеству изменений) autosave_on_changes false
Думаю, тут тоже всё понятно. Переходим к журналированию. На начальном этапе я включил несколько журналов: в консоль, в системный журнал роутера, в файл и в системные топики. После того, как настройка брокера будет завершена, вывод журналов в консоль и в файл имеет смысл отключить. Ибо консоль всё равно никто видеть не будет, а файл может неограниченно расти. Ну и количество типов событий можно существенно подсократить (в будущем).
# ================================================================= # Logging # ================================================================= # Вывод в консоль log_dest stdout # Вывод в системный лог роутера log_dest syslog # Вывод в файл log_dest file /opt/var/log/mosquitto.log # Вывод в системный топик log_dest topic # Какие типы сообщений следует писать в лог log_type error log_type warning log_type notice log_type information log_type subscribe log_type unsubscribe # Выводить в лог события подключения клиентов connection_messages true # Выводить в лог метку времени log_timestamp true log_timestamp_format %Y-%m-%d %H:%M:%S
Ну и последний этап (ну не совсем, а до первого запуска) – указываем, как будет происходить авторизация клиентов на сервере. Я выбрал самый простой вариант – по логину и паролю, без всяких там плагинов и сертификатов.
# ================================================================= # Security # ================================================================= #clientid_prefixes # Запретить анонимные подключения allow_anonymous false # Имя файла с данными пользователей и паролями password_file /opt/etc/mosquitto/mosquitto.users # Имя файла с правами доступа к топикам acl_file /opt/etc/mosquitto/mosquitto.acl
Добавляем все эти секции в файл, проверяем, сохраняем. В принципе, можно уже пробовать запускать брокер. Сделать это можно с помощью команды:
mosquitto -d -c /opt/etc/mosquitto/mosquitto.conf
Однако, если брокер уже был запущен, его нужно предварительно остановить. Чтобы не набирать команды каждый раз ручками, я набросал в Midnight Commander скриптик и дал ему права на выполнение:
#!/bin/sh PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin killall mosquitto mosquitto -d -c /opt/etc/mosquitto/mosquitto.conf
Назвать его можно как угодно, я обозвал без выкрутасов – restart. Очень экономит время при настройке. Действуйте по аналогии, как это описано выше для скрипта Smosquitto, можно даже просто создать копию с Smosquitto, а затем отредактировать.
Однако подключаться пока ещё рано, нужно вначале создать файл пользователей и добавить пользователей в список. Сделать это можно с помощью команды mosquitto_passwd:
mosquitto_passwd
mosquitto_passwd is a tool for managing password files for mosquitto.
Usage: mosquitto_passwd [-H sha512 | -H sha512-pbkdf2] [-c | -D] passwordfile username
mosquitto_passwd [-H sha512 | -H sha512-pbkdf2] [-c] -b passwordfile username password
mosquitto_passwd -U passwordfile
-b : run in batch mode to allow passing passwords on the command line.
-c : create a new password file. This will overwrite existing files.
-D : delete the username rather than adding/updating its password.
-H : specify the hashing algorithm. Defaults to sha512-pbkdf2, which is recommended.
Mosquitto 1.6 and earlier defaulted to sha512.
-U : update a plain text password file to use hashed passwords.
See https://mosquitto.org/ for more information.
Вам потребуется добавить как минимум одного пользователя в список пользователей брокера. С помощью этого аккаунта Вы будете подключаться к брокеру со смартфона и с Ваших устройств. Однако я настоятельно рекомендую Вам не ограничиваться одной учетной записью, а создать несколько разных учетных записей – отдельные учётки для смартфонов управления, и отдельные учётки для каждого из умных устройств. Во-первых при необходимости изменения единственного пароля (при утере смартфона, например), Вам придется поменять все пароли на всех устройствах сразу. А в случае разных учёток можно ограничится только удалением из списка скомпрометированной записи. Во-вторых, при разных учетных записях возможно настроить разные уровни доступа к топикам, что может быть полезно.
Первого пользователя добавляем с опцией создания нового файла ( -с ):
mosquitto_passwd -c -b /opt/etc/mosquitto/mosquitto.users логин пароль
Второго и последующего пользователя добавляем уже без этого флага:
mosquitto_passwd -b /opt/etc/mosquitto/mosquitto.users логин пароль
Пользователей можно добавить сколько угодно. В результате будет создан файл примерно такого содержания:
admin:$7$101$NUE9kyIRB4Ght9ub$qOzyqRAf5rRcVVddLoQbgplfRhbZFc8NLsrTy3jDsHli9Gq52cK6uSnRkQE0xHWKqNgYZV+sE27lv/Mzsm2phw== test:$7$101$KrJjxaCUf2QeC9xt$wb2TMbbfb3ZUGqELgYFFPePQfSO63ARbrhBH5+cHZjHAtKAnObBsnqDvvWCcbMZ0coxMkGvcjYScLv00Gl/6GA==
Теперь нужно создать файл с правами доступа к топикам. Утилиты для этого никакой нет, да её и не требуется – это простой текстовый файл. Создайте его в mc. В нем для каждого пользователя должно быть две строчки вида:
user test topic readwrite #
Более подробно можно прочитать в документации:
Списки управления доступом для конкретных тем добавляются после пользовательской строки следующим образом: user <username> topic [read|write|readwrite|deny] <topic> Упомянутое здесь имя пользователя такое же, как в password_file. Это не clientid. Тип доступа контролируется с помощью «чтение», «запись», «чтение-запись» или «запретить». Этот параметр является необязательным (если <topic> не содержит пробела) - если не задан, то доступ осуществляется на чтение / запись. <topic> может содержать подстановочные знаки + или #, как в подписках. Параметр «deny» может использоваться для явного отказа в доступе к теме, который в противном случае был бы предоставлен более широким оператором чтения / записи / чтения и записи. Любые запрещенные темы обрабатываются перед тем, которые предоставляют доступ для чтения / записи.
Итак, запускаем mc, переходим в каталог /opt/etc/mosquitto/, нажимаем клавиши shift+f4 (откроется пустое окно редактора), добавляем строки:
user admin topic readwrite # user test topic readwrite #
Этим самым мы дали полные права на все топики (пока так – потом я буду настраивать доступы гораздо более “тонко”). Далее нажимаем f2, на запрос имени файла вводим mosquitto.acl. Разумеется, имена пользователей должны соответствовать Вашим.
Перезапускаем брокер (скриптом или перезагрузкой роутера). Можно убедится, что всё хорошо, посмотрев файл журнала:
2021-05-09 08:26:43: mosquitto version 2.0.10 starting 2021-05-09 08:26:43: Config loaded from /opt/etc/mosquitto/mosquitto.conf. 2021-05-09 08:26:43: Opening ipv4 listen socket on port 1883. 2021-05-09 08:26:43: Opening ipv6 listen socket on port 1883. 2021-05-09 08:26:43: mosquitto version 2.0.10 running
Теперь можно попробовать подключиться со смартфона или компьютера под любым из созданных пользователей. На данном этапе используем “прямое” подключение на порту 1883. Если всё было сделано правильно, подключение будет успешно выполнено, а в файле журнала должны появится следующие строки:
2021-05-09 08:54:47: New connection from 192.168.8.73:41352 on port 1883. 2021-05-09 08:54:47: New client connected from 192.168.8.73:41352 as mqttdash-03b55403 (p2, c1, k30, u'admin'). 2021-05-09 08:54:49: Client mqttdash-03b55403 disconnected.
Ура! Заработало!
7. Добавляем возможность TLS-соединения
Как я уже говорил, в локальной сети TLS / SSL как бы не особо и нужен. Но он потребуется, если Вы захотите открыть порт брокера на роутере “наружу” (так называемый “проброс портов”) – в этом случае оставлять незащищенным канал управления умным домом, мягко говоря, рискованно. Да и внутри сети SSL-соединение не помешает. Я не буду подписывать созданный сертификат в центре сертификации CA, а создам самоподписанный сертификат (потому что “извне” подключаться к серверу не планирую. Однако Вы можете это сделать, например через LetsEncrypt.
1. Для начала нам необходимо установить утилиту OpenSSL:
~ # opkg install openssl-util Installing openssl-util (1.1.1k-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/openssl-util_1.1.1k-1_mipsel-3.4.ipk Installing libopenssl-conf (1.1.1k-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/libopenssl-conf_1.1.1k-1_mipsel-3.4.ipk Configuring libopenssl-conf. Configuring openssl-util. ~ #
2. Создаем каталог для хранения сертификатов и ключей. Поскольку это сертификат mosquitto, то логично расположить всё это хозяйство внутри /opt/etc/mosquitto. Создадим каталог /opt/etc/mosquitto/certs и перейдем в него:
~ # cd /opt/etc/mosquitto /opt/etc/mosquitto # mkdir certs /opt/etc/mosquitto # cd certs /opt/etc/mosquitto/certs #
3. Генерируем личный RSA ключ для личного “центра сертификации” (СА KEY) с помощью команды openssl genrsa -out mosq-ca.key 2048:
/opt/etc/mosquitto/certs # openssl genrsa -out mosq-ca.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ............................................+++++ .....................+++++ e is 65537 (0x010001) /opt/etc/mosquitto/certs #
Используя эту команду, мы создаем ключ длиной 2048 бит с именем mosq-ca.key (имя в принципе может быть другим)
4. Генерируем CA сертификат X509 (CA CERT), используя созданный CA ключ. Для этого выполните команду openssl req -new -x509 -days 999 -key mosq-ca.key -out mosq-ca.crt. Программа запросит данные страны, региона, организации и другие данные (некоторые можно оставить пустыми), после чего будет создан файл сертификата:
/opt/etc/mosquitto/certs # openssl req -new -x509 -days 999 -key mosq-ca.key -out mosq-ca.crt You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Russian Federation Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:kotyara12 Email Address []:kotyara12@yandex.ru /opt/etc/mosquitto/certs #
5. Генерируем личный RSA ключ для сервера (SERVER KEY) с помощью команды openssl genrsa -out mosq-serv.key 2048:
/opt/etc/mosquitto/certs # openssl genrsa -out mosq-serv.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ......................................................................................+++++ .................................................................+++++ e is 65537 (0x010001) /opt/etc/mosquitto/certs #
6. Создаем запрос на подпись сертификата сервера (SERVER CSR). Этот запрос должен быть отправлен в центр сертификации, который после проверки личности автора возвращает сертификат. В данном случае я не буду этого делать, а создам сертификат, подписанный “своим” центром сертификации.
/opt/etc/mosquitto/certs # openssl req -new -key mosq-serv.key -out mosq-serv.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Russian Federation Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:k12village_mosquitto Email Address []:kotyara12@yandex.ru Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:123456789 An optional company name []: /opt/etc/mosquitto/certs #
Как вы можете заметить, мы использовали закрытый ключ, сгенерированный на предыдущем шаге. Наконец, мы можем создать сертификат для использования на нашем сервере Mosquitto.
7. Создаем сертификат сервера (SERVER CERT), используя запрос на подпись сертификата и ранее созданный CA сертификат:
/opt/etc/mosquitto/certs # openssl x509 -req -in mosq-serv.csr -CA mosq-ca.crt -CAkey mosq-ca.key -CAcreateserial -out mosq-serv.crt -days 999 -sha256 Signature ok subject=C = RU, ST = Russian Federation, O = Internet Widgits Pty Ltd, CN = k12village_mosquitto, emailAddress = kotyara12@yandex.ru Getting CA Private Key /opt/etc/mosquitto/certs #
Готово. Сертификаты созданы. Конечно, этот сертификат не примет обычный браузер, но в некоторых mqtt-клиентах для android есть возможность использования самоподписанного сертификата (хотя в этом есть потенциальный риск, что сертификат может быть подменен). А для ESP это вообще не важно, так как в любом случае требуется указание корневого сертификата.
Можно проверить результаты, выполнив команду openssl x509 -in mosq-serv.crt -noout -text.
8. Корректируем права на доступ к файлам ключей пользователям.
Поскольку мы создавали ключи и сертификаты, залогинившись в терминала под пользователем root, то и права на доступ к папке и файлам будет только у пользователя root. А сервер у нас запускается под ограниченным пользователем mosquitto. Если сейчас попытаться перезапустить брокер, то он не сможет подгрузить ключи и выдаст серию ошибок типа “в доступе отказано”. Что ж, это довольно легко поправить, выполнив команду:
chmod 777 /opt/etc/mosquitto/certs -R
Ключ -R обозначает, что команду нужно выполнить рекурсивно, то есть для папки и всех вложенных подпапок и файлов.
9. Подключаем созданный сертификат к нашему серверу.
Осталось настроить mosquitto.conf. Для этого добавляем в секцию Listeners ещё одного слушателя:
# Порт SSL listener 8883 protocol mqtt cafile /opt/etc/mosquitto/certs/mosq-ca.crt certfile /opt/etc/mosquitto/certs/mosq-serv.crt keyfile /opt/etc/mosquitto/certs/mosq-serv.key
Добавить эти строки нужно после уже добавленного ранее listener 1883.
10. Перезапускаем брокер любым способом: командным файлом, вручную или перезагрузкой роутера и пробуем подключится.
2021-05-10 08:12:34: mosquitto version 2.0.10 starting 2021-05-10 08:12:34: Config loaded from /opt/etc/mosquitto/mosquitto.conf. 2021-05-10 08:12:34: Opening ipv4 listen socket on port 1883. 2021-05-10 08:12:34: Opening ipv6 listen socket on port 1883. 2021-05-10 08:12:34: Opening ipv4 listen socket on port 8883. 2021-05-10 08:12:34: Opening ipv6 listen socket on port 8883. 2021-05-10 08:12:34: mosquitto version 2.0.10 running
Настраиваем клиент для работы с самоподписанным сертификатом. Для этого можно либо подгрузить CA сертификат на смартфон, либо поставить галочку в свойствах подключения:
Настройка клиента MQTT Dash для работы с локальным брокером напрямую
и пробуем подключится:
2021-05-10 08:14:03: New connection from 192.168.8.73:48412 on port 8883. 2021-05-10 08:14:03: New client connected from 192.168.8.73:48412 as mqttdash-03b55403 (p2, c1, k30, u'admin'). 2021-05-10 08:14:05: Client mqttdash-03b55403 disconnected.
Отлично! Теперь можно пробросить порты 1883 и 8883 на роутере наружу и попытаться подключиться к нашему серверу извне. Если Вы имеете белый IP-адрес… Или попробовать подключиться через Keenetic DNS.
8. Пробрасываем порты для возможности подключения к брокеру извне
Важно! Переадресация портов будет работать только в том случае, если интернет-центр использует белый (публичный) IP-адрес для выхода в Интернет. Дополнительную информацию вы найдете в статье “В чем отличие “белого” и “серого” IP-адреса?”.
Заходим в панель управления роутером в раздел “Сетевые правила” – “Переадресация” и добавляем правило, как на рисунке ниже:
Проброс порта 8883 на роутере
Сохраняем. В настройках клиента меняем локальный адрес сервера “192.168.1.1” на тот, который Вам выдал Keenetic (что-то типа “xxx.keenetic.pro”) и пробуем подключиться. У меня всё заработало с первого раза. Единственное, что хотелось бы отметить – эту операцию нужно повторить для всех внешних сетевых интерфейсов, если их несколько (основной и резервный канал до интернета). Нужно ли дополнительно пробросить порт 1883 – решать только Вам. У меня получилось что-то вроде этого:
Проброс MQTT портов на роутере
Как видите, noSSL 1883 порты извне я всё-таки отключил, ибо небезопасно. А внутри локальной сети все будет работать и без SSL.
9. Настраиваем мост к внешнему MQTT серверу
Проброс портов это хорошо, но не слишком удобно. Особенно, если у Вас есть несколько локаций, на каждой из которых стоит свой роутер со своим локальным брокером. В этом случае свести данные с устройств на одну панель управления не получится. Гораздо удобнее настроить мост между нашим локальным брокером, и любым другим внешним облачным MQTT-брокером. В этом случае смартфоны управления мы будем настраивать на работу с облачным брокером, ESP – на работу с локальным адресом, ну а локальный брокер будет автоматически подключаться к нему и перенаправлять данные туда и обратно. Можно даже сделать сложную структуру так, чтобы данные вначале отправлялись на какой-либо “главный локальный” брокер, а затем уже на облачный брокер в интернете (правда я пока не знаю, зачем такое может быть нужно).
Мостов на внешние брокеры может быть несколько, каждое такое подключение должно иметь своё имя. Кстати, несколько мостов позволяет одновременно принимать данные с разных облачных брокеров, если ранее прошитые ESP по каким-то причинам невозможно переключить на другой брокер.
Прежде чем создавать мостовые соединения, хорошо бы создать отдельного локального пользователя, хотя в принципе можно обойтись и уже существующим. Для этого воспользуемся командой mosquitto_passwd, как мы это делали ранее:
mosquitto_passwd -b /opt/etc/mosquitto/mosquitto.users bridge 11111111
а затем не забудьте добавить права доступа на топики в /opt/etc/mosquitto/mosquitto.acl, для примера можно так:
user bridge topic readwrite #
Для создания мостового соединения необходимо добавить по крайней мере одну новую запись mosquitto.conf в секцию Bridges:
# ================================================================= # Bridges # ================================================================= # Имя мостового соединения connection wqtt_ru # Имя сервера и порт для внешнего брокера address x65535.wqtt.ru:1003 # Какие топики и в каком направлении следует пересылать: в данном случае всё (только для примера, в раельном соединении не рекомендуется: может вызвать зацикливание) topic # both # Тип запуска: автоматический start_type automatic # Версия протокола (мой удаленный брокер требует этот протокол) bridge_protocol_version mqttv311 # Если установлено true, публиковать уведомления для локальных и удаленных брокеров с информацией о состоянии мостового соединения notifications true # Параметры локального подключения local_clientid bridge_local local_username bridge local_password 11111111 # Параметры удаленного подключения remote_clientid bridge_remote remote_username U_WQTT_RU remote_password 22222222 # Отписываться на внешнем брокере от тем "наружу" bridge_attempt_unsubscribe true # Чистая сессия отключена cleansession false # Интервал поддержания соединения в секундах keepalive_interval 60 # Интервал, после которого неактивный мост будет остановлен idle_timeout 600
Разумеется, имя сервера, порт, имена пользователей и пароли Вы предварительно должны заменить на свои!
Перезапускаем локальный брокер, проверяем. Работает! Но – без SSL, что не есть гуд.
10. Настройка моста на работу через SSL
Для работы SSL необходим сертификат удаленного сервера, точнее корневой сертификат удостоверяющего центра, с которого по цепочке будут проверены все остальные сертификаты. На роутере сертификат удостоверяющего центра для wqtt.ru уже имеется в каталоге /etc/ssl/certs под именем ISRG_Root_X1.crt, так что ничего скачивать и генерировать не потребуется. Мало того, роутер сам позаботится об его обновлении, когда необходимо. Осталось немного подкорректировать файл конфигурации:
...... # Имя сервера и порт для внешнего брокера: здесь меняем порт на SSL address x65535.wqtt.ru:1004 # Сертификат CA (корневой в цепочке сертификатов) внешнего брокера bridge_cafile /etc/ssl/certs/ISRG_Root_X1.crt ......
Перезапускаем брокер, проверяем. Connecting bridge wqtt_ru (x65535.wqtt.ru:1004), всё в порядке.
Поздравляю, Вы только что настроили свой личный MQTT сервер с SSL, бесплатно и навсегда!
Ну и напоследок могу порекомендовать выделить для IoT устройств отдельную сеть с отдельным диапазоном адресов, так как медленные ESP8266 в общей сети как-то умудрялись тормозить всю wifi сеть. После выделения и переподключения их в отдельный сегмент, проблема ушла.
На этом пока всё, до встречи на сайте и на telegram-канале!. Если Вам понравилась статья – кликните на любое рекламное объявление, этого будет вполне достаточно для поддержки автора.
🔶 Полный архив статей вы найдете здесь
Home Assistant — это открытая платформа для умного дома, которая позволяет контролировать и автоматизировать различные устройства и сервисы. Один из самых популярных способов установить Home Assistant — это запустить его на домашнем роутере Keenetic. В этом практическом руководстве мы расскажем, как установить Home Assistant на роутер Keenetic и начать использовать его для управления умным домом.
Перед установкой Home Assistant на роутер Keenetic, вам понадобится следующее:
- Установленный и настроенный роутер Keenetic.
- Базовые знания работы с роутером и сетевыми протоколами.
- Доступ к интернету и аккаунт на сайте Keenetic.
Начнем с загрузки и установки Home Assistant. Войдите в систему управления вашим роутером Keenetic и перейдите на вкладку «Дополнительно». Затем выберите «Установка программ» и найдите Home Assistant в списке доступных программ. Нажмите на кнопку «Установить», чтобы запустить процесс установки.
Примечание: перед установкой Home Assistant убедитесь, что ваш роутер Keenetic поддерживает эту программу. Некоторые старые модели роутеров могут быть несовместимы с Home Assistant.
После завершения установки Home Assistant на роутер Keenetic, вам будет предоставлена возможность настроить его. Выберите язык, укажите имя пользователя и пароль для доступа к Home Assistant. Затем следуйте инструкциям на экране, чтобы настроить подключение к устройствам вашего умного дома.
Поздравляю! Теперь у вас установлен и настроен Home Assistant на роутере Keenetic. Вы можете начать добавлять устройства и настраивать автоматизацию в вашем умном доме. Удивительные возможности Home Assistant ждут вас!
Содержание
- Установка Home Assistant на роутер Keenetic
- Шаг 1: Подготовка
- Шаг 2: Установка Docker
- Шаг 3: Установка Home Assistant
- Шаг 4: Автозапуск Home Assistant
- Заключение
- Практическое руководство для установки Home Assistant на роутер Keenetic
- Шаг 1: Подготовка роутера Keenetic
- Шаг 2: Установка Home Assistant на роутер
- Шаг 3: Настройка Home Assistant
- Вывод
- Сайт Keenetic: доступ к дополнительным функциям через установку Home Assistant
Установка Home Assistant на роутер Keenetic
В этой статье мы расскажем, как установить Home Assistant на роутер Keenetic. Обратите внимание, что этот процесс может иметь некоторые особенности в зависимости от модели вашего роутера, поэтому убедитесь, что вы используете подходящую инструкцию.
Шаг 1: Подготовка
Перед установкой Home Assistant на роутер Keenetic вам понадобится:
- Установить на роутер прошивку с поддержкой Docker. Это можно сделать, следуя инструкциям производителя.
- Подключиться к роутеру по SSH. Для этого вам понадобится программа для работы с SSH, такая как PuTTY, и права администратора на роутере.
Шаг 2: Установка Docker
После подготовки вы можете приступить к установке Docker на роутер Keenetic. Для этого выполните следующие шаги:
- Откройте программу для работы с SSH и подключитесь к роутеру.
- Введите следующую команду, чтобы загрузить и установить Docker:
sudo su
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
- После установки Docker выполните команду:
sudo groupadd docker
sudo usermod -aG docker $USER
Теперь Docker установлен на вашем роутере Keenetic.
Шаг 3: Установка Home Assistant
Теперь, когда у вас есть Docker, вы можете установить Home Assistant на роутер Keenetic. Для этого выполните следующие шаги:
- Откройте программу для работы с SSH и подключитесь к роутеру.
- Введите следующую команду, чтобы загрузить и установить Home Assistant:
sudo docker run -d --name="homeassistant" -v /opt/homeassistant:/config -v /etc/localtime:/etc/localtime:ro --net=host homeassistant/home-assistant:stable
После выполнения этой команды Home Assistant будет установлен на роутер Keenetic. Вы можете открыть веб-браузер и перейти по адресу http://<IP_адрес_роутера>:8123, чтобы настроить и использовать Home Assistant.
Шаг 4: Автозапуск Home Assistant
Чтобы Home Assistant запускался автоматически при включении роутера, выполните следующие шаги:
- Откройте программу для работы с SSH и подключитесь к роутеру.
- Введите следующую команду, чтобы отредактировать файл запуска:
sudo nano /opt/etc/init.d/rc.unslung
- Добавьте следующую строку в файл перед строкой, которая начинается с
exit 0:
/opt/homeassistant/run.sh start
- Нажмите клавиши
Ctrl+X, затемYиEnter, чтобы сохранить изменения.
Теперь Home Assistant будет запускаться автоматически при включении роутера Keenetic.
Заключение
В этой статье мы рассмотрели, как установить Home Assistant на роутер Keenetic. Теперь у вас есть возможность контролировать и автоматизировать свои устройства через один интерфейс. Удачной работы с Home Assistant!
Практическое руководство для установки Home Assistant на роутер Keenetic
Шаг 1: Подготовка роутера Keenetic
Перед установкой Home Assistant на роутер необходимо убедиться, что на роутере установлена прошивка KeeneticOS. Если на роутере не установлена прошивка KeeneticOS, необходимо обновить прошивку до последней версии по инструкции, предоставленной на официальном сайте Keenetic.
Шаг 2: Установка Home Assistant на роутер
1. Зайдите в веб-интерфейс роутера Keenetic, введя в адресной строке браузера IP-адрес роутера.
2. Войдите в веб-интерфейс, используя логин и пароль администратора.
3. На странице настроек роутера найдите раздел «Плагины» или «Add-ons» и выберите его.
4. В разделе «Плагины» выберите опцию «Установить плагин» или «Install Add-on».
5. В поисковой строке введите «Home Assistant» и выберите плагин «Home Assistant» из списка результатов.
6. Нажмите на кнопку «Установить» или «Install» для установки плагина Home Assistant.
7. Дождитесь завершения процесса установки, который может занять некоторое время.
8. После завершения установки плагина Home Assistant, вы увидите значок Home Assistant на странице настроек роутера.
Шаг 3: Настройка Home Assistant
1. Нажмите на значок Home Assistant на странице настроек роутера, чтобы открыть веб-интерфейс Home Assistant.
2. Следуйте инструкциям на экране для настройки Home Assistant, включая создание учетной записи пользователя и настройку подключения к сетевым устройствам.
3. После завершения настройки Home Assistant, вы сможете управлять устройствами и создавать сценарии автоматизации через веб-интерфейс.
Вывод
Установка Home Assistant на роутер Keenetic позволяет получить удобный интерфейс для управления устройствами умного дома. Следуя данному практическому руководству, вы сможете настроить и использовать Home Assistant на роутере Keenetic без особых трудностей.
Сайт Keenetic: доступ к дополнительным функциям через установку Home Assistant
Сайт Keenetic предоставляет возможность установить Home Assistant на роутер и получить доступ к его дополнительным функциям. Это позволяет пользователям управлять умным домом, собирать и анализировать данные, настраивать автоматизацию и многое другое.
Установка Home Assistant на роутер Keenetic происходит в несколько простых шагов:
- Настройка роутера и установка необходимых пакетов.
- Загрузка и установка Home Assistant на роутер.
- Настройка пользовательского интерфейса и добавление устройств.
- Настройка автоматизации и интеграция с другими сервисами.
После установки Home Assistant пользователи получают доступ к множеству функций, которые позволяют управлять и контролировать устройства и сервисы:
- Управление умным домом: включение и выключение света, регулирование температуры, управление секционными воротами и многое другое.
- Мониторинг и анализ данных: получение информации о потребляемой энергии, состоянии устройств, температуре и влажности в помещении и т. д.
- Настройка автоматизации: создание различных сценариев, регулирование освещения в определенное время, включение отопления перед приходом домой и т. д.
- Интеграция с другими сервисами: возможность обмена данными с другими системами умного дома, интеграция с голосовыми помощниками и т. д.
Установка Home Assistant на роутер Keenetic предоставляет пользователям удобный и гибкий способ управления умным домом и обеспечивает возможность интеграции с другими сервисами и устройствами. Сайт Keenetic предоставляет необходимую информацию и руководства для установки и настройки Home Assistant, что делает процесс максимально простым и понятным.
Самый простой и удобный протокол для управления различными “умными” устройствами, на мой взгляд – это MQTT. На этом сайте Вы можете найти перечень публичных облачных MQTT-серверов (брокеров), с помощью которых можно связать один или несколько микроконтроллеров с устройствами управления (например смартфоном) или даже между собой. Но использование только публичных MQTT-брокеров не всегда удобно, например когда требуется обмен информацией между разными микроконтроллерами в пределах одной локации. Например: у меня на даче сведения о уличной температуре и влажности собирает гаражная метеостанция, а использует эти данные не только она, но и множество других устройств – управление вентиляцией, отоплением, подогревом погреба и т.д. Конечно, можно натекать на каждое устройство свои автономные “уличные” датчики, но это лишние датчики, провода, выводы; да и датчик далеко не всегда можно разместить так, чтобы он давал правильные показания. А через MQTT брокер это сделать не сложно – нужно только подписаться на любом устройстве на данные метеостанции и всё, получай данные. Проблемы начинаются, когда пропадает доступ к сети интернет, и это бывает к сожалению, не редко. В таком случае устройства уже не могут обмениваться информацией между собой и вся схема рушится. Если с погодными данными можно как-то смирится, то данные о срабатывании охранных и аварийных сенсоров должны распространяться между устройствами практически мгновенно. Очевидное решение описанной проблемы – использовать локальный брокер. Вторая причина, по которой стоит установить свой личный брокер – временные задержки при обмене информацией между устройствами. И третья не очень очевидная выгода от использования локального брокера – возможность избавиться от необходимости создания защищенного (TLS) соединения между устройствами и сервером, ведь эти подключения будут происходить только за NAT-ом. Недостаток тоже имеется – “просто так” подключиться со смартфона к локальному брокеру вне сети не получится, но эту проблему можно решить.
1. На базе Raspberry Pi. Самый очевидный вариант. Можно довольно просто развернуть на “малинке” образ какого-нибудь linux-а, установить mosquitto или его аналог и пользоваться в свое удовольствие. Мощности малинки хватит с запасом. А как вариант можно развернуть на ней полноценную систему “умного дома” типа Home Assistant (или другую, вариантов много), тогда Вы автоматически получаете связанный с умным домом MQTT-брокер, и “велосипед изобретать” не потребуется. Но мне “умный дом” не приглянулся вовсе, я предпочитаю создавать маленькие автономные устройства, решающие четко ограниченные задачи; а объединять их все только на уровне панели управления MQTT. Кроме того, в этом варианте меня напрягла необходимость покупать и постоянно кормить электричеством (хоть и относительно немного) отдельное устройство.
2. На базе ESP8266. Существует проект esp_mqtt, который позволяет создать на базе ESP8266 маленький MQTT-брокер. Достоинства: маленький размер и малое энергопотребление. Правда и ограничений в этом случае довольно много – в частности по количеству клиентов и хранимых сообщений. Можно наплодить из ESP целую кучку таких брокеров и создать разветвленную сеть. Я рассматривал это как “запасной вариант”.
2. На базе домашнего роутера. Но зачем покупать лишнее устройство, если можно поставить MQTT брокер на домашний роутер, ведь роутер всё равно нужен и к тому же работает круглые сутки. Существуют прошивки для многих роутеров на базе OpenWRT, куда можно поставить что угодно. Правда мне не хотелось перепрошивать свой роутер кастомной прошивкой, ведь в случае ошибки можно превратить роутер в кирпичик с лампочками. Да и, судя по отзывам, OpenWRT не всегда так удобна, как родная прошивка роутера. Но сейчас на Keenetic-и добавили поддержку “Менеджера пакетов OPKG“, и теперь не требуется перепрошивать роутер, чтобы получить возможность устанавливать на него дополнительные пакеты. OPKG — это свободно распространяющийся менеджер пакетов для встраиваемых систем. Вот этой возможностью мы и воспользуемся.
Что потребуется
1. Роутер Keenetic с поддержкой OPKG. Насколько я понял из официальной инструкции, это могут быть следующие модели: Keenetic Omni (KN-1410), Keenetic Extra (KN-1710/1711), Keenetic Giga (KN-1010), Keenetic Ultra (KN-1810), Keenetic Viva (KN-1910), Keenetic Giant (KN-2610), Zyxel Keenetic II / III, Zyxel Keenetic Extra, Zyxel Keenetic Extra II, Zyxel Keenetic Giga II / III, Zyxel Keenetic Omni, Zyxel Keenetic Omni II, Zyxel Keenetic Viva, Zyxel Keenetic Ultra, Zyxel Keenetic Ultra II, а также Keenetic DSL (KN-2010), Duo (KN-2110) и Zyxel Keenetic DSL, LTE, VOX.
Следует иметь в виду, что младшие модели с небольшим объемом RAM и слабым процессором могут просто не потянуть дополнительную нагрузку в виде mosquitto, особенно если роутер уже нагружен большим объемом передаваемого трафика. У меня уже имелся достаточно мощный Keenetic Giga с двухядерным процессором и 256MB RAM. Старый Keenetic 4G не тянул не только OPKG, но даже и кастомную OpenWRT. Поэтому, когда пришло время менять роутер на даче, я даже не задумывался, какую модель выбрать – купил точно такую же Giga. Да, это достаточно дорогой выбор, но “любишь кататься, люби и бензин покупать”… Поэтому процесс установки будет описан именно для нее. Думаю, что для других моделей Keenetic процесс установки практически не будет отличаться от описанного.
PS: Я вполне допускаю, что роутеры других производителей ещё круче и лучше, и так же допускают установку пакетов OpenWRT “из коробки” – но эта статья не про них.
2. USB-накопитель с разделом ext4. Я купил себе крохотную флешку на 32Gb, дабы не сильно торчала из корпуса роутера. Для создания раздела ext4 в системе Windows для этого можно воспользоваться бесплатным приложением MiniTool Partition Wizard Free. Процесс подготовки подробнее будет описан ниже.
Это всё, что требуется. Плюс немного мысленных усилий и гугла в помощь. Приступаем.
1. Устанавливаем необходимые компоненты
Заходим в панель управления (“админку”) роутера. Находим раздел “Управление” – “Общие настройки” – “Обновления и компоненты”. Нажмите кнопку “Изменить набор компонентов”:
Установка необходимых компонентов
Что потребуется установить:
- Пакеты OPKG / Поддержка открытых пакетов – Система управления пакетами на основе OPKG. Основной компонент, что нам требуется.
- Пакеты OPKG / Модули ядра для поддержки файловых систем – Поддержка различных файловых систем для OPKG.
- USB-накопители / Файловая система Ext – Необходим для работы с файловой системой Ext на USB-накопителях.
- USB-накопители / Общий доступ к файлам и принтерам (TSMB CIFS) – Предоставляет доступ к USB-накопителям и принтерам для компьютеров под управлением Windows. необходим будет, чтобы иметь возможность подключаться к флешке по сети и копировать на нее или с нее файлы, редактировать файл конфигурации mosquito.
- Базовые компоненты / Сервер SSH – Позволяет безопасно подключаться к командной строке устройства. Это нам потребуется. Я не на 100% уверен, что именно этот компонент будет задействован впоследствии, по подключаться к командной строке придется. Поэтому лучше поставить, не убудет.
Остальные компоненты – по желанию и необходимости (если Вы ещё ничего не меняли). Не забываем нажать кнопку “Установить обновление” внизу, ждем несколько минут, пока роутер скачает необходимые пакеты, установит их и перезагрузится. А в это время можно заняться подготовкой USB-накопителя…
2. Подготавливаем USB-накопитель
Как я уже написал выше, для установки OpenWRT-пакетов на Keenetic необходимо предварительно подготовить внешний USB-накопитель и установить на него систему пакетов репозитория Entware. Повторю здесь цитату из официальной инструкции: Для использования пакетов OPKG необходим USB-накопитель, подключенный к интернет-центру. Диск должен быть отформатирован в файловой системе EXT. Мы рекомендуем использовать современную и актуальную журналируемую файловую систему EXT4. Для работы накопителей с EXT4 в роутере Keenetic должен быть установлен компонент “Файловая система Ext”.
Небольшое примечание: в инструкции по установке Asterisk на роутер настойчиво рекомендуют использовать файловую систему EXT2, чтобы снизить износ Flash-памяти. Хм, теперь я не уверен в том, что EXT4 это оптимальный выбор для OPKG, но все-таки я отформатировал флешку, как описано в “основной” инструкции. Какую ФС предпочтете Вы – решать Вам. Я не думаю, что с EXT2 OPKG будет хуже работать.
Небольшая сложность здесь в том, что Windows сама по себе не умеет работать с файловыми системами EXT. Для подготовки потребуется дополнительная программа MiniTool Partition Wizard Free или аналогичная. Скачиваем, устанавливаем, запускаем. Вставляем накопитель в USB-разъем, находим в списке нужный раздел, и запускаем его форматирование как EXT4, примерно как показано на рисунке ниже:
Форматирования раздела в EXT4
Не забудьте нажать кнопку “Apply” слева внизу (применить внесенные изменения). Ждем, довольно долго… 32GB форматируется больше получаса. После форматирования Windows “не видит” эту флешку, так что на нее напрямую ничего скопировать не получится. Вставляем подготовленную флешку в порт Keenetic-а. Заходим в интерфейс Keenetic и убедимся, что накопитель доступен. Для этого необходимо отрыть раздел “Управление” – “Приложения“:
Проверяем успешное монтирование диска
Теперь нужно подключить этот накопитель к приложению “Сеть Windows“, дабы иметь возможность скопировать на него файлы по сети. Находим приложение “Сеть Windows” на этой же странице, только ниже и кликаем по его названию:
Активируем приложение “Сеть Windows”
Убедимся, что доступ к диску по сети имеется, при необходимости можно настроить доступ с помощью кнопки “Добавить общий ресурс”:
Настройка приложения “Сеть Windows”
На компьютере с помощью файлового менеджера открываем диск по сети (в ОС Windows можно использовать Проводник) “Сеть > Ваш Роутер > Ваш ресурс” и убеждаемся, что всё успешно работает.
Так выглядит пока ещё пустой USB-диск на роутере
Можно приступать настройке OPKG и установке системы пакетов репозитория Entware.
3. Установка репозитория Entware на USB-накопитель
Инструкция на сайте keenetic. Для моделей Omni (KN-1410), Extra (KN-1710/1711), Giga (KN-1010), Ultra (KN-1810), Viva (KN-1910), Giant (KN-2610) и Zyxel Keenetic II / III, Extra, Extra II, Giga II / III, Omni, Omni II, Viva, Ultra, Ultra II используйте для установки архив mipsel – mipsel-installer.tar.gz.
Для моделей DSL (KN-2010), Duo (KN-2110) и Zyxel Keenetic DSL, LTE, VOX используйте для установки архив mips – mips-installer.tar.gz
У меня Giga (KN-1010), поэтому я скачиваю первый вариант. Затем в корне раздела диска необходимо создать директорию install, куда скопировать скачанный файл mipsel-installer.tar.gz. Внимание: регистр символов важен! Не Install, и не INSTALL, а именно install.
Создаем папку install на USB-диске на роутере
В веб-интерфейсе роутера перейдите на страницу “Настройка” – “OPKG” для выбора накопителя. Выберите накопитель, в поле “Сценарий initrc” добавьте opt/etc/init.d/rc.unslung, после чего сохраните изменения.
Настройка OPKG
После нажатия кнопки “Сохранить” роутер зависнет на пару минут, это нормально. После этого перейдите на страницу “Диагностика” и откройте Системный журнал роутера (кнопкой “Показать журнал”). В нем вы должны увидеть следующие записи:
Системный журнал
PS: Официальная инструкция: Установка системы пакетов репозитория Entware на USB-накопитель.
4. Настройка репозитория Entware
Для дальнейшей настройки нам понадобится SSH-клиент, например PUTTY для работы с протоколами SSH и Telnet. Если он у Вас ещё не установлен, то скачиваем и устанавливаем. Дальнейшие действия рассматриваются на его примере.
Запускаем, выбираем режим SSH, указываем адрес Вашего роутера (у меня он несколько “нестандартный”, так как несколько роутеров объединены в сеть) и порт 222, как на рисунке:
PUTTY
На страшный запрос о добавлении сертификата сервера в кеш обязательно отвечаем “Да”, после чего появится черное-черное окно терминала в черной-черной комнате. На запрос login as вводим root, на запрос пароля вводим keenetic (в пароле вводимые символы никак не отображаются):
login as: root root@192.168.111.1's password: keenetic
После чего мы попадаем в командный интерфейс:
Терминал Entware
Первым делом необходимо сменить пароль доступа к терминалу Entware. Примечание: пользователь root в интерфейсе самого роутера нигде не участвует, он необходим только для доступа к Entware. Для этого введите команду passwd и дважды введите новый пароль:
Смена пароля
Теперь можно обновить opkg-пакеты, для этого введите команду opkg update:
~ # opkg update Downloading http://bin.entware.net/mipselsf-k3.4/Packages.gz Updated list of available packages in /opt/var/opkg-lists/entware Downloading http://bin.entware.net/mipselsf-k3.4/keenetic/Packages.gz Updated list of available packages in /opt/var/opkg-lists/keendev ~ #
Для удобства настройки сразу установим Midnight Commander, с помощью него многие операции можно выполнить существенно проще. Для этого следует выполнить команду opkg install mc:
~ # mc -sh: mc: not found ~ # opkg install mc Installing mc (4.8.26-1b) to root... Downloading http://bin.entware.net/mipselsf-k3.4/mc_4.8.26-1b_mipsel-3.4.ipk .... Configuring libiconv-full. .... Configuring mc. ~ # mc
Midnight Commander
На этом подготовку к установке MQTT-брокера можно считать завершенной.
5. Установка Mosquitto
Находим нужный нам пакет. Полный список пакетов можно найти здесь:
Основной список пакетов для mipsel Дополнительный список пакетов Keenetic для mipsel
Открываем основной список, в строке фильтра вводим mqtt и смотрим результаты:
Находим пакеты для сервера mosquitto
Нам нужен пакет для сервера mosquitto, их два: простая версия (nossl) и защищенная (ssl). Я выбрал второй вариант. Для установки пакета вводим команду opkg install mosquitto-ssl и ждем завершения:
~ # opkg install mosquitto-ssl Installing mosquitto-ssl (2.0.10-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/mosquitto-ssl_2.0.10-1_mipsel-3.4.ipk Installing zlib (1.2.11-3) to root... Downloading http://bin.entware.net/mipselsf-k3.4/zlib_1.2.11-3_mipsel-3.4.ipk Installing libopenssl (1.1.1k-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/libopenssl_1.1.1k-1_mipsel-3.4.ipk Installing libcap (2.48-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/libcap_2.48-1_mipsel-3.4.ipk Installing libwebsockets-openssl (4.1.6-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/libwebsockets-openssl_4.1.6-1_mipsel-3.4.ipk Installing cJSON (1.7.14-3) to root... Downloading http://bin.entware.net/mipselsf-k3.4/cJSON_1.7.14-3_mipsel-3.4.ipk Configuring libcap. Configuring zlib. Configuring libopenssl. Configuring libwebsockets-openssl. Configuring cJSON. Configuring mosquitto-ssl. ~ #
Установка выполнена, переходим к настройке.
6. Настройка Mosquitto
Файл конфигурации mosquitto находится в каталоге /opt/etc/mosquitto/ и называется mosquitto.conf. В большинстве инструкции авторы советуют оставить этот файл неизменным, а все настройки выполнять в отдельном файле (прилинковав его к первому), мотивируя это тем, что так удобнее (на самом деле так решил только первый, настоящий автор, а остальные просто тупо скопипастили, не задумываясь). Мне этот подход показался не удобным и я сделал по другому – оригинальный файл скопировал с переименованием в mosquitto.default (дабы иметь возможность вернуть оригинал, если накосячу), а все настройки выполнял в основном файле, попутно переводя транслейтом не совсем понятные мне места.
1. Вначале стоит добавить пользователя, от имени которого будет запускаться mosquitto. Негоже запускать его от имени root, так как это ведет к снижению уровня безопасности всего роутера. Для добавления нового пользователя в консоли вводим команду adduser mosquitto, а затем два раза вводим пароль:
~ # adduser mosquitto Changing password for mosquitto New password: *********** Bad password: too weak Retype password: *********** passwd: password for mosquitto changed by root ~ #
После чего в файле конфигурации mosquitto.conf необходимо раскомментировать строку General configuration / user mosquitto:
# When run as root, drop privileges to this user and its primary # group. # Set to root to stay as root, but this is not recommended. # If set to "mosquitto", or left unset, and the "mosquitto" user does not exist # then it will drop privileges to the "nobody" user instead. # If run as a non-root user, this setting has no effect. # Note that on Windows this has no effect and so mosquitto should be started by # the user you wish it to run as. user mosquitto
Перезапускаем роутер. Снова подключаемся к роутеру по SSH и пробуем запустить mosquitto командой mosquitto -c /opt/etc/mosquitto/mosquitto.conf -d, после чего проверяем успешность запуска с помощью команды ps:
~ # mosquitto -c /opt/etc/mosquitto/mosquitto.conf -d
~ # ps
PID USER VSZ STAT COMMAND
1 root 1100 S init
.........................
1079 mosquitt 7264 S mosquitto -c /opt/etc/mosquitto/mosquitto.conf -d
1080 root 3880 R ps
Здесь важно убедится, что сервер нормально запустился под только что созданным пользователем. Если это не так (сервер пишет, что пользователь mosquitto не найден), то можно попробовать обходной путь из этой статьи. Однако на новой версии у меня всё заработало без танцев с бубном.
2. Добавляем mosquitto в автозагрузку при включении или перезапуске роутера. Для этого необходимо создать скрипт в каталоге /opt/etc/init.d с названием Smosquitto. Префикс “S” означает, то данный скрипт будет включён в автозапуск (префикс “K” означает, то данный скрипт будет исключён из автозапуска). Удобнее всего это сделать с помощью mc:
Создание скрипта автозапуска
Для этого запускам mc, переходим в каталог /opt/etc/init.d, нажимаем клавиши shift+f4 (открывается пустой файл) и вставляем следующие строки:
#!/bin/sh PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin mosquitto -d -c /opt/etc/mosquitto/mosquitto.conf
Затем сохраняем файл с помощью клавиши f2, указав имя файла Smosquitto. Как вариант, можно сделать это по сети. Затем нужно сделать этот скрипт исполняемым командой chmod +x /opt/etc/init.d/Smosquitto.
3. Создаем рабочие каталоги или разрешаем доступ к уже существующим. Для нормальной работы mosquitto потребуется иметь доступ на запись как минимум в два каталога (а на первых порах лучше в три). Поскольку мы будем запускать брокер от пользователя с “не root”, права на доступ к файлам и папкам у него будут минимальными – только на чтение (по большей части, исключение составляет каталог пользователя). Поэтому придется вначале вручную создать необходимые директории и разрешить пользователю mosquitto доступ к ним.
Я создал следующую структуру каталогов (возможно, она не является оптимальной, Вы можете изменить по своему вкусу):
- /opt/etc/mosquitto [чтение и выполнение] – Этот каталог будет создан автоматически при установке. Здесь находятся файл конфигурации, позже я добавил файл со списком пользователей, файл со списком разрешений, служебные скрипты (перезапуск например). Ничего дополнительно настраивать не требуется.
- /opt/etc/mosquitto/persistence [полный доступ, владелец] – Этот каталог предназначен для хранения базы данных брокера. Можно, конечно, обойтись и без этого, но тогда все retained сообщения будут потеряны при случайной перезагрузке роутера или отключении электричества. Для того, чтобы брокер мог беспрепятственно создавать файлы и писать туда данные, дадим полный доступ.
- /opt/var/log [чтение, запись и поиск (выполнение)] – сюда будем писать журнал. На первых порах он гораздо удобнее системного журнала. Потом, когда всё отлажено, чтобы не следить за размером файла, можно оставить вывод сообщений только в системный журнал роутера. Хотя, в принципе, ничто не мешает писать логи в другой каталог, например /opt/etc/mosquitto/log
- /opt/var/run [чтение, запись и поиск (выполнение)] – а в этом каталоге сервер сохраняет pid-файл, который определяет, запущен процесс или нет. Сюда же роутер пишет другой похожий файл, так что здесь ему самое место.
Обратите внимание! Для всех пакетов OPKG все директории обязательно должны начинаться с /opt/!
Приступаем к настройке каталогов и раздаче прав. С собственно /opt/etc/mosquitto делать ничего не требуется – пользователь mosquitto по умолчанию имеет права на чтение и выполнение, а большего и не нужно. Переходим в этот каталог, создаем новый persistence и назначаем ему нового владельца:
~ # cd /opt/etc/mosquitto ~ # mkdir persistence ~ # chown -R :mosquitto persistence ~ # chown -R mosquitto persistence
Менять владельца требуется, так как мы зашли в SSH-терминал под пользователем root, а доступ нужно дать пользователю mosquitto. Поэтому при создании каталога владельцем автоматически станет тот, кто его создал (я тебя породил, я тебя и убью, да-да, именно так). Можно ограничится chmod 777, но я решил сделать кардинально.
Теперь проверьте, существуют ли каталоги /opt/var/log и /opt/var/run. Если их ещё нет, создайте. Проще и удобнее всего это сделать с помощью mc (Midnight Commander). После этого необходимо дать полные права на эти каталоги:
~ # chmod 777 /opt/var/log ~ # chmod 777 /opt/var/run
Тут уж ничего не поделаешь – изменять владельца нельзя, добавить только пользователя mosquitto (как это можно сделать в виндах) – тоже. Ограничится только чтением + записью тоже не удалось (файлы не создавались). Пришлось давать все права и всем (777).
Альтернативный вариант, предложенный в комментариях. Можно попробовать выполнить следующие команды:
~ # touch /opt/var/run/mosquitto.pid ~ # touch /opt/var/log/mosquitto.log ~ # chown mosquitto:mosquitto /opt/var/run/mosquitto.pid ~ # chown mosquitto:mosquitto /opt/var/log/mosquitto.log
С одной стороны, это более правильный вариант. Команда touch создает пустой файл, затем с помощью команды chown меняем владельца данного файла на mosquitto. Единственный момент – после того, как любой из файлов будет удален “вручную” (например из-за большого размера файла журнала), потребуется вновь повторить данные команды.
4. Настраиваем mosquitto.conf. Файл конфигурации mosquitto.conf я полностью очистил и заполнил только теми значениями, которые я изменял. Просто “выдергивал” из заранее скопированного в отдельную папку “дефлотного” нужные мне параметры и вставлял в основной файл. Можно править этот файл по сети, но нужно иметь в виду что файл должен быть в кодировке UTF-8 с BOM. Можно править файл с помощью mc прямо в консоли роутера.
Первым делом нужно указать, на каком порту сервер будет “слушать” входящие подключения. Пока оставим один порт – 1883, без TLS. Честно говоря, в локальной сети TCP + TLS не очень то и требуется, ведь все соединения происходят только внутри за NAT-ом и в некоторой степени изолированы от внешнего интернета. Да, порт 1883 сервер слушает по умолчанию, без указаний сверху. Но если не указывать listener, то принимать входящие подключения он будет только со своего IP, а всех остальных “пошлет лесом”. Подключения по WebSocket я тоже отключил, за ненадобностью. Итак:
# ================================================================= # Listeners # ================================================================= # Порт без SSL listener 1883 protocol mqtt
Далее пройдемся по общим настройкам. Некоторые параметры имеют те же самые значения “по умолчанию”, что и у меня. Смысл их указания в том, что в будущем после обновления значения “по умолчанию” могут и измениться, а указанием в файле я фиксирую их состояние. Но и огромное количество значений я не стал трогать.
# ================================================================= # General configuration # ================================================================= # Пользователь, от имени которого будет запущен mosquitto user mosquitto # Файл идентификатор запущенного сервиса pid_file /opt/var/run/mosquitto.pid # Разрешить сохраняемые сообщения retain_available true # Лимит кучи (оставил на будущее) memory_limit 0 # Разрешить подключение без указания идентификатора клиента allow_zero_length_clientid true auto_id_prefix auto- # Удалять подключения старше 1 месяца persistent_client_expiration 1m # Помещать сообщения QoS0 в очередь queue_qos0_messages false # Интервал публикации системной информации sys_interval 60
Лимит кучи для брокера я пока оставил без ограничений (0), но если в будущем окажется, что брокер выжирает всю доступную память на роутере, то придется умерить его аппетиты. Уменьшил интервал публикации системной информации, дабы сильно не грузить роутер почти бесполезными данными (по умолчанию 10 секунд).
Далее указываем, где брокер будет хранить базу данных. Указываем ему путь на ранее созданную папку:
# ================================================================= # Persistence # ================================================================= # Разрешить сохранение базы данных на диске persistence true # Каталог для хранения локальной базы данных persistence_location /opt/etc/mosquitto/persistence # Имя файла локальной базы данных persistence_file mosquitto.db # Интервал записи данных на диск в секундах autosave_interval 1800 # Сохранять по интервалу времени (true - по количеству изменений) autosave_on_changes false
Думаю, тут тоже всё понятно. Переходим к журналированию. На начальном этапе я включил несколько журналов: в консоль, в системный журнал роутера, в файл и в системные топики. После того, как настройка брокера будет завершена, вывод журналов в консоль и в файл имеет смысл отключить. Ибо консоль всё равно никто видеть не будет, а файл может неограниченно расти. Ну и количество типов событий можно существенно подсократить (в будущем).
# ================================================================= # Logging # ================================================================= # Вывод в консоль log_dest stdout # Вывод в системный лог роутера log_dest syslog # Вывод в файл log_dest file /opt/var/log/mosquitto.log # Вывод в системный топик log_dest topic # Какие типы сообщений следует писать в лог log_type error log_type warning log_type notice log_type information log_type subscribe log_type unsubscribe # Выводить в лог события подключения клиентов connection_messages true # Выводить в лог метку времени log_timestamp true log_timestamp_format %Y-%m-%d %H:%M:%S
Ну и последний этап (ну не совсем, а до первого запуска) – указываем, как будет происходить авторизация клиентов на сервере. Я выбрал самый простой вариант – по логину и паролю, без всяких там плагинов и сертификатов.
# ================================================================= # Security # ================================================================= #clientid_prefixes # Запретить анонимные подключения allow_anonymous false # Имя файла с данными пользователей и паролями password_file /opt/etc/mosquitto/mosquitto.users # Имя файла с правами доступа к топикам acl_file /opt/etc/mosquitto/mosquitto.acl
Добавляем все эти секции в файл, проверяем, сохраняем. В принципе, можно уже пробовать запускать брокер. Сделать это можно с помощью команды:
mosquitto -d -c /opt/etc/mosquitto/mosquitto.conf
Однако, если брокер уже был запущен, его нужно предварительно остановить. Чтобы не набирать команды каждый раз ручками, я набросал в Midnight Commander скриптик и дал ему права на выполнение:
#!/bin/sh PATH=/opt/bin:/opt/sbin:/sbin:/bin:/usr/sbin:/usr/bin killall mosquitto mosquitto -d -c /opt/etc/mosquitto/mosquitto.conf
Назвать его можно как угодно, я обозвал без выкрутасов – restart. Очень экономит время при настройке. Действуйте по аналогии, как это описано выше для скрипта Smosquitto, можно даже просто создать копию с Smosquitto, а затем отредактировать.
Однако подключаться пока ещё рано, нужно вначале создать файл пользователей и добавить пользователей в список. Сделать это можно с помощью команды mosquitto_passwd:
mosquitto_passwd
mosquitto_passwd is a tool for managing password files for mosquitto.
Usage: mosquitto_passwd [-H sha512 | -H sha512-pbkdf2] [-c | -D] passwordfile username
mosquitto_passwd [-H sha512 | -H sha512-pbkdf2] [-c] -b passwordfile username password
mosquitto_passwd -U passwordfile
-b : run in batch mode to allow passing passwords on the command line.
-c : create a new password file. This will overwrite existing files.
-D : delete the username rather than adding/updating its password.
-H : specify the hashing algorithm. Defaults to sha512-pbkdf2, which is recommended.
Mosquitto 1.6 and earlier defaulted to sha512.
-U : update a plain text password file to use hashed passwords.
See https://mosquitto.org/ for more information.
Вам потребуется добавить как минимум одного пользователя в список пользователей брокера. С помощью этого аккаунта Вы будете подключаться к брокеру со смартфона и с Ваших устройств. Однако я настоятельно рекомендую Вам не ограничиваться одной учетной записью, а создать несколько разных учетных записей – отдельные учётки для смартфонов управления, и отдельные учётки для каждого из умных устройств. Во-первых при необходимости изменения единственного пароля (при утере смартфона, например), Вам придется поменять все пароли на всех устройствах сразу. А в случае разных учёток можно ограничится только удалением из списка скомпрометированной записи. Во-вторых, при разных учетных записях возможно настроить разные уровни доступа к топикам, что может быть полезно.
Первого пользователя добавляем с опцией создания нового файла ( -с ):
mosquitto_passwd -c -b /opt/etc/mosquitto/mosquitto.users логин пароль
Второго и последующего пользователя добавляем уже без этого флага:
mosquitto_passwd -b /opt/etc/mosquitto/mosquitto.users логин пароль
Пользователей можно добавить сколько угодно. В результате будет создан файл примерно такого содержания:
admin:$7$101$NUE9kyIRB4Ght9ub$qOzyqRAf5rRcVVddLoQbgplfRhbZFc8NLsrTy3jDsHli9Gq52cK6uSnRkQE0xHWKqNgYZV+sE27lv/Mzsm2phw== test:$7$101$KrJjxaCUf2QeC9xt$wb2TMbbfb3ZUGqELgYFFPePQfSO63ARbrhBH5+cHZjHAtKAnObBsnqDvvWCcbMZ0coxMkGvcjYScLv00Gl/6GA==
Теперь нужно создать файл с правами доступа к топикам. Утилиты для этого никакой нет, да её и не требуется – это простой текстовый файл. Создайте его в mc. В нем для каждого пользователя должно быть две строчки вида:
user test topic readwrite #
Более подробно можно прочитать в документации:
Списки управления доступом для конкретных тем добавляются после пользовательской строки следующим образом: user <username> topic [read|write|readwrite|deny] <topic> Упомянутое здесь имя пользователя такое же, как в password_file. Это не clientid. Тип доступа контролируется с помощью «чтение», «запись», «чтение-запись» или «запретить». Этот параметр является необязательным (если <topic> не содержит пробела) - если не задан, то доступ осуществляется на чтение / запись. <topic> может содержать подстановочные знаки + или #, как в подписках. Параметр «deny» может использоваться для явного отказа в доступе к теме, который в противном случае был бы предоставлен более широким оператором чтения / записи / чтения и записи. Любые запрещенные темы обрабатываются перед тем, которые предоставляют доступ для чтения / записи.
Итак, запускаем mc, переходим в каталог /opt/etc/mosquitto/, нажимаем клавиши shift+f4 (откроется пустое окно редактора), добавляем строки:
user admin topic readwrite # user test topic readwrite #
Этим самым мы дали полные права на все топики (пока так – потом я буду настраивать доступы гораздо более “тонко”). Далее нажимаем f2, на запрос имени файла вводим mosquitto.acl. Разумеется, имена пользователей должны соответствовать Вашим.
Перезапускаем брокер (скриптом или перезагрузкой роутера). Можно убедится, что всё хорошо, посмотрев файл журнала:
2021-05-09 08:26:43: mosquitto version 2.0.10 starting 2021-05-09 08:26:43: Config loaded from /opt/etc/mosquitto/mosquitto.conf. 2021-05-09 08:26:43: Opening ipv4 listen socket on port 1883. 2021-05-09 08:26:43: Opening ipv6 listen socket on port 1883. 2021-05-09 08:26:43: mosquitto version 2.0.10 running
Теперь можно попробовать подключиться со смартфона или компьютера под любым из созданных пользователей. На данном этапе используем “прямое” подключение на порту 1883. Если всё было сделано правильно, подключение будет успешно выполнено, а в файле журнала должны появится следующие строки:
2021-05-09 08:54:47: New connection from 192.168.8.73:41352 on port 1883. 2021-05-09 08:54:47: New client connected from 192.168.8.73:41352 as mqttdash-03b55403 (p2, c1, k30, u'admin'). 2021-05-09 08:54:49: Client mqttdash-03b55403 disconnected.
Ура! Заработало!
7. Добавляем возможность TLS-соединения
Как я уже говорил, в локальной сети TLS / SSL как бы не особо и нужен. Но он потребуется, если Вы захотите открыть порт брокера на роутере “наружу” (так называемый “проброс портов”) – в этом случае оставлять незащищенным канал управления умным домом, мягко говоря, рискованно. Да и внутри сети SSL-соединение не помешает. Я не буду подписывать созданный сертификат в центре сертификации CA, а создам самоподписанный сертификат (потому что “извне” подключаться к серверу не планирую. Однако Вы можете это сделать, например через LetsEncrypt.
1. Для начала нам необходимо установить утилиту OpenSSL:
~ # opkg install openssl-util Installing openssl-util (1.1.1k-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/openssl-util_1.1.1k-1_mipsel-3.4.ipk Installing libopenssl-conf (1.1.1k-1) to root... Downloading http://bin.entware.net/mipselsf-k3.4/libopenssl-conf_1.1.1k-1_mipsel-3.4.ipk Configuring libopenssl-conf. Configuring openssl-util. ~ #
2. Создаем каталог для хранения сертификатов и ключей. Поскольку это сертификат mosquitto, то логично расположить всё это хозяйство внутри /opt/etc/mosquitto. Создадим каталог /opt/etc/mosquitto/certs и перейдем в него:
~ # cd /opt/etc/mosquitto /opt/etc/mosquitto # mkdir certs /opt/etc/mosquitto # cd certs /opt/etc/mosquitto/certs #
3. Генерируем личный RSA ключ для личного “центра сертификации” (СА KEY) с помощью команды openssl genrsa -out mosq-ca.key 2048:
/opt/etc/mosquitto/certs # openssl genrsa -out mosq-ca.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ............................................+++++ .....................+++++ e is 65537 (0x010001) /opt/etc/mosquitto/certs #
Используя эту команду, мы создаем ключ длиной 2048 бит с именем mosq-ca.key (имя в принципе может быть другим)
4. Генерируем CA сертификат X509 (CA CERT), используя созданный CA ключ. Для этого выполните команду openssl req -new -x509 -days 999 -key mosq-ca.key -out mosq-ca.crt. Программа запросит данные страны, региона, организации и другие данные (некоторые можно оставить пустыми), после чего будет создан файл сертификата:
/opt/etc/mosquitto/certs # openssl req -new -x509 -days 999 -key mosq-ca.key -out mosq-ca.crt You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Russian Federation Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:kotyara12 Email Address []:kotyara12@yandex.ru /opt/etc/mosquitto/certs #
5. Генерируем личный RSA ключ для сервера (SERVER KEY) с помощью команды openssl genrsa -out mosq-serv.key 2048:
/opt/etc/mosquitto/certs # openssl genrsa -out mosq-serv.key 2048 Generating RSA private key, 2048 bit long modulus (2 primes) ......................................................................................+++++ .................................................................+++++ e is 65537 (0x010001) /opt/etc/mosquitto/certs #
6. Создаем запрос на подпись сертификата сервера (SERVER CSR). Этот запрос должен быть отправлен в центр сертификации, который после проверки личности автора возвращает сертификат. В данном случае я не буду этого делать, а создам сертификат, подписанный “своим” центром сертификации.
/opt/etc/mosquitto/certs # openssl req -new -key mosq-serv.key -out mosq-serv.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:RU State or Province Name (full name) [Some-State]:Russian Federation Locality Name (eg, city) []: Organization Name (eg, company) [Internet Widgits Pty Ltd]: Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:k12village_mosquitto Email Address []:kotyara12@yandex.ru Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []:123456789 An optional company name []: /opt/etc/mosquitto/certs #
Как вы можете заметить, мы использовали закрытый ключ, сгенерированный на предыдущем шаге. Наконец, мы можем создать сертификат для использования на нашем сервере Mosquitto.
7. Создаем сертификат сервера (SERVER CERT), используя запрос на подпись сертификата и ранее созданный CA сертификат:
/opt/etc/mosquitto/certs # openssl x509 -req -in mosq-serv.csr -CA mosq-ca.crt -CAkey mosq-ca.key -CAcreateserial -out mosq-serv.crt -days 999 -sha256 Signature ok subject=C = RU, ST = Russian Federation, O = Internet Widgits Pty Ltd, CN = k12village_mosquitto, emailAddress = kotyara12@yandex.ru Getting CA Private Key /opt/etc/mosquitto/certs #
Готово. Сертификаты созданы. Конечно, этот сертификат не примет обычный браузер, но в некоторых mqtt-клиентах для android есть возможность использования самоподписанного сертификата (хотя в этом есть потенциальный риск, что сертификат может быть подменен). А для ESP это вообще не важно, так как в любом случае требуется указание корневого сертификата.
Можно проверить результаты, выполнив команду openssl x509 -in mosq-serv.crt -noout -text.
8. Корректируем права на доступ к файлам ключей пользователям.
Поскольку мы создавали ключи и сертификаты, залогинившись в терминала под пользователем root, то и права на доступ к папке и файлам будет только у пользователя root. А сервер у нас запускается под ограниченным пользователем mosquitto. Если сейчас попытаться перезапустить брокер, то он не сможет подгрузить ключи и выдаст серию ошибок типа “в доступе отказано”. Что ж, это довольно легко поправить, выполнив команду:
chmod 777 /opt/etc/mosquitto/certs -R
Ключ -R обозначает, что команду нужно выполнить рекурсивно, то есть для папки и всех вложенных подпапок и файлов.
9. Подключаем созданный сертификат к нашему серверу.
Осталось настроить mosquitto.conf. Для этого добавляем в секцию Listeners ещё одного слушателя:
# Порт SSL listener 8883 protocol mqtt cafile /opt/etc/mosquitto/certs/mosq-ca.crt certfile /opt/etc/mosquitto/certs/mosq-serv.crt keyfile /opt/etc/mosquitto/certs/mosq-serv.key
Добавить эти строки нужно после уже добавленного ранее listener 1883.
10. Перезапускаем брокер любым способом: командным файлом, вручную или перезагрузкой роутера и пробуем подключится.
2021-05-10 08:12:34: mosquitto version 2.0.10 starting 2021-05-10 08:12:34: Config loaded from /opt/etc/mosquitto/mosquitto.conf. 2021-05-10 08:12:34: Opening ipv4 listen socket on port 1883. 2021-05-10 08:12:34: Opening ipv6 listen socket on port 1883. 2021-05-10 08:12:34: Opening ipv4 listen socket on port 8883. 2021-05-10 08:12:34: Opening ipv6 listen socket on port 8883. 2021-05-10 08:12:34: mosquitto version 2.0.10 running
Настраиваем клиент для работы с самоподписанным сертификатом. Для этого можно либо подгрузить CA сертификат на смартфон, либо поставить галочку в свойствах подключения:
Настройка клиента MQTT Dash для работы с локальным брокером напрямую
и пробуем подключится:
2021-05-10 08:14:03: New connection from 192.168.8.73:48412 on port 8883. 2021-05-10 08:14:03: New client connected from 192.168.8.73:48412 as mqttdash-03b55403 (p2, c1, k30, u'admin'). 2021-05-10 08:14:05: Client mqttdash-03b55403 disconnected.
Отлично! Теперь можно пробросить порты 1883 и 8883 на роутере наружу и попытаться подключиться к нашему серверу извне. Если Вы имеете белый IP-адрес… Или попробовать подключиться через Keenetic DNS.
8. Пробрасываем порты для возможности подключения к брокеру извне
Важно! Переадресация портов будет работать только в том случае, если интернет-центр использует белый (публичный) IP-адрес для выхода в Интернет. Дополнительную информацию вы найдете в статье “В чем отличие “белого” и “серого” IP-адреса?”.
Заходим в панель управления роутером в раздел “Сетевые правила” – “Переадресация” и добавляем правило, как на рисунке ниже:
Проброс порта 8883 на роутере
Сохраняем. В настройках клиента меняем локальный адрес сервера “192.168.1.1” на тот, который Вам выдал Keenetic (что-то типа “xxx.keenetic.pro”) и пробуем подключиться. У меня всё заработало с первого раза. Единственное, что хотелось бы отметить – эту операцию нужно повторить для всех внешних сетевых интерфейсов, если их несколько (основной и резервный канал до интернета). Нужно ли дополнительно пробросить порт 1883 – решать только Вам. У меня получилось что-то вроде этого:
Проброс MQTT портов на роутере
Как видите, noSSL 1883 порты извне я всё-таки отключил, ибо небезопасно. А внутри локальной сети все будет работать и без SSL.
Проброс портов это хорошо, но не слишком удобно. Особенно, если у Вас есть несколько локаций, на каждой из которых стоит свой роутер со своим локальным брокером. В этом случае свести данные с устройств на одну панель управления не получится. Гораздо удобнее настроить мост между нашим локальным брокером, и любым другим внешним облачным MQTT-брокером. В этом случае смартфоны управления мы будем настраивать на работу с облачным брокером, ESP – на работу с локальным адресом, ну а локальный брокер будет автоматически подключаться к нему и перенаправлять данные туда и обратно. Можно даже сделать сложную структуру так, чтобы данные вначале отправлялись на какой-либо “главный локальный” брокер, а затем уже на облачный брокер в интернете (правда я пока не знаю, зачем такое может быть нужно).
Мостов на внешние брокеры может быть несколько, каждое такое подключение должно иметь своё имя. Кстати, несколько мостов позволяет одновременно принимать данные с разных облачных брокеров, если ранее прошитые ESP по каким-то причинам невозможно переключить на другой брокер.
Прежде чем создавать мостовые соединения, хорошо бы создать отдельного локального пользователя, хотя в принципе можно обойтись и уже существующим. Для этого воспользуемся командой mosquitto_passwd, как мы это делали ранее:
mosquitto_passwd -b /opt/etc/mosquitto/mosquitto.users bridge 11111111
а затем не забудьте добавить права доступа на топики в /opt/etc/mosquitto/mosquitto.acl, для примера можно так:
user bridge topic readwrite #
Для создания мостового соединения необходимо добавить по крайней мере одну новую запись mosquitto.conf в секцию Bridges:
# ================================================================= # Bridges # ================================================================= # Имя мостового соединения connection wqtt_ru # Имя сервера и порт для внешнего брокера address x65535.wqtt.ru:1003 # Какие топики и в каком направлении следует пересылать: в данном случае всё (только для примера, в раельном соединении не рекомендуется: может вызвать зацикливание) topic # both # Тип запуска: автоматический start_type automatic # Версия протокола (мой удаленный брокер требует этот протокол) bridge_protocol_version mqttv311 # Если установлено true, публиковать уведомления для локальных и удаленных брокеров с информацией о состоянии мостового соединения notifications true # Параметры локального подключения local_clientid bridge_local local_username bridge local_password 11111111 # Параметры удаленного подключения remote_clientid bridge_remote remote_username U_WQTT_RU remote_password 22222222 # Отписываться на внешнем брокере от тем "наружу" bridge_attempt_unsubscribe true # Чистая сессия отключена cleansession false # Интервал поддержания соединения в секундах keepalive_interval 60 # Интервал, после которого неактивный мост будет остановлен idle_timeout 600
Разумеется, имя сервера, порт, имена пользователей и пароли Вы предварительно должны заменить на свои!
Перезапускаем локальный брокер, проверяем. Работает! Но – без SSL, что не есть гуд.
10. Настройка моста на работу через SSL
Для работы SSL необходим сертификат удаленного сервера, точнее корневой сертификат удостоверяющего центра, с которого по цепочке будут проверены все остальные сертификаты. На роутере сертификат удостоверяющего центра для wqtt.ru уже имеется в каталоге /etc/ssl/certs под именем ISRG_Root_X1.crt, так что ничего скачивать и генерировать не потребуется. Мало того, роутер сам позаботится об его обновлении, когда необходимо. Осталось немного подкорректировать файл конфигурации:
...... # Имя сервера и порт для внешнего брокера: здесь меняем порт на SSL address x65535.wqtt.ru:1004 # Сертификат CA (корневой в цепочке сертификатов) внешнего брокера bridge_cafile /etc/ssl/certs/ISRG_Root_X1.crt ......
Перезапускаем брокер, проверяем. Connecting bridge wqtt_ru (x65535.wqtt.ru:1004), всё в порядке.
Поздравляю, Вы только что настроили свой личный MQTT сервер с SSL, бесплатно и навсегда!
Ну и напоследок могу порекомендовать выделить для IoT устройств отдельную сеть с отдельным диапазоном адресов, так как медленные ESP8266 в общей сети как-то умудрялись тормозить всю wifi сеть. После выделения и переподключения их в отдельный сегмент, проблема ушла.
На этом пока всё, до встречи на сайте и на telegram-канале!. Если Вам понравилась статья – кликните на любое рекламное объявление, этого будет вполне достаточно для поддержки автора.
🔶 Полный архив статей вы найдете здесь
Понимание того, кто конкретно в квартире помогает подумать о безопасности и о персональных сценариях работы. Долго не будем задерживаться на этом — на выходе у вас будет сенсор, показывающий подключен ли кто-то из близких к WI-FI или нет.
opkg install mosquitto-client-nossl jq
Не разрываем SSH подключение и закидываем исполняемый скрипт 010-neighbour.sh в папку /storage/etc/ndm/neighbour.d, если такого каталога нет — создать с правами на выполнение.
#!/bin/sh
DEV1="e8:78:65:d7:61:bf" #тут мы вписываем мак адрес первого устройства
DEV2="74:42:8b:1b:bd:73" #тут мы вписываем мак адрес второго устройства
replacement() {
case "$1" in
*$DEV1* ) echo "Name dev1";; # тут вы можете изменить имя первого девайса
*$DEV2* ) echo "Name dev2";; # тут вы можете изменить имя второго девайса
esac
}
if [[ "$address" = "ipv4" && "$update" = "none" ]]; then
#получаем mac устройства по ID - информация сугубо информационная
mac=$(wget -qO - http://127.0.0.1:79/rci/show/ip/neighbour | jq --arg num "$id" '.[$num].mac')
#проверяем mac на принадлежность нужному нам хосту - информация сугубо информационная
who=$(replacement "$mac")
[ -z "$who" ] && exit 0
#публикуем mqtt сообщение типа "Device 1 new" и "Device 1 del" в топик zyxel - информация сугубо информационная
mosquitto_pub -d -t zyxel -m "$who $action" -h 10.10.10.112 -p 1883 -u login -P password > /dev/null # вот на этой строчке я заменить брокер на броке малины с NR
fi
Теперь незабываем сделать скрипт исполняемым, снова возвращаемся к SSH и вписываем:
chmod +x 010-neighbour.sh
Теперь вы можете зайти на брокер и проверить со своим устройством публикуемый топик zyxel
[
{
"id": "681003fedcd65918",
"type": "tab",
"label": "Тест",
"disabled": false,
"info": "",
"env": []
},
{
"id": "86ad78107440c330",
"type": "spruthub-in",
"z": "681003fedcd65918",
"name": "Входная дверь",
"server": "6caeb7a3.0661a8",
"friendly_name": "Входная дверь NEW (Спальня) : Состояние датчика касания",
"uid": [
"17_10"
],
"cid": "12",
"ctype": "ContactSensorState",
"showHidden": false,
"enableMultiple": false,
"outputAtStartup": false,
"x": 340,
"y": 600,
"wires": [
[
"b76836241d69fe51"
]
]
},
{
"id": "b76836241d69fe51",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "1",
"vt": "str"
},
{
"t": "cont",
"v": "0",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 455,
"y": 600,
"wires": [
[
"51ebab837f3544eb"
],
[
"78e9c94c91a1a926",
"0a94843d3af37ba3"
]
],
"l": false
},
{
"id": "78e9c94c91a1a926",
"type": "change",
"z": "681003fedcd65918",
"name": "Запоминаем на 3 минуты закрытие двери",
"rules": [
{
"t": "set",
"p": "doorcheckclosed",
"pt": "global",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 990,
"y": 640,
"wires": [
[
"bf1942c171f26fcb"
]
]
},
{
"id": "410148b7bc5b5cf9",
"type": "change",
"z": "681003fedcd65918",
"name": "Возвращаем на место",
"rules": [
{
"t": "set",
"p": "doorcheckclosed",
"pt": "global",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 990,
"y": 680,
"wires": [
[]
]
},
{
"id": "bf1942c171f26fcb",
"type": "trigger",
"z": "681003fedcd65918",
"name": "",
"op1": "",
"op2": "test",
"op1type": "nul",
"op2type": "str",
"duration": "3",
"extend": true,
"overrideDelay": false,
"units": "min",
"reset": "",
"bytopic": "all",
"topic": "topic",
"outputs": 1,
"x": 835,
"y": 680,
"wires": [
[
"410148b7bc5b5cf9"
]
],
"l": false
},
{
"id": "51ebab837f3544eb",
"type": "change",
"z": "681003fedcd65918",
"name": "Запоминаем на три минуты открытие двери",
"rules": [
{
"t": "set",
"p": "doorcheckopen",
"pt": "global",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1000,
"y": 560,
"wires": [
[
"38a23d229a6722d8"
]
]
},
{
"id": "38a23d229a6722d8",
"type": "trigger",
"z": "681003fedcd65918",
"name": "",
"op1": "",
"op2": "test",
"op1type": "nul",
"op2type": "str",
"duration": "3",
"extend": true,
"overrideDelay": false,
"units": "min",
"reset": "",
"bytopic": "all",
"topic": "topic",
"outputs": 1,
"x": 845,
"y": 520,
"wires": [
[
"aa63519fe4edcfe0"
]
],
"l": false
},
{
"id": "aa63519fe4edcfe0",
"type": "change",
"z": "681003fedcd65918",
"name": "Возвращаем на место",
"rules": [
{
"t": "set",
"p": "doorcheckopen",
"pt": "global",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 990,
"y": 520,
"wires": [
[]
]
},
{
"id": "210c12c1d77775bf",
"type": "mqtt in",
"z": "681003fedcd65918",
"name": "",
"topic": "zyxel",
"qos": "2",
"datatype": "auto",
"broker": "ba753d3ede0325ae",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 270,
"y": 280,
"wires": [
[
"cf8db90eca5beae3",
"95f9831b18db0cf2"
]
]
},
{
"id": "bdbd7a9664ee5bd3",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "Nikita del",
"vt": "str"
},
{
"t": "cont",
"v": "Mari del",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 725,
"y": 300,
"wires": [
[
"78c880393a46688e"
],
[
"908405dba26c8e38"
]
],
"l": false
},
{
"id": "345f82920d9c0ed5",
"type": "spruthub-out",
"z": "681003fedcd65918",
"name": "Маша",
"server": "6caeb7a3.0661a8",
"friendly_name": "Маша (Вспомогательные) : Обнаружено присутствие",
"uid": [
"155_19"
],
"cid": "21",
"showHidden": false,
"enableMultiple": false,
"payload": "payload",
"payloadType": "msg",
"rbe": true,
"x": 970,
"y": 380,
"wires": []
},
{
"id": "7c7cfb8a0d11fc21",
"type": "change",
"z": "681003fedcd65918",
"name": "1",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "1",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 795,
"y": 420,
"wires": [
[
"345f82920d9c0ed5"
]
],
"l": false
},
{
"id": "908405dba26c8e38",
"type": "change",
"z": "681003fedcd65918",
"name": "0",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0",
"tot": "num"
},
{
"t": "set",
"p": "mariwifi",
"pt": "global",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 795,
"y": 320,
"wires": [
[
"345f82920d9c0ed5"
]
],
"l": false
},
{
"id": "db53559fc473c5b4",
"type": "change",
"z": "681003fedcd65918",
"name": "1",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "1",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 795,
"y": 380,
"wires": [
[
"ab3751299733538a"
]
],
"l": false
},
{
"id": "78c880393a46688e",
"type": "change",
"z": "681003fedcd65918",
"name": "0",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0",
"tot": "num"
},
{
"t": "set",
"p": "nikitawifi",
"pt": "global",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 795,
"y": 280,
"wires": [
[
"ab3751299733538a"
]
],
"l": false
},
{
"id": "ab3751299733538a",
"type": "spruthub-out",
"z": "681003fedcd65918",
"name": "Никита",
"server": "6caeb7a3.0661a8",
"friendly_name": "Никита (Вспомогательные) : Обнаружено присутствие",
"uid": [
"155_15"
],
"cid": "17",
"showHidden": false,
"enableMultiple": false,
"payload": "payload",
"payloadType": "msg",
"rbe": true,
"x": 980,
"y": 320,
"wires": []
},
{
"id": "cf8db90eca5beae3",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "doorcheckclosed",
"propertyType": "global",
"rules": [
{
"t": "true"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 495,
"y": 260,
"wires": [
[
"bdbd7a9664ee5bd3"
]
],
"l": false
},
{
"id": "95f9831b18db0cf2",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "Nikita new",
"vt": "str"
},
{
"t": "cont",
"v": "Mari new",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 365,
"y": 420,
"wires": [
[
"d0e6592679582701"
],
[
"bb169d458486ccad"
]
],
"l": false
},
{
"id": "d0e6592679582701",
"type": "change",
"z": "681003fedcd65918",
"name": "Start",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "START",
"tot": "str"
},
{
"t": "set",
"p": "nikitawifi",
"pt": "global",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 505,
"y": 360,
"wires": [
[
"dc24bafce89d6a3a"
]
],
"l": false
},
{
"id": "dc24bafce89d6a3a",
"type": "controltimer",
"z": "681003fedcd65918",
"name": "",
"timerType": "delay",
"timerDurationUnit": "minute",
"timerDurationType": "num",
"timerDuration": 1,
"timerLoopTimeoutUnit": "second",
"timerLoopTimeoutType": "num",
"timerLoopTimeout": 0,
"loopTimeoutMessageType": "str",
"loopTimeoutMessage": "LOOP_TIMEOUT",
"timerMaxLoopIterationsType": "num",
"timerMaxLoopIterations": 0,
"loopMaxIterationsMessageType": "str",
"loopMaxIterationsMessage": "MAX_LOOP_ITERATIONS",
"isConsecutiveStartActionTimerResetAllowed": false,
"isRunningTimerProgressVisible": true,
"outputReceivedMessageOnTimerTrigger": true,
"outputReceivedMessageOnTimerHalt": true,
"startTimerOnReceivalOfUnknownMessage": false,
"resetTimerOnReceivalOfUnknownMessage": false,
"isDebugModeEnabled": false,
"timerTriggeredMessageType": "str",
"timerTriggeredMessage": "TIMER_TRIGGERED",
"timerHaltedMessageType": "str",
"timerHaltedMessage": "TIMER_HALTED",
"isStartActionEnabled": true,
"isStopActionEnabled": true,
"isResetActionEnabled": true,
"isPauseActionEnabled": true,
"isContinueActionEnabled": true,
"actionPropertyNameType": "str",
"actionPropertyName": "payload",
"startActionNameType": "str",
"startActionName": "START",
"stopActionNameType": "str",
"stopActionName": "STOP",
"resetActionNameType": "str",
"resetActionName": "RESET",
"pauseActionNameType": "str",
"pauseActionName": "PAUSE",
"continueActionNameType": "str",
"continueActionName": "CONTINUE",
"x": 665,
"y": 360,
"wires": [
[
"69fcab2491cbef8f"
],
[
"69fcab2491cbef8f"
]
],
"l": false
},
{
"id": "69fcab2491cbef8f",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "nikitawifi",
"propertyType": "global",
"rules": [
{
"t": "true"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 735,
"y": 380,
"wires": [
[
"db53559fc473c5b4"
]
],
"l": false
},
{
"id": "bb169d458486ccad",
"type": "change",
"z": "681003fedcd65918",
"name": "Start",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "START",
"tot": "str"
},
{
"t": "set",
"p": "mariwifi",
"pt": "global",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 505,
"y": 440,
"wires": [
[
"f52b5651afc33c5f"
]
],
"l": false
},
{
"id": "0a94843d3af37ba3",
"type": "change",
"z": "681003fedcd65918",
"name": "Stop",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "STOP",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 585,
"y": 400,
"wires": [
[
"f52b5651afc33c5f",
"dc24bafce89d6a3a"
]
],
"l": false
},
{
"id": "f52b5651afc33c5f",
"type": "controltimer",
"z": "681003fedcd65918",
"name": "",
"timerType": "delay",
"timerDurationUnit": "minute",
"timerDurationType": "num",
"timerDuration": 1,
"timerLoopTimeoutUnit": "second",
"timerLoopTimeoutType": "num",
"timerLoopTimeout": 0,
"loopTimeoutMessageType": "str",
"loopTimeoutMessage": "LOOP_TIMEOUT",
"timerMaxLoopIterationsType": "num",
"timerMaxLoopIterations": 0,
"loopMaxIterationsMessageType": "str",
"loopMaxIterationsMessage": "MAX_LOOP_ITERATIONS",
"isConsecutiveStartActionTimerResetAllowed": false,
"isRunningTimerProgressVisible": true,
"outputReceivedMessageOnTimerTrigger": true,
"outputReceivedMessageOnTimerHalt": true,
"startTimerOnReceivalOfUnknownMessage": false,
"resetTimerOnReceivalOfUnknownMessage": false,
"isDebugModeEnabled": false,
"timerTriggeredMessageType": "str",
"timerTriggeredMessage": "TIMER_TRIGGERED",
"timerHaltedMessageType": "str",
"timerHaltedMessage": "TIMER_HALTED",
"isStartActionEnabled": true,
"isStopActionEnabled": true,
"isResetActionEnabled": true,
"isPauseActionEnabled": true,
"isContinueActionEnabled": true,
"actionPropertyNameType": "str",
"actionPropertyName": "payload",
"startActionNameType": "str",
"startActionName": "START",
"stopActionNameType": "str",
"stopActionName": "STOP",
"resetActionNameType": "str",
"resetActionName": "RESET",
"pauseActionNameType": "str",
"pauseActionName": "PAUSE",
"continueActionNameType": "str",
"continueActionName": "CONTINUE",
"x": 665,
"y": 440,
"wires": [
[
"37758122dd96c4bf"
],
[
"37758122dd96c4bf"
]
],
"l": false
},
{
"id": "37758122dd96c4bf",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "mariwifi",
"propertyType": "global",
"rules": [
{
"t": "true"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 735,
"y": 420,
"wires": [
[
"7c7cfb8a0d11fc21"
]
],
"l": false
},
{
"id": "383f892d07f27238",
"type": "comment",
"z": "681003fedcd65918",
"name": "Убираем присутствие из дома только если за последние 3 минуты была закрыта дверь",
"info": "",
"x": 540,
"y": 220,
"wires": []
},
{
"id": "63ef86619be27df4",
"type": "comment",
"z": "681003fedcd65918",
"name": "",
"info": "Тут при подключениии срабатывает минутный таймер ожидающий закрытия двери. Если таймер истечет , дом еще раз проверит подключены ли вы к WIFI и если да оставит ваше присутствие дома.\n\nМне это нужно было, чтобы Алиса четко после закрытия двери запускала приветствие и все рабочие вещи по подсветке и тд, а не когда я еще на подходе к квартире.",
"x": 592.8571243286133,
"y": 325.7142696380615,
"wires": []
},
{
"id": "6caeb7a3.0661a8",
"type": "spruthub-server",
"name": "Мой Спрутхабушка",
"host": "10.10.10.41",
"api_port": "80"
},
{
"id": "ba753d3ede0325ae",
"type": "mqtt-broker",
"name": "",
"broker": "localhost",
"port": "1883",
"clientid": "",
"autoConnect": true,
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willPayload": "",
"willMsg": {},
"sessionExpiry": ""
}
]
Понимание того, кто конкретно в квартире помогает подумать о безопасности и о персональных сценариях работы. Долго не будем задерживаться на этом — на выходе у вас будет сенсор, показывающий подключен ли кто-то из близких к WI-FI или нет.
opkg install mosquitto-client-nossl jq
Не разрываем SSH подключение и закидываем исполняемый скрипт 010-neighbour.sh в папку /storage/etc/ndm/neighbour.d, если такого каталога нет — создать с правами на выполнение.
#!/bin/sh
DEV1="e8:78:65:d7:61:bf" #тут мы вписываем мак адрес первого устройства
DEV2="74:42:8b:1b:bd:73" #тут мы вписываем мак адрес второго устройства
replacement() {
case "$1" in
*$DEV1* ) echo "Name dev1";; # тут вы можете изменить имя первого девайса
*$DEV2* ) echo "Name dev2";; # тут вы можете изменить имя второго девайса
esac
}
if [[ "$address" = "ipv4" && "$update" = "none" ]]; then
#получаем mac устройства по ID - информация сугубо информационная
mac=$(wget -qO - http://127.0.0.1:79/rci/show/ip/neighbour | jq --arg num "$id" '.[$num].mac')
#проверяем mac на принадлежность нужному нам хосту - информация сугубо информационная
who=$(replacement "$mac")
[ -z "$who" ] && exit 0
#публикуем mqtt сообщение типа "Device 1 new" и "Device 1 del" в топик zyxel - информация сугубо информационная
mosquitto_pub -d -t zyxel -m "$who $action" -h 10.10.10.112 -p 1883 -u login -P password > /dev/null # вот на этой строчке я заменить брокер на броке малины с NR
fi
Теперь незабываем сделать скрипт исполняемым, снова возвращаемся к SSH и вписываем:
chmod +x 010-neighbour.sh
Теперь вы можете зайти на брокер и проверить со своим устройством публикуемый топик zyxel
[
{
"id": "681003fedcd65918",
"type": "tab",
"label": "Тест",
"disabled": false,
"info": "",
"env": []
},
{
"id": "86ad78107440c330",
"type": "spruthub-in",
"z": "681003fedcd65918",
"name": "Входная дверь",
"server": "6caeb7a3.0661a8",
"friendly_name": "Входная дверь NEW (Спальня) : Состояние датчика касания",
"uid": [
"17_10"
],
"cid": "12",
"ctype": "ContactSensorState",
"showHidden": false,
"enableMultiple": false,
"outputAtStartup": false,
"x": 340,
"y": 600,
"wires": [
[
"b76836241d69fe51"
]
]
},
{
"id": "b76836241d69fe51",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "1",
"vt": "str"
},
{
"t": "cont",
"v": "0",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 455,
"y": 600,
"wires": [
[
"51ebab837f3544eb"
],
[
"78e9c94c91a1a926",
"0a94843d3af37ba3"
]
],
"l": false
},
{
"id": "78e9c94c91a1a926",
"type": "change",
"z": "681003fedcd65918",
"name": "Запоминаем на 3 минуты закрытие двери",
"rules": [
{
"t": "set",
"p": "doorcheckclosed",
"pt": "global",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 990,
"y": 640,
"wires": [
[
"bf1942c171f26fcb"
]
]
},
{
"id": "410148b7bc5b5cf9",
"type": "change",
"z": "681003fedcd65918",
"name": "Возвращаем на место",
"rules": [
{
"t": "set",
"p": "doorcheckclosed",
"pt": "global",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 990,
"y": 680,
"wires": [
[]
]
},
{
"id": "bf1942c171f26fcb",
"type": "trigger",
"z": "681003fedcd65918",
"name": "",
"op1": "",
"op2": "test",
"op1type": "nul",
"op2type": "str",
"duration": "3",
"extend": true,
"overrideDelay": false,
"units": "min",
"reset": "",
"bytopic": "all",
"topic": "topic",
"outputs": 1,
"x": 835,
"y": 680,
"wires": [
[
"410148b7bc5b5cf9"
]
],
"l": false
},
{
"id": "51ebab837f3544eb",
"type": "change",
"z": "681003fedcd65918",
"name": "Запоминаем на три минуты открытие двери",
"rules": [
{
"t": "set",
"p": "doorcheckopen",
"pt": "global",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1000,
"y": 560,
"wires": [
[
"38a23d229a6722d8"
]
]
},
{
"id": "38a23d229a6722d8",
"type": "trigger",
"z": "681003fedcd65918",
"name": "",
"op1": "",
"op2": "test",
"op1type": "nul",
"op2type": "str",
"duration": "3",
"extend": true,
"overrideDelay": false,
"units": "min",
"reset": "",
"bytopic": "all",
"topic": "topic",
"outputs": 1,
"x": 845,
"y": 520,
"wires": [
[
"aa63519fe4edcfe0"
]
],
"l": false
},
{
"id": "aa63519fe4edcfe0",
"type": "change",
"z": "681003fedcd65918",
"name": "Возвращаем на место",
"rules": [
{
"t": "set",
"p": "doorcheckopen",
"pt": "global",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 990,
"y": 520,
"wires": [
[]
]
},
{
"id": "210c12c1d77775bf",
"type": "mqtt in",
"z": "681003fedcd65918",
"name": "",
"topic": "zyxel",
"qos": "2",
"datatype": "auto",
"broker": "ba753d3ede0325ae",
"nl": false,
"rap": true,
"rh": 0,
"inputs": 0,
"x": 270,
"y": 280,
"wires": [
[
"cf8db90eca5beae3",
"95f9831b18db0cf2"
]
]
},
{
"id": "bdbd7a9664ee5bd3",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "Nikita del",
"vt": "str"
},
{
"t": "cont",
"v": "Mari del",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 725,
"y": 300,
"wires": [
[
"78c880393a46688e"
],
[
"908405dba26c8e38"
]
],
"l": false
},
{
"id": "345f82920d9c0ed5",
"type": "spruthub-out",
"z": "681003fedcd65918",
"name": "Маша",
"server": "6caeb7a3.0661a8",
"friendly_name": "Маша (Вспомогательные) : Обнаружено присутствие",
"uid": [
"155_19"
],
"cid": "21",
"showHidden": false,
"enableMultiple": false,
"payload": "payload",
"payloadType": "msg",
"rbe": true,
"x": 970,
"y": 380,
"wires": []
},
{
"id": "7c7cfb8a0d11fc21",
"type": "change",
"z": "681003fedcd65918",
"name": "1",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "1",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 795,
"y": 420,
"wires": [
[
"345f82920d9c0ed5"
]
],
"l": false
},
{
"id": "908405dba26c8e38",
"type": "change",
"z": "681003fedcd65918",
"name": "0",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0",
"tot": "num"
},
{
"t": "set",
"p": "mariwifi",
"pt": "global",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 795,
"y": 320,
"wires": [
[
"345f82920d9c0ed5"
]
],
"l": false
},
{
"id": "db53559fc473c5b4",
"type": "change",
"z": "681003fedcd65918",
"name": "1",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "1",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 795,
"y": 380,
"wires": [
[
"ab3751299733538a"
]
],
"l": false
},
{
"id": "78c880393a46688e",
"type": "change",
"z": "681003fedcd65918",
"name": "0",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "0",
"tot": "num"
},
{
"t": "set",
"p": "nikitawifi",
"pt": "global",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 795,
"y": 280,
"wires": [
[
"ab3751299733538a"
]
],
"l": false
},
{
"id": "ab3751299733538a",
"type": "spruthub-out",
"z": "681003fedcd65918",
"name": "Никита",
"server": "6caeb7a3.0661a8",
"friendly_name": "Никита (Вспомогательные) : Обнаружено присутствие",
"uid": [
"155_15"
],
"cid": "17",
"showHidden": false,
"enableMultiple": false,
"payload": "payload",
"payloadType": "msg",
"rbe": true,
"x": 980,
"y": 320,
"wires": []
},
{
"id": "cf8db90eca5beae3",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "doorcheckclosed",
"propertyType": "global",
"rules": [
{
"t": "true"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 495,
"y": 260,
"wires": [
[
"bdbd7a9664ee5bd3"
]
],
"l": false
},
{
"id": "95f9831b18db0cf2",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "Nikita new",
"vt": "str"
},
{
"t": "cont",
"v": "Mari new",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 365,
"y": 420,
"wires": [
[
"d0e6592679582701"
],
[
"bb169d458486ccad"
]
],
"l": false
},
{
"id": "d0e6592679582701",
"type": "change",
"z": "681003fedcd65918",
"name": "Start",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "START",
"tot": "str"
},
{
"t": "set",
"p": "nikitawifi",
"pt": "global",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 505,
"y": 360,
"wires": [
[
"dc24bafce89d6a3a"
]
],
"l": false
},
{
"id": "dc24bafce89d6a3a",
"type": "controltimer",
"z": "681003fedcd65918",
"name": "",
"timerType": "delay",
"timerDurationUnit": "minute",
"timerDurationType": "num",
"timerDuration": 1,
"timerLoopTimeoutUnit": "second",
"timerLoopTimeoutType": "num",
"timerLoopTimeout": 0,
"loopTimeoutMessageType": "str",
"loopTimeoutMessage": "LOOP_TIMEOUT",
"timerMaxLoopIterationsType": "num",
"timerMaxLoopIterations": 0,
"loopMaxIterationsMessageType": "str",
"loopMaxIterationsMessage": "MAX_LOOP_ITERATIONS",
"isConsecutiveStartActionTimerResetAllowed": false,
"isRunningTimerProgressVisible": true,
"outputReceivedMessageOnTimerTrigger": true,
"outputReceivedMessageOnTimerHalt": true,
"startTimerOnReceivalOfUnknownMessage": false,
"resetTimerOnReceivalOfUnknownMessage": false,
"isDebugModeEnabled": false,
"timerTriggeredMessageType": "str",
"timerTriggeredMessage": "TIMER_TRIGGERED",
"timerHaltedMessageType": "str",
"timerHaltedMessage": "TIMER_HALTED",
"isStartActionEnabled": true,
"isStopActionEnabled": true,
"isResetActionEnabled": true,
"isPauseActionEnabled": true,
"isContinueActionEnabled": true,
"actionPropertyNameType": "str",
"actionPropertyName": "payload",
"startActionNameType": "str",
"startActionName": "START",
"stopActionNameType": "str",
"stopActionName": "STOP",
"resetActionNameType": "str",
"resetActionName": "RESET",
"pauseActionNameType": "str",
"pauseActionName": "PAUSE",
"continueActionNameType": "str",
"continueActionName": "CONTINUE",
"x": 665,
"y": 360,
"wires": [
[
"69fcab2491cbef8f"
],
[
"69fcab2491cbef8f"
]
],
"l": false
},
{
"id": "69fcab2491cbef8f",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "nikitawifi",
"propertyType": "global",
"rules": [
{
"t": "true"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 735,
"y": 380,
"wires": [
[
"db53559fc473c5b4"
]
],
"l": false
},
{
"id": "bb169d458486ccad",
"type": "change",
"z": "681003fedcd65918",
"name": "Start",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "START",
"tot": "str"
},
{
"t": "set",
"p": "mariwifi",
"pt": "global",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 505,
"y": 440,
"wires": [
[
"f52b5651afc33c5f"
]
],
"l": false
},
{
"id": "0a94843d3af37ba3",
"type": "change",
"z": "681003fedcd65918",
"name": "Stop",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "STOP",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 585,
"y": 400,
"wires": [
[
"f52b5651afc33c5f",
"dc24bafce89d6a3a"
]
],
"l": false
},
{
"id": "f52b5651afc33c5f",
"type": "controltimer",
"z": "681003fedcd65918",
"name": "",
"timerType": "delay",
"timerDurationUnit": "minute",
"timerDurationType": "num",
"timerDuration": 1,
"timerLoopTimeoutUnit": "second",
"timerLoopTimeoutType": "num",
"timerLoopTimeout": 0,
"loopTimeoutMessageType": "str",
"loopTimeoutMessage": "LOOP_TIMEOUT",
"timerMaxLoopIterationsType": "num",
"timerMaxLoopIterations": 0,
"loopMaxIterationsMessageType": "str",
"loopMaxIterationsMessage": "MAX_LOOP_ITERATIONS",
"isConsecutiveStartActionTimerResetAllowed": false,
"isRunningTimerProgressVisible": true,
"outputReceivedMessageOnTimerTrigger": true,
"outputReceivedMessageOnTimerHalt": true,
"startTimerOnReceivalOfUnknownMessage": false,
"resetTimerOnReceivalOfUnknownMessage": false,
"isDebugModeEnabled": false,
"timerTriggeredMessageType": "str",
"timerTriggeredMessage": "TIMER_TRIGGERED",
"timerHaltedMessageType": "str",
"timerHaltedMessage": "TIMER_HALTED",
"isStartActionEnabled": true,
"isStopActionEnabled": true,
"isResetActionEnabled": true,
"isPauseActionEnabled": true,
"isContinueActionEnabled": true,
"actionPropertyNameType": "str",
"actionPropertyName": "payload",
"startActionNameType": "str",
"startActionName": "START",
"stopActionNameType": "str",
"stopActionName": "STOP",
"resetActionNameType": "str",
"resetActionName": "RESET",
"pauseActionNameType": "str",
"pauseActionName": "PAUSE",
"continueActionNameType": "str",
"continueActionName": "CONTINUE",
"x": 665,
"y": 440,
"wires": [
[
"37758122dd96c4bf"
],
[
"37758122dd96c4bf"
]
],
"l": false
},
{
"id": "37758122dd96c4bf",
"type": "switch",
"z": "681003fedcd65918",
"name": "",
"property": "mariwifi",
"propertyType": "global",
"rules": [
{
"t": "true"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 735,
"y": 420,
"wires": [
[
"7c7cfb8a0d11fc21"
]
],
"l": false
},
{
"id": "383f892d07f27238",
"type": "comment",
"z": "681003fedcd65918",
"name": "Убираем присутствие из дома только если за последние 3 минуты была закрыта дверь",
"info": "",
"x": 540,
"y": 220,
"wires": []
},
{
"id": "63ef86619be27df4",
"type": "comment",
"z": "681003fedcd65918",
"name": "",
"info": "Тут при подключениии срабатывает минутный таймер ожидающий закрытия двери. Если таймер истечет , дом еще раз проверит подключены ли вы к WIFI и если да оставит ваше присутствие дома.\n\nМне это нужно было, чтобы Алиса четко после закрытия двери запускала приветствие и все рабочие вещи по подсветке и тд, а не когда я еще на подходе к квартире.",
"x": 592.8571243286133,
"y": 325.7142696380615,
"wires": []
},
{
"id": "6caeb7a3.0661a8",
"type": "spruthub-server",
"name": "Мой Спрутхабушка",
"host": "10.10.10.41",
"api_port": "80"
},
{
"id": "ba753d3ede0325ae",
"type": "mqtt-broker",
"name": "",
"broker": "localhost",
"port": "1883",
"clientid": "",
"autoConnect": true,
"usetls": false,
"protocolVersion": "4",
"keepalive": "60",
"cleansession": true,
"birthTopic": "",
"birthQos": "0",
"birthPayload": "",
"birthMsg": {},
"closeTopic": "",
"closeQos": "0",
"closePayload": "",
"closeMsg": {},
"willTopic": "",
"willQos": "0",
"willPayload": "",
"willMsg": {},
"sessionExpiry": ""
}
]
Программный пакет Ядра 1-M Core превращает обычный роутер в центральный контроллер Умного Дома, совместимый с платформой 1-М Умный Дом (www.1-m.biz).
Ядро 1-M Core выполняет прием данных от датчиков, обработку сценариев, управление устройствами и другие функции системы Умного Дома.
Пользователю становятся доступны все возможности платформы 1-М Умный Дом:
- Оповещения о событиях дома: вторжение, дым, потоп и тп .
- Выполнение сценариев, в том числе автономное, при пропадании интернет (оффлайн).
- Запуск сценариев одной кнопкой или по условиям, событиям, суточным или недельным таймерам, прогнозу погоды, геопозиционированию и тп.
- Мониторинг и удаленное управление оборудованием со смартфона (Android) и через облачный WEB-интерфейс.
- Подключение облачных сервисов: прогноз погоды, геопозиционирование и др.
- Более эффективная, слаженная работа подсистем: отопления, полива, освещения и др.
- Ведение статистики работы устройств на облаке и многое другое.
(Для некоторых функций требуются доп. устройства и датчики…)
Как это работает?
Полноценная система Умного Дома состоит из роутера с установленным Ядром 1-М Core и оконечных устройств – датчиков, радиореле, WiFi-реле и тп.
Получение информации о состоянии датчиков и управление устройствами возможно по нескольким видам беспроводных каналов связи.
Без дополнительных конвертеров роутер может связываться с устройствами только по каналам WiFi и Ethernet.
Если устройство (датчик) поддерживает другой тип канала связи (радио RF, инфракрасный IR, Bluetooth, Z-Wave, ZigBee и другие), то нужно приобрести соответствующий шлюз (конвертер/приемо-передатчик).
Связь Ядра с датчиками и устройствами
Установка и настройка
Шаги по установке
1. В файл /etc/opkg.conf добавить строчку
src/gz keendev_1m ftp://cp.1-m.biz/1mcore
2. Выполнить
opkg update opkg install 1m-core-keenle
3. Шаги по созданию аккаунта/системы в Личном кабинете сервиса 1-М Облако и старта активации (получение кода активации).
Скрытый текст
- Зарегистрироваться (бесплатно) на сервисе 1-M Облако (http://cp.1-m.biz/)
- Создать систему. Добавить (перетащить) из палитры в качестве центрального контроллера вариант «Наносервер 1M Core».
- В настройках центрального контроллера выбрать активировать
- Выделить и скопировать появившийся код активации в буфер обмена
4. Ввод кода активации в роутере (вместо <activation code> вставить код активации, полученный в Личном кабинете сервиса 1-M Облако)
/opt/sbin/1m activate <activation code>
5. Процесс установки и активации ядра завершен.
Характеристики Ядра 1-M Core:
- размер пакета — 165 К
- нагрузка на проц — 1-3%
Кейсы использования:
-
Геолокация (можно попробовать без покупки дополнительных устройств) — отметка на карте зон, при в ходе или выходе из которых смартфона, подключенного к системе, происходит запуск сценария. Например, оповещение о приходе домой детей или выходе их за территорию школы во время учебы
- Много чего еще …
Перечень успешно проверенных моделей роутеров Zyxel:
- Keenetic Omni II Rev.A
- Zyxel Keenetic Giga II, прошивка 2.08 с установленным entware 3
Полезные ссылки:
Платформа 1-М Умный Дом www.1-m.biz
База знаний для того, чтобы задать вопрос
Раздел документации
Ссылка на приложение 1mSmart для Android на Google Play
Совместимые стандарты, протоколы связи и устройства
Edited by 1MSmartHome
Обновлен список совместимых роутеров.




















