@ravend здравствуйте!
Опишу две ситуации, в которых у меня возникает одно и тоже затруднение в использовании вашей программы. В конце описано предлагаемое решение.
Ситуация №1. На кухне подсветка под гарнитуром по-умолчанию у меня включается если кто-то находится на кухне (по датчику движения).
Датчик движения можно программно отключить (сообщения об движении всё равно будут поступать, но лента не будет загораться) и задать нужную яркость вручную.
Чтобы днём, при ярком естественном свете, при движении на кухне лента не горела зря, она отключается при определенном уровне освещения и включается, если становится темно.
Т.е. датчик движения может быть отключен как человеком, так и автоматикой. При этом отключение человеком имеет приоритет и в таком случае автоматика уже не может вама вклчить датчик движения.
Датчик движения у меня включается\или отключается путём посылки on или off в топик /set/ku/pir/state. Соответственно в вашей программе создан виджет Switch.
Если речь идёт только об ручном управлении, то всё нормально. Но когда датчик отключается автоматически (днём при ярком свете), то как сделать так, чтобы я это увидел в программе?
Можно сделать так, чтобы контроллер при автоматическом отключении датчика слал off в топик /set/ku/pir/state и в вашей программе отобразится правильное положение переключателя, но... тут есть проблема. Это сообщение тут же вернётся в контроллер и он будет "думать", что эту команду подал человек... Ведь контроллер не может понять что это сообщение было отправлено им самим, а не человеком через вашу программу...
Ситуация №2. В комнате над окном на потолочном карнизе у меня приклеена лента. Лентой можно управлять как с "крутилки" (потенцио́метром), так и путём отправки сообщения (яркости) в топик /set/za/le
В вашей программе для управления яркостью у меня создан виджет - slider. Если управлять яркостью через программу, то всё нормально.
А вот как сделать так, чтобы когда я изменил яркость "крутилкой", в вашем приложении отобразилось выставленная яркость?
Первое что приходит на ум - после того как человек закончит крутить "крутилку", отправить сообщение с яркостью в топик /set/za/le. Это сработает, в приложении отобразится текущая яркость, выставленная потенциометром.
Но проблема (в данном случае она не очень серьезная) в том, что контроллер, опять же, получит своё же сообщение и не применяя каких-нибудь программных "костылей" он не сможет понять, что это сообщение от него самого, а не от человека. И если в данной ситуации это совсем не страшно, то в первой - это проблема.
Надеюсь я доходчиво объяснил суть проблемы. Решение мне видится довольно простым. Нужно во все виджеты, предусматривающие изменения своего состояние при получении сообщения, сделать опциональную настройку с указанием топика, из которого (наряду с основным топиком), ваша программа будет брать значения для виджета.
Т.е. если сейчас у меня настроен виджет таким образом
Widget type: Switch
Name Датчик движения
Topic /set/va/pir/state
'On' value on
'Off' vslue off
То для решения описанной проблемы, нужно добавить буквально одну опцию. Называться она может к примеру
Read-only topic
В этой опции я укажу что-то вроде /mqtt-dashboard/set/var/pir/state. Возвращаясь к первой ситуации: когда на кухне станет светло, контроллер отключит датчик движения и сообщит об этом отправкой сообщения не в основной топик /set/ku/pir/state, а в /dashboard/set/var/pir/state. Ваша программа получит сообщение и изменит значение виджета, а вот сам контроллер это сообщение не получит, потому, что не будет подписан на этот топик. Все счастливы и довольны.
Букв получилось много, но иначе, я думаю, было бы непонятно зачем я прошу добавить новую опцию в настройки некоторых виджетов (slider, switch)...