0
Answered

Блокировка кнопок

Александр Бойко 1 year ago • updated by Vladimir Ovchinnikov 2 months ago 11

Есть три кнопки управления жалюзи(вверх, стоп, вниз), имеется ли возможность блокировать одну из кнопок при нажатии другой? Например если нажал вверх, то можно нажать только паузу в этот момент?

Under review

Добрый день.

Можно скриптом отслеживать изменения в в канале и в зависимости от того, какая нажата кнопка, - убирать с панели другую. В приложенном примере при нажатии кнопки Up кнопка Down исчезает с экрана. Соответственно, если нажата кнопка Down, то кнопка Up скрывается. Нажатие на кнопку Stop сбрасывает (обнуляет) значения в фидбэках и все кнопки становятся снова видны и доступны для нажатия.


Если нужно, чтоб блокируемая кнопка отображалась на экране, но не реагировала на нажатие, то вместо Visible можно использовать Enable.


Block.irpz

Block.sirpz

У меня возник такой же вопрос, но только при условии использования сервера и нескольких панелей. То есть блокировать нужно кнопки и уровни на других панелях. Я думала использовать для этого SSID, имя устройства или его IP. Но боюсь, что обработка будет занимать больше времени, чем выполнение команды. Пока не проверялось.

Добрый день.

Приложенные примеры будут работать при одновременном использовании панелей, т. к. значения нажатий хранятся и проверяются на сервере.

Да, это верно. А если речь идет не о кнопках, а о слайдерах, то блокировать нужно элементы только на других панелях.

Каждая панель своим скриптом читает/записывает значение виртуального фидбэка. Поэтому нет принципиальной разницы, Level (слайдер) или Button. Понадобится только доработка скрипта.

Владимир, доработка скрипта однозначно) Я попробую объяснить, что я имею в виду!

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

А вот в случае со слайдером, мы имеем только один орган управления. И если его блокировать (скрывать и т.п.), то он будет заблокирован на всех панелях, в том числе и на той, с которой мы управляем. А этого делать не нужно. Нужно, чтобы система знала, что вот эта панель имеет приоритет управления, а все остальные управлять не могут. Т.е. слайдер должен оставаться активным, но только на нашей панели.


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

Если я правильно понимаю, то если на любой из панелей начали управлять слайдером, то другие панели не должны ничем управлять. После окончания слайда другие панели становятся равноправными, так?

  1. Создаем серверную переменную БЛОК, на панели флаг ПРИОРИТЕТ.
  2. Отлавливаем начало мува на слайдере. Проверяем серверную переменную БЛОК. если она 1, то команды со слайда не отправляются, если она 0, то устанавливаем в 1, взводим флаг ПРИОРИТЕТ в 1
  3. Отлавливаем окончание мува. Проверяем флаг ПРИОРИТЕТ, если  он 1 (т.е. именно эта панель получила приоритет), то сбрасываем ПРИОРИТЕТ = 0 и БЛОК = 0 и отправляем данные левела.

Добрый день.

Не проще ли будет получить HWID разрешённой панели (вам ведь надо дать доступ единственной), сохранить её на сервере в виртуальном фидбэке и проверять его значение при получении команды? Если HWID совпадает - выполнять команду, если нет - игнорировать.


Можно вместо HWID сохранить IP адрес, но если адреса у вас динамические или за NAT, или пользователи имеют права для смены сетевых настроек, то пользы от такой проверки будет мало.

Спасибо за ответы.

Посмотрим где удобнее это обрабатывать.


Добрый день.

Ваш вопрос остался нерешённым?