Есть ли способ включения/выключения всех устройств в сети с проверкой статуса, что бы не осталось не выключенных/включенных.

Не очень силен в ява скрипт, если есть возможность конкретным примером, заранее благодарен за ответ.

задан 17 Дек '13, 13:09

Rabcevich's gravatar image

Rabcevich
52112
процент согласия: 0%

отредактирован 18 Дек '13, 23:55

PoltoS's gravatar image

PoltoS ♦♦
5731412

Второй вопрос ушёл в отдельный пост http://ask.z-wave.me/questions/55/4-fibaro-roller-fgr-221

(19 Дек '13, 00:01) PoltoS ♦♦ PoltoS's gravatar image

Один из методов - это написать скрипт, который не только отправит команду, но и поставит таймер и будет проверять текущее значение, посылая повторно команду, если оно не равно желаемому.

Что-то вроде:

// садимся на "сцену" от отправителя
zway.devices[SENDER].SceneActivation.data.currentScene.bind(function () {
  // запускаем открытие или закрытие
  switch (this.value) {
    case 11:
      ensureLevel([DEST1, DEST2, DEST3, ...], false, 0); // закрыть
      break;
    case 11:
      ensureLevel([DEST1, DEST2, DEST3, ...], true, 0); // открыть
      break;
  }
});

// эта функция нужна для приведения 0/255 к false/true
// т.к. в старых версиях Z-Way SwitchBinary возвращал 0/255, а в новых - falst/true
// если у Вас новая, то можно удалить её и убрать из кода ниже
function toBool(val) {
  return toBool > 0;
}

function ensureLevel(dstArray, level, run) {
  // переменная, которая подскажет нам, нужно ли повторно проверить состояние устройств
  var checkAgain = false;

  // пробег по устройствам из списка
  for (var index in dstArray) {
    // если первый запуск этой функции или состояние устройства не совпадает с желаемым
    if (run == 0 || toBool(zway.devices[dstArray[index]].SwitchBinary.data.level.value) != level) {
      // отправляем новое значение
      zway.devices[dstArray[index]].SwitchBinary.Set(level);
      // помечаем, что было несоответствие - нужно проверить опять чуть позже
      checkAgain = true;
    }
  }

  // если нужно, запускаем таймер на 30 секунд (подставьте нужное значение)
  // но не более 3х раз (нужное значение) - вдруг устройство просто умерло - зачем сеть долбить зря?)
  if (checkAgain && run < 3)
    setTimeout(function () {
      // опять та же ф-ция, но с большим номером повтора
      ensureLevel(dstArray, level, run + 1);
  }, 30*1000); // проверить ещё раз через 30 секунд
};

Код выглядит страшным, но на деле он простой и понятный.

ссылка
Этот answer отмечен как вики

отвечен 19 Дек '13, 00:28

PoltoS's gravatar image

PoltoS ♦♦
5731412
процент согласия: 27%

Ваш ответ
toggle preview

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

По почте:

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

По RSS:

Ответы

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

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

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

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

×253
×158

Задан: 17 Дек '13, 13:09

Просмотров: 2,615 раз

Отредактирован: 19 Дек '13, 00:28

powered by OSQA