Товары из Китая

Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.


  • Цена: 120 руб за ESP8266 и ненужный Android смартфон
  • В статье описывается вариант подачи как дискретных, так и ШИМ сигналов, исполнителем которых является плата на контроллере ESP8266, а посредником — Android телефон с доступом в Интернет и с установленной системой визуального потокового программирования Node-RED и MQTT-брокером mosquitto. Аналогично будет продемонстрирован вывод показаний температуры по запросу из Телеграм с помощью датчика ds18b20. Также будет показана возможность сохранения ресурса аккумулятора при постоянно подключенном зарядном устройстве через недозаряд при помощи linux-скрипта ACC.

    Обладателям старых Android-смартфонов и газовых котлов на даче посвящается!

    Введение

    Моя задача на данную статью — показать лишь базовые возможности организации дискретного и ШИМ управления через Telegram-бота, иначе бы текст получился слишком раздутый.

    На данный момент, существует три наиболее легких способа получить контроль над Arduino-устройством через интернет:

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

    2. Arduino cloud — аналогично, ограниченное количество контролируемых выводов в бесплатной версии, зависимость от чужого облака.

    3. Node-RED Богатый функционал при бесплатности. Возможность организовать на «белом» IP доступ к выстроенной панели управления приборами из любой точки земли, либо настроить общение через Telegram-бота. Встраивается в системы управления умным домом, например Home assistant, но и сама по себе представляет широкие возможности для построения автоматизации различной сложности.

    Следует отметить, что автоматизация на Node-RED уже затрагивалась на данном ресурсе — №1, №2, что говорит об универсальности данной системы программирования.

    Мы же будем действовать по такой схеме (чертил в diagrams.net, рекомендую):

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    Приложение Telegram на компьютере или смартфоне через бота отправляет команду (через меню команд, глобальную клавиатуру или клавиатуру под сообщением). Команда доходит до Node-RED, хостящейся на смартфоне под управлением Android с установленным приложением Termux (на котором поднят Node.js). Далее специальный модуль node-red-contrib-telegrambot обрабатывает полученную команду, интерпретирует ее в команды топиков MQTT, брокер которого тоже хостится на Android-телефоне посредством Termux. Платы контроллеров с wi-fi со специально адаптированной прошивкой (с подписками на соответствующие топики) следят за изменением событий на подписанных топиках и при изменении посылают сигнал на дискретные выходы.

    Как видно, при этом мы вольны как угодно распоряжаться балансом сложности логики контроллер-потоки Node-RED и в зависимости от задачи оставлять сложную логику на стороне контроллера или водружать ее на плечи Node-RED.

    Видео демонстрирует возможность как дискретного управления 6 светодиодами, так и пропорционального управления ими же, с шагом 25% (чтобы не усложнять логику работы с двумя клавиатурами бота телеграм). А также позволяет запрашивать текущую температуру с датчика ds18b20.

    Чтобы организовать всю эту систему нам нужно:

    1. Выбрать сервер под Node-RED и mosquitto. Сервером будет служить смартфон под управлением Android версии не ниже 7.

    2. Установить на сервер приложение Termux.

    3. В Termuxe поднять node.js, установить зависимости для Node-RED и установить саму Node-RED. Установить брокер MQTT mosquitto.

    4. Написать логику работы с Телеграм-ботом в Node-RED.

    5. Написать прошивку под вышеозначенную логику для wi-fi-контроллеров.

    6. Разобраться с деградацией аккумулятора телефона-сервера при постоянно подключенном к сети состоянием посредством скрипта ACC.

    1. Выбор сервера

    Для систем домашней автоматизации принято использовать одноплатные компьютеры, например: orange pi, banana pi. Однако, в базовой комплектации они хранят свои данные на простой microSD, которая исчерпывает свой срок службы не столько за сравнительно короткое время (от полугода до года), но вдобавок еще и умирает внезапно, что несет определенные риски. Конечно, можно настроить ОС на минимацию записи на диск, но при наличии активной БД, все равно результат будет плачевным. Выходом может служить покупка nand-модуля памяти, но тогда и так не бюджетная система еще сильнее оттягивает карман. А ведь к ней нужно еще докупать ИБП модуль с аккумуляторами.

    Автор уверен, что в современном хозяйстве с большой долей вероятности найдется ненужный Android-телефон, в котором уже имеется Nand-памят и встроенный ИБП в виде аккумулятора. Даже если версия системы будет меньше 7, то на известном ресурсе наверняка найдется ветка с достаточным количеством актуальных прошивок. Для наших нужд достаточно будет от 1.5ГБ ОЗУ (думаю, даже с 1ГБ все заведется).

    У меня основным сервером служит Jiayu S3 без физического экрана. Будучи один раз настроенным на отладку по USB в заранее сохраненную виртуальную машину, я, при необходимости увидеть рабочий стол телефона, подключаюсь к нему через программу Scrcpy. Но 99% времени я взаимодействую с сервером через командную строку по SSH.

    2. Установка Termux

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

    Внимание, версия из Google Play не поддерживается и не рекомендуется к установке!

    3. Поднимаем Node-RED в Termux

    Если не собираетесь поднимать Node-RED на смартфоне, можно сразу переходить к п.4.

    Чтобы не мучиться с неудобной клавиатурой смартфона, предлагаю законнектиться к телефону по SSH и с компьютера комфортно вводить команды через копипаст. Для этого надо установить OpenSSH и задать пароль.

    Запускаем Termux и в нем проделываем последовательность команд

    Порядочное количество терминальных команд Linux
    pkg update

    В случае запроса, чей пакет ставить — нажимает Y, т.е. пакет мейнтейнера.

    pkg install openssh
    
    passwd

    Задаем пароль, запускаем сервер SSH командой

    sshd

    и уже с компьютера (который находится в одной сети с телефоном) вводим

    ssh -p 8022 x.x.x.x

    Где x.x.x.x ваш IP, который можно узнать через команду ifconfig (секция wlan0).

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

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    А если вы установите

    pkg install termux-api

    И выполните в консоли

    termux-setup-storage

    Затем подтвердите на смартфоне запрос на доступ к файловой системе, то в домашней папке Termux будете иметь смонтированную домашнюю директорию Android. Кстати, на скрине Termux с настроенной оболочкой zsh и темой PowerLevel10K. Здесь написано, как все это настроить.

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    Начинаем подготовку зависимостей для Node-RED.

    pkg install wget
    
    wget https://raw.githubusercontent.com/its-pointless/its-pointless.github.io/master/setup-pointless-repo.sh
    chmod +x setup-pointless-repo.sh
    ./setup-pointless-repo.sh

    Скрипт отрабатывает криво и настраивает репозиторий с древними версиями gcc. Надо это поправить.

    nano /data/data/com.termux/files/usr/etc/apt/sources.list.d/pointless.list

    И меняем 21 на 24, сохраняемся по Ctrl+O, выходим из nano по Ctrl + X и делаем

    pkg update
    pkg install python make clang gcc-11 nodejs-lts
    
    npm i -g --unsafe-perm node-red
    termux-fix-shebang $(which node-red)

    Теперь установим mosquitto.

    pkg install mosquitto

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

    nano /data/data/com.termux/files/usr/etc/mosquitto/mosquitto.conf

    добавляем в конце файла:

    listener 1883
    
    allow_anonimus true

    Настроим автозапуск. Для этого из магазина F-Droid нужно скачать приложение Termux:Boot и единоразово запустить его. Далее

    cd .termux
    
    mkdir boot
    cd boot
    nano start.sh

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

    #!/data/data/com.termux/files/usr/bin/sh
    
    termux-wake-lock
    sshd & mosquitto -c /data/data/com.termux/files/usr/etc/mosquitto/mosquitto.conf & node-red

    Внимание! После апгрейда Node-RED на новую версию, нужно сделать

    termux-fix-shebang $(which node-red)

    один раз, иначе автозагрузка Node-RED не будет работать.

    Сохраняемся. Вводим в терминале

    termux-wake-lock

    На смартфоне должно высветиться предложение не ограничивать работу приложения Termux в фоне. Соглашаемся.

    После перезагрузки в менеджере процессов по команде top должен быть Node-RED.

    4. Работа в Node-RED.

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

    http://x.x.x.x:1880/

    Видим приветственное сообщение и после него редактор Node-RED

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

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

    Сначала нам нужно установить модуль node-red-contrib-telegrambot. Для этого в правом верхнем углу щелкаем на «гамбургер» и жмем «Manage palette» (alt + p), выбираем «Install» и вводим node-red-contrib-telegrambot, жмем «Install». Если Node-RED просит перезапуститься, чтобы модуль заработал, то перезапускаемся.

    4.1 Создание и настройка бота Телеграм

    Теперь наша задача создать своего Телеграм-бота, получить его токен и Chat-ID диалога с ботом, а далее внести эти данные в поток. Переходим в https://t.me/botfather, в меню выбираем /newbot, задаем имя бота, юзернейм, заканчивающийся на «bot» и получаем в ответном сообщении токен

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    Для получения ChatID своего бота cоздаем следующую конструкцию из нод, находящихся в левой части редактора. Это простейший бот, возвращающий отосланное сообщение.

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    Два быстрых клика на ноде «Telegram receiver» и перед нами окно создания нового бота. Нажимаем на карандаш, вводим имя бота и наш токен. Нажимаем на Done. И применяем изменения по кнопке Deploy в правом верхнем углу

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

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

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    А в правой части редактора на вкладке «Debug» будет отображен Payload нашего сообщения (т.к. на выход мы подключили отладочную ноду). Запишем из него chatId.

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    Далее нам нужно импортировать мой поток (Flow), где я разместил логику работы Телеграм-бота (берем на Pastebin). Жмем на «гамбургер» и выбираем «Import» (ctrl + i). Вставляем мой JSON и после импорта в редакторе должна появиться вкладка Telegram LEDs с настроенным потоком:

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    Заметьте, что фильтр потока яркости лампы я сделал двумя способами — с функциональной нодой и на стандартных нодах. Первый вариант информативнее, но занимает больше места в редакторе. Сочетание данных стилей позволяет сделать ваши потоки по-настоящему простыми в восприятии.

    Перенастраиваем все Telegram-ноды на своего бота. Для этого при двойном клике на соответствующей ноде выбираем свого бота. А также во всех функциональых нодах «Sent to TG light number» в chatId нужно вставить свой chatId. В розовых нодах MQTT нужно поменять IP на IP смартфона. Не забываем задеплоить изменения.

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    4.2 Создание набора команд в меню Telegram

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

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    Для этого в BotFather набираем /setcommands выбираем своего бота и задаем список команд с описанием в соответствии с синтаксисом. Например:

    temp - Температура ds18b20
    
    leds - Выбор светодиодов
    red - 5 степеней ШИМ красного LED
    green1 - 5 степеней ШИМ зеленого LED1

    4.3 Поток считывания температуры с ds18b20

    Делаем уже знакомую нам операцию импортирования потока (берем на Pastebin). Настраиваем ноды Telegram, MQTT и в функциональной ноде записываем свой chatId.

    4.4 Мониторим сообщения в MQTT-топиках

    Уже сейчас мы можем посмотреть первые результаты работы. Для этого нам нужен MQTT-клиент. Рекомендую MQTT Explorer. Им мы будем мониторить изменения в наших топиках.

    После запуска программы настраиваем подключение в соответствии с IP нашего MQTT-сервера.

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    И после соединения мы уже будем видеть активный топик $SYS. Если сейчас послать в диалог нашего бота команду /temp то появится топик Temp с сообщением Request=Yes. Аналогично и с другими командами.

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

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

    5. Написание прошивки для Wi-Fi микроконтроллера

    Для Arduino есть несколько библиотек, реализующих протокол MQTT. Мы остановимся на PubSubClient, как наиболее популярной и имеющей подробную документацию. Примеры ее использования есть в поставляемой документации, а также на замечательном сайте Стива.

    Прикрепляю код на Pastebin. Для его работы нужны библиотеки DallasTemperature by Miles Burton, OneWire by Paul Stoffregen и, собственно, сам PubSubClient. Отмечу, что чтобы функционально реализовать работу с ШИМ, мне потребовалось вынести обработку входящих данных из функции callback в основной цикл. Обратите внимание на пины, к которым подключены ds18b20 и светодиоды.

    6. Скрипт ACC продляет жизнь аккумулятору при постоянно подключенной зарядке

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

    1. Постоянное нахождение в режиме 100% заряженности, что вредно для Li-ion аккумуляторов.

    2. Если контроллер заряда телефона не поддерживает прямую поставку тока к потребителю, в обход аккумулятора при достижении 100% зарядки аккумулятора, то он будет находиться в постоянном цикле заряд-микроразряд. Что также вредно.

    Для решения эти проблем существует скрипт ACC. Внимание, для его работы нужны root-права! Вот статистика работы аккумулятора моего смартфона с этим скриптом за 20 дней.

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    Как видно, за этот период батарея ни разу не заряжалась полностью. А если бы не такой большой промежуток, можно было бы увидеть «пилу» между зарядом от 60%, ниже которого при подключенной зарядке телефон не разряжается, и до 70%, после которого идет разряд при подключенном зарядном устройстве.

    Скрипт устанавливается как модуль Magisk и после перезагрузки запускается сам. Существует android приложение ACCA, позволяющее наглядно управлять параметрами скрипта.

    Управляем освещением и смотрим температуру посредством Telegram-бота, который хостится на Android телефоне с помощью Node-RED.

    Заключение

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


СМОТРИ ТАКЖЕ

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

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