• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом ESPEasy: кнопка + реакция на кнопу (нагрузка) + MQTT в обе стороны

prmres

New member
Здравствуйте, уважаемые.
Есть замысел управления нагрузкой (светом например) и с кнопки (на стене в случае света) и по MQTT.
Нажал кнопочку - свет включился (или выключился), состояние опубликовалось в соответствующем топике, так же надо реализовать и "обратную связь", то есть отследить изменение топика и соответственно включить или выключить свет.
Понятно что можно писать скетч самому, можно найти готовый, а когда опыта программирования нет или его мало, то можно попытаться реализовать затею на готовой прошивке.
Хочу поделиться как это сделать на ESPEasy.
Эта прошивка в общем то универсальная, куча всего подключается прямо из веб-интерфейса, но вот в частности реакцию на каком-то пине по нажатию кнопки а так же "отслеживание" топиков mqtt с соответствующей реакцией как оказалось сделать не совсем просто, однако вполне возможно.

Исходные данные примера:
1. прошивка ESPEasy MEGA (установка и настройка описываться не будет, предполагаем что есть и настроена) использовал Release mega-20180119, на последней mega-20180228 у меня жутко тормозит веб-интерфейс
2. ESP12 в виде готового модуля Witty Cloud
3. тактовая кнопка в качестве кнопочного выключателя, на gpio4 с замыканием на gnd
4. светодиод в качестве "наглядной" нагрузки, на gpio5
5. mqtt-spy в качестве MQTT-клиента для отслеживания топиков и проверки реакции на публикацию
6. MQTT брокер moquitto (установку и настройку расписывать не буду, предполагается что оно есть и настроено)

Итак, приступим.

1. Создаём подключение к MQTT брокеру.
Протокол я выбрал OpenHAB MQTT, но в сущности это неважно, влияет только на порядок формирования топиков.
Указываем IP-адрес брокера, порт, пользователя и пароль в случае необходимости авторизации
подписку и публикацию не трогаем, пусть останется как есть.
1.jpg

2. Этот пункт необязателен, если кнопка и\или нагрузка не используют gpio4 и gpio5.
Я в своём случае "отвязал" от этих gpio I2С интерфейс, для этого на закладке HARDWARE нужно SDA и SCL выставить в NONE.
2.jpg

3. "Вешаем кнопку" на gpio.
В своём случае я использовал gpio4, на закладке Devices создаём новое устройство Switch input - Switch, даём имя sw1, ставим галку (она автоматически ставится) PullUP ,назначаем gpio , Switch Button Type выбираем Push Button Active LOW (кнопка будет замыкаться на землю), Value называем state (можно по-другому, не суть важно).
Галочку "send to controller" снимаем, нам не интересно контролировать нажатие кнопки, мы (позже) проконтролируем реакцию на нажатие кнопки.
Имя устройства и имя параметра (value) нам понадобятся далее в скрипте, поэтому названия лучше давать не длинные и удобные для понимания.
3.jpg

4. Делаем "прослушивание" MQTT, что бы изменение в топике приводило к реакции на нужном пине.
В DEVICES создаём новое устройство Generic - MQTT Import, даём устройству имя (я дал имя sniff, как в мануале прошивки, можно естественно обозвать по-своему), указываем топик/%sysname%/GPIO5, изменения в котором будем "отслеживать", value указываем как последний "уровень" в топике - GPIO5, именно оно будет отслеживаться.
Имя устройства и имя value нам понадобятся далее в скрипте.
(следует отметить что здесь переменная %sysname% в названии топика у меня не сработала поэтому я указал имя устройства напрямую, как оно задано в конфиге пошивки)
4.jpg

5. Далее нужно создать правило, то есть маленький скрипт который будет:
- реагировать на кнопку
- публиковать состояние gpio
- регировать на изменение в топике (в зависимости от топика дёргать gpio).
(Закладка RULES включается в Tools / Advanced settings.)

5.jpg

Скрипт:

on sw1#state do
if [sw1#state] = 0
gpio,5,1
Publish /%sysname%/GPIO5,1
else
gpio,5,0
Publish /%sysname%/GPIO5,0
endif
endon

on sniff#GPIO5 do
if [sniff#GPIO5] = 1
gpio,5,1
if [sniff#GPIO5] = 0
gpio,5,0
endif
endon

Краткое пояснение:
- в первой части скрипта (правила) проверяется состояние кнопки (см. п.3) по имени sw1 и свойству state
когда кнопка нажата (активный НОЛЬ то есть LOW уровень) gpio5 выставляется в лог.1 и публикуется состояние в соответствующем топике (топики тут и в п.4 должны совпадать)
иначе gpio5 выставляется в лог.0 и так же публикуется состояние

- во второй части скрипта "слушается" нужный топик (см. п.4), при публикации в нём 1 (единички) gpio5 выставляется в лог.1
при публикации 0 (нуля) gpio5 выставляется в лог.0

В итоге всё работает как и задумано - светодиод на gpio5 включается и выключается как по нажатию кнопки, так и по изменению в соответствующем топике.

Используемые материалы:
настройка MQTT-импорта
как делать Rules, пример, ещё
команда в rules на публикацию mqtt

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

kab

New member
kab, спасибо, добавил
Я имел в виду встроенную возможность сайта:
- когда редактировали заголовок - перед своим текстом было поле с выпадающим меню. Там можно выбрать сразу типа "делюсь опытом", "задаю вопрос" и т.д.
 

prmres

New member
kab, слона то я и не заметил :)
сделал как правильно, теперь красиво
 
  • Like
Реакции: kab

corpse

New member
У меня сделано очень похоже. Есть одна существенная проблема: как только по какой-то причине mqtt сервер недоступен, девайс перестаёт реагировать на нажатие кнопки. Иногда может включить/выключить один раз из 10 нажатий, затем и эта возможность пропадает. Если найдёте решение этой проблемы - отпишитесь пожалуйста. Представьте ситуацию - нужно перенести/поменять/перенастроить девайс, на котором бежит mqtt и делать это вы можете либо в полной темноте без возможности включить свет, либо при освещении без возможности его выключить. Либо нужно разбирать распределительные коробки, например, лезть под фальшпотолок и т.п.. Можно в такой ситуации попробовать дёрнуть гпио через апи, но не знаю, сработает ли. При случае проверю.
 

prmres

New member
Нашёл прошивку для управления группой реле, идеально сделанную как для ESP так и ждя ардуины меги (до 48 каналов реле)
 

prmres

New member
А не было проблем с фантомными нажатиями?
были проблемы с "зацикливанием" нажатий при определенных условиях, но это исправлено
работает стабильно, по крайней мере на "на коленке собранной" модели, 4 физические кнопки (проводки замыкаю) и 4 релюшки
ссылку на прошивку давал вот тут: https://esp8266.ru/forum/threads/esp8266-rele-vremeni.2943/#post-48851
попробуйте
 

Val

New member
prmres,
Подскажите как управлять реле через MQTT?
Прошивка ESPeasy
Подключил примерно по такой схеме реле.
WiFiRelayCircuit.png
Настроил как в статье,только не выводил отдельно кнопку на вкл/выкл. - нужно управлять только через интернет.
Если пишу локально команды вида
Включить: http://192.168.0.23/control?cmd=GPIO,13,1
Выключить: http://192.168.0.23/control?cmd=GPIO,13,0
то реле вкл/выкл -как положено,вопросов нет всё работает.
А вот если через MQTT(сервер в интернете cloudmqtt.com) пишу в топик /ESP_Easy/GPIO13 сообщение 1 или 0, то во вкладке Devices Generi -MQTT Import состояние GPIO13 меняется, а состояние реле state - не меняется
Посмотрите где ошибка.Чёт видно не до конца вкурил логику работы этой прошивки.
Снимок6.PNG Снимок6.PNG Снимок4.PNG Снимок3.PNG Снимок2.PNG
 

Val

New member
Схему привёл как примерный пример,в реале подключено GPIO13 - D7,всё работает, не могу разобраться как управлять реле через MQTT. Подскажите,очень нужно.
 

Val

New member
CodeNameHawk, т.е нет возможности управлять по mqtt?только http? Так я понял? Поясню что хочу получить.Управлять gpio(реле) для ВКЛ/выкл нагрузки удалённо, через интернет. Провайдер выдаёт серый ip(yota), по другому подключиться не могу,вариант был только с mqtt.
 

Сергей_Ф

Moderator
Команда форума
@Val йота на тарифе Бизнес позволяет иметь "белый" ip. Это дороже, конечно.
Или пробуйте Blynk.
 
Последнее редактирование:

Val

New member
Сергей_Ф, Я поднастроил роутер с ётой,и получил бесплатный инет,скорость небольшая,но для датчиков хватает, лучше попробую другую прошивку -от Wifi-iot.
 
Сверху Снизу