Добрый день!
У меня написан js-скрипт на нажатие кнопки на настенном выключателе (через метод bind).
Если нажимать кнопку физически, то скрипт срабатывает один раз на нажатие.
Если нажимать кнопку через интерфейс управления умным домом, то число срабатываний - 2 или 3.
Почему так происходит и как добиться консистентности в срабатывании bind, т.е. чтобы функция вызывалась только 1 раз при любом включении - дистанционном/виртуальном/реальном.
Спасибо!

задан 12 Фев '15, 16:43

chorus12's gravatar image

chorus12
36124
процент согласия: 16%


Проверять значение аргумента type в функции-обработчике bind.

При нажатии кнопки на выключателе, то от него приходит репорт контроллеру, и коллбек вызывается один раз с типом Updated. При запросе из интерфейса сначала происходит инвалидация значения (что приводит к вызову коллбека с типом Invalidated), после чего уже выполняется сам запрос к устройству. Когда от него придет ответ, то коллбек вызовется еще раз, на этот раз с типом Updated.

Кроме того, если значение реально не изменилось, то type будет (Updated | PhantomUpdate), что может быть полезным, если нужно отслеживать только реальные изменения.

ссылка

отвечен 15 Фев '15, 00:05

pieceofsummer's gravatar image

pieceofsummer
2513
процент согласия: 50%

Благодарю! Приведите, пожалуйста, пару строчек кода с примером, как обратиться к аргументу type. В документации нигде про это не говорится - я не могу получить тех значений, которые Вы описали... Спасибо!

(22 Фев '15, 15:24) chorus12 chorus12's gravatar image

Просто передать в bind() функцию с параметром type: xxx.bind(function(type) { if ((type & 0x3F) == 0x01) { /* updated */ } }); Числовые значения констант можно подсмотреть в ZData.h или в automation/modules/ZWave/index.js.

(26 Фев '15, 02:14) pieceofsummer pieceofsummer's gravatar image

Всемерно благодарю! Значения констант: this.ZWAY_DATA_CHANGE_TYPE = { "Updated": 0x01,
"Invalidated": 0x02,
"Deleted": 0x03,
"ChildCreated": 0x04,
"PhantomUpdate": 0x40, "ChildEvent": 0x80

Теперь код работает. При отправке команды через веб - идёт пара Invalidated и следом Updated, как Вы написали в предыдущем ответе. НО самое интересное - где-то в 10% случаев наступает какой-то "прорыв" и друг за другом от обычного нажатия на выключатель идут 4 сарабывания bind с типом Updated... Как это объяснить/избежать? Благодарю!

(04 Мар '15, 21:44) chorus12 chorus12's gravatar image

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

(05 Мар '15, 05:29) pieceofsummer pieceofsummer's gravatar image

В этом случае чистый Updated будет только у первого вызова, у остальных будет Updated|PhantomUpdate (если, конечно, значение одинаковое).

(05 Мар '15, 06:33) pieceofsummer pieceofsummer's gravatar image
Ваш ответ
toggle preview

Следить за этим вопросом

По почте:

Авторизовавшись, здесь Вы сможете подписаться на обновления по этому вопросу.

По RSS:

Ответы

Ответы и комментарии

Основы размётки

  • *курсив* или _курсив_
  • **жирный** или __жирный__
  • ссылка:[текст](http://url.com/ "Суть вопроса")
  • картинка?![alt текст](/path/img.jpg "Суть вопроса")
  • нумерованый список: 1. Foo 2. Bar
  • чтобы добавить перенос строки в тексте, сделайте два переноса строки в редакторе
  • базовые теги HTML также поддерживаются

Теги к вопросу:

×253
×158

Задан: 12 Фев '15, 16:43

Просмотров: 1,290 раз

Отредактирован: 05 Мар '15, 06:34

powered by OSQA