Меню управления - переключатель с обратной связью по MQTT
Добавлено: Чт ноя 10, 2016 3:37 pm
Добрый день!
Который день не могу побороть казалось бы простую задачку со скачущими переключателями в меню управления при наличии обратной связи от исполнительного устройства по MQTT (хотя думаю так же будет и по HTTP и т.п.).
Суть проблемы: по дому разбросано несколько модулей на ESP8266 управляющих через реле светом и т.д.
В меню управления для них накиданы переключатели.
Модули с реле раз в несколько секунд посылают свой статус на сервер. В результате даже если сам majordomo был перезагружен или еще что стряслось - после приема статуса сервером в меню управления все переключатели сами встают в соответствии с актуальными состояниями реле. Удобно.
Но есть проблема - при клике на переключатель в панели управления он дважды гуляет туда-сюда, т.е. делает выкл->вкл->выкл->вкл вместо просто выкл->вкл.
Как я понимаю происходит следующее:
1. Нажали на перключатель в меню управления. Он меняет свое состояние в интерфейсе (например был выключен - стал включен) и поле status.
2. На событие смены состояния переключателя генерируется посылка по MQTT на переключение нужного реле.
3. Начинается цикл обмена данными с брокером MQTT в majordomo. В этом цикле на реле посылается новый статус (включено), но до самого реле этот статус еще не дошел. В этом же цикле majordomo получает от брокера последнее состояние реле - а оно пока еще выключено. В результате у переключателя в меню управления меняется статус, и он снова получается выключен.
4. До реле дошел новый статус, оно включилось. Переключатель как был выключен, так и остался.
4. На следующем цикле обмена с брокером MQTT majordomo получает уже новый статус реле (только что включилось), и снова меняет значение переключателя в меню управления на правильное (включен).
Как это побороть?
Который день не могу побороть казалось бы простую задачку со скачущими переключателями в меню управления при наличии обратной связи от исполнительного устройства по MQTT (хотя думаю так же будет и по HTTP и т.п.).
Суть проблемы: по дому разбросано несколько модулей на ESP8266 управляющих через реле светом и т.д.
В меню управления для них накиданы переключатели.
Модули с реле раз в несколько секунд посылают свой статус на сервер. В результате даже если сам majordomo был перезагружен или еще что стряслось - после приема статуса сервером в меню управления все переключатели сами встают в соответствии с актуальными состояниями реле. Удобно.
Но есть проблема - при клике на переключатель в панели управления он дважды гуляет туда-сюда, т.е. делает выкл->вкл->выкл->вкл вместо просто выкл->вкл.
Как я понимаю происходит следующее:
1. Нажали на перключатель в меню управления. Он меняет свое состояние в интерфейсе (например был выключен - стал включен) и поле status.
2. На событие смены состояния переключателя генерируется посылка по MQTT на переключение нужного реле.
3. Начинается цикл обмена данными с брокером MQTT в majordomo. В этом цикле на реле посылается новый статус (включено), но до самого реле этот статус еще не дошел. В этом же цикле majordomo получает от брокера последнее состояние реле - а оно пока еще выключено. В результате у переключателя в меню управления меняется статус, и он снова получается выключен.
4. До реле дошел новый статус, оно включилось. Переключатель как был выключен, так и остался.
4. На следующем цикле обмена с брокером MQTT majordomo получает уже новый статус реле (только что включилось), и снова меняет значение переключателя в меню управления на правильное (включен).
Как это побороть?