m0nochr0me
4 min readNov 13, 2020

IoT — pt.0— Over-engineered remote control for PC with MQTT and Python

Ξ

Интернет вещичек — Часть 0 — Переусложненный пульт дистанционного управления

Остановить воспроизведение видео на YouTube, когда ты уже уютно устроился под одеялом, можно несколькими способами: можно поднять себя с дивана, и нажать кнопку play/pause; а можно поднять систему дистанционного нажимания кнопок с помощью MQTT и Python’а.

MQTT это простой протокол, рассчитанный на работу в тяжелых сетевых условиях, который хорошо подходит для устройств Интернета Вещей (Internet of Things). Подробнее о нем можно почитать в статье на Хабрахабре.

В общих словах, описание системы будет такое:
На десктопе работает клиентский агент, который, во-первых, получает от MQTT сервера сообщения, относящиеся к управлению медиаплеером, а во-вторых, отправляет информацию об уровне громкости обратно на сервер;
Где-то, например на Raspberry Pi (или на VPS DigitalOcean’а), работает MQTT сервер Mosquitto, с которым будут соединяться клиенты.
На смартфоне, установлен дашборд, с помощью которого отправляются команды агенту на десктопе, и в котором отображается информация от него или других клиентов, например датчиков температуры.

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

Настройка Mosquitto

С помощью менеджера пакетов ставим сервер:

$ yay -Syu mosquitto

В вашем дистрибутиве команда может быть другой.

Далее нужно отредактировать конфиг /etc/mosquitto/mosquitto.conf

Обращаем внимание на следующие параметры:

persistence_location /opt/mosquitto/

Это директория в которой будет храниться база данных сервера.
Она должна существовать и быть доступна для записи пользователю mosquitto.

$ sudo mkdir /opt/mosquitto
$ sudo chown mosquitto:root /opt/mosquitto
$ ll /opt/

drwxr-xr-x 2 mosquitto root 4096 Nov 13 18:04 mosquitto

ll это алиас для ls -l

Второй параметр:

listener 19780

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

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

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

$ sudo mosquitto_passwd -c /etc/mosquitto/passwd mqttlogin

Опция -c затрёт существующий файл /etc/mosquitto/passwd. Будьте осторожны.

Теперь сервер можно запускать.

$ sudo systemctl enable --now mosquitto.service

Для проверки в одном терминале запустим:

$ mosquitto_sub -h 127.0.0.1 -p 19780 -t "test" -u "mqttlogin" -P "MQttPassWord123"

А в другом:

$ mosquitto_pub -h 127.0.0.1 -p 19780 -t "test" -m "hello" -u "mqttlogin" -P "MQttPassWord123"

И если всё нормально, в первом терминале мы увидим сообщение hello.

Несмотря на использование пароля, само соединение не будет шифроваться.
Это необходимо иметь ввиду, если открывать доступ к MQTT серверу из интернета.

Клиентский агент

Сначала необходимо установить зависимости. Либо с помощью менеджера пакетов, либо pip’ом.

$ yay -Syu python-psutil python-pulsectl python-paho-mqtt

Где-нибудь, в удобном месте (я обычно использую для этого ~/bin/) создаем директорию mqtt-desktop-agent, а в ней пару файлов:

В файле config.py указываем IP сервера, и логин/пароль соединения.

Затем создаем файл ~/.config/systemd/user/mqtt-desktop-agent.service:

Редактируем в нем путь своей домашней директории в соответствии с именем пользователя.

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

Включаем и запускаем агента, и разрешаем lingering, для автоматического запуска:

$ systemctl --user enable --now mqtt-desktop-agent.service
$ sudo loginctl enable-linger yourusername

Дашборд

Ставим приложение Mqtt Dashboard, добавляем в список брокеров наш сервер, указав его IP, порт и учетные данные.

Кстати, в терминах MQTT сервер называется брокером.

После этого добавляем пару плиток.
Одну типа “Стандартные-Кнопка”:

Тут параметры говорят сами за себя. Посмотрите в файл config.py агента, и вы поймете как задается топик для публикации.
Точно таким же образом можно добавить еще две кнопки, указав в payload соответственно prev и next, для переключения треков в проигрывателе вперёд и назад.

И еще одну плитку типа “Стандартные-Прогресс”:

В этом случае всё немного хитрее. Агент публикует в топик /home/desktop/stat информацию о системе в виде JSON, а кнопка в дашборде публикует значение громкости в топик /home/desktop/media/volume.

И для корректного отображения информации о текущей громкости в системе (ведь она может меняться не только через дашборд) нужно включить опцию “Payload в JSON” и прописать корректный json path, заменив user-desktop в пути на hostname системы, где запущен агент.

Заключение

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

В следующих статьях я постараюсь рассказать об управлении освещением в квартире с помощью этого же дашборда.