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-адрес брокера, порт, пользователя и пароль в случае необходимости авторизации
подписку и публикацию не трогаем, пусть останется как есть.
2. Этот пункт необязателен, если кнопка и\или нагрузка не используют gpio4 и gpio5.
Я в своём случае "отвязал" от этих gpio I2С интерфейс, для этого на закладке HARDWARE нужно SDA и SCL выставить в NONE.
3. "Вешаем кнопку" на gpio.
В своём случае я использовал gpio4, на закладке Devices создаём новое устройство Switch input - Switch, даём имя sw1, ставим галку (она автоматически ставится) PullUP ,назначаем gpio , Switch Button Type выбираем Push Button Active LOW (кнопка будет замыкаться на землю), Value называем state (можно по-другому, не суть важно).
Галочку "send to controller" снимаем, нам не интересно контролировать нажатие кнопки, мы (позже) проконтролируем реакцию на нажатие кнопки.
Имя устройства и имя параметра (value) нам понадобятся далее в скрипте, поэтому названия лучше давать не длинные и удобные для понимания.
4. Делаем "прослушивание" MQTT, что бы изменение в топике приводило к реакции на нужном пине.
В DEVICES создаём новое устройство Generic - MQTT Import, даём устройству имя (я дал имя sniff, как в мануале прошивки, можно естественно обозвать по-своему), указываем топик/%sysname%/GPIO5, изменения в котором будем "отслеживать", value указываем как последний "уровень" в топике - GPIO5, именно оно будет отслеживаться.
Имя устройства и имя value нам понадобятся далее в скрипте.
(следует отметить что здесь переменная %sysname% в названии топика у меня не сработала поэтому я указал имя устройства напрямую, как оно задано в конфиге пошивки)
5. Далее нужно создать правило, то есть маленький скрипт который будет:
- реагировать на кнопку
- публиковать состояние gpio
- регировать на изменение в топике (в зависимости от топика дёргать gpio).
(Закладка RULES включается в Tools / Advanced settings.)
Скрипт:
Краткое пояснение:
- в первой части скрипта (правила) проверяется состояние кнопки (см. п.3) по имени sw1 и свойству state
когда кнопка нажата (активный НОЛЬ то есть LOW уровень) gpio5 выставляется в лог.1 и публикуется состояние в соответствующем топике (топики тут и в п.4 должны совпадать)
иначе gpio5 выставляется в лог.0 и так же публикуется состояние
- во второй части скрипта "слушается" нужный топик (см. п.4), при публикации в нём 1 (единички) gpio5 выставляется в лог.1
при публикации 0 (нуля) gpio5 выставляется в лог.0
В итоге всё работает как и задумано - светодиод на gpio5 включается и выключается как по нажатию кнопки, так и по изменению в соответствующем топике.
Используемые материалы:
настройка MQTT-импорта
как делать Rules, пример, ещё
команда в rules на публикацию mqtt
PS
Тему создал в общем то для себя, что б не забыть как что делал, но надеюсь кому-то будет полезным.
Есть замысел управления нагрузкой (светом например) и с кнопки (на стене в случае света) и по 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-адрес брокера, порт, пользователя и пароль в случае необходимости авторизации
подписку и публикацию не трогаем, пусть останется как есть.
2. Этот пункт необязателен, если кнопка и\или нагрузка не используют gpio4 и gpio5.
Я в своём случае "отвязал" от этих gpio I2С интерфейс, для этого на закладке HARDWARE нужно SDA и SCL выставить в NONE.
3. "Вешаем кнопку" на gpio.
В своём случае я использовал gpio4, на закладке Devices создаём новое устройство Switch input - Switch, даём имя sw1, ставим галку (она автоматически ставится) PullUP ,назначаем gpio , Switch Button Type выбираем Push Button Active LOW (кнопка будет замыкаться на землю), Value называем state (можно по-другому, не суть важно).
Галочку "send to controller" снимаем, нам не интересно контролировать нажатие кнопки, мы (позже) проконтролируем реакцию на нажатие кнопки.
Имя устройства и имя параметра (value) нам понадобятся далее в скрипте, поэтому названия лучше давать не длинные и удобные для понимания.
4. Делаем "прослушивание" MQTT, что бы изменение в топике приводило к реакции на нужном пине.
В DEVICES создаём новое устройство Generic - MQTT Import, даём устройству имя (я дал имя sniff, как в мануале прошивки, можно естественно обозвать по-своему), указываем топик/%sysname%/GPIO5, изменения в котором будем "отслеживать", value указываем как последний "уровень" в топике - GPIO5, именно оно будет отслеживаться.
Имя устройства и имя value нам понадобятся далее в скрипте.
(следует отметить что здесь переменная %sysname% в названии топика у меня не сработала поэтому я указал имя устройства напрямую, как оно задано в конфиге пошивки)
5. Далее нужно создать правило, то есть маленький скрипт который будет:
- реагировать на кнопку
- публиковать состояние gpio
- регировать на изменение в топике (в зависимости от топика дёргать gpio).
(Закладка RULES включается в Tools / Advanced settings.)
Скрипт:
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
Тему создал в общем то для себя, что б не забыть как что делал, но надеюсь кому-то будет полезным.
Последнее редактирование: