Здравствуйте! Пытаюсь подключить свой JS скрипт. Не получается. Что делал: Написал скрипт smarthome.js в папке /opt/z-way-server/automation/ с правами -rw-rw-r-- pi pi

var nodeId = 3;
var instanceId = 0;

var _tmr = null
zway.devices[nodeId].instances[instanceId].SwitchMultilevel.data.level.bind(function() {
    var node = args[0];
    var instance = args[1];
    if (_tmr) {
        clearTimeout(_tmr);
    }
    _tmr = null;
    if (this.value > 0) {
        _tmr = setTimeout(function () {
            zway.devices[nodeId].instances[instanceId].SwitchMultilevel.Set(0);
            _tmr = null;
        }, 5*1000);
    }
});

var instanceId = 2;
var ctrlNodeId = zway.controller.data.nodeId.value; // Get controler Node Id
if (zway.devices[ctrlNodeId] && zway.devices[ctrlNodeId].instances[instanceId]) { // Check that instance object exists
    var basicCC = zway.devices[ctrlNodeId].instances[instanceId].Basic;
    if (basicCC) { // check that Basic exists
        basicCC.data.level.bind(function() { // bind to Basic level value
            system("echo 2 > ~/2.txt");
        });
    }
}

В файле main.js добавил:

executeFile("smarthome.js");

Перезапустил службу Z-Way - не работает, на события никак не реагирует. В настройках устройств в http://192.168.1.100:8083/expert/ ассоциации добавлены.

Пробовал через http: http://192.168.1.100:8083/JS/Run/executeFile("smarthome.js") Тоже не работает.

devices[3] - это диммер Fibaro devices[2] - пульт ДУ keyfob

Подскажите, где я ошибся? Возможно, то, что я привязал ассоциации через веб-интерфейс недостаточно?

задан 19 Янв '14, 17:48

mavrinpn's gravatar image

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

Нужно видеть лог - есть ли вообще изменения этих элементов дерева:

zway.devices[3].instances[0].SwitchMultilevel.data.level
zway.devices[1].instances[2].Basic.data.level

Также полезно во все места поставить console.log() и смотреть, куда он вообще зашёл.

(22 Янв '14, 23:48) PoltoS ♦♦ PoltoS's gravatar image

Частично разобрался. Изменения в элементах дерева есть, скрипт выполняется. Подскажите, куда пишется console.log(); ? В /var/log/Z-Way.log и /var/log/z-way-server.log ничего не нашел. Так же никак не отрабатывается код вида system("echo test"); Как можно выполнить shell-команду из JS? Заранее спасибо!

(23 Янв '14, 08:25) mavrinpn mavrinpn's gravatar image

Так же нашел в /var/log/Z-Way.log следующее:

[2014-01-23 08:44:31.156] Scheduling execution of file: automation/main.js

[2014-01-23 08:44:31.191] Executing script: / Z-Way Home Automation Engine main executable **** ...

[2014-01-23 08:44:31.211] JavaScript compilation error: SyntaxError: Unexpected token ILLEGAL

[2014-01-23 08:44:31.218] JavaScript compilation error: Uncaught SyntaxError: Unexpected token ILLEGAL

[2014-01-23 08:44:49.094] Job 0x07: deleted from queue

[2014-01-23 08:44:49.106] Job 0x06: deleted from queue

...

(23 Янв '14, 08:49) mavrinpn mavrinpn's gravatar image

Для system() нужно её разрешить в .syscommands

Ищите ошибку в JS. Новая версия Z-Way покажет stack trace - проще искать.

(23 Янв '14, 13:29) PoltoS ♦♦ PoltoS's gravatar image

PoltoS, спасибо большое! Все заработало. Помогла статья: http://ru.z-wave.me/content/access-zwaveapi-through-python-script-raspberry

Последний вопрос: Подписка bind() выполняет callback-функцию два раза: первый раз с текущим состоянием, второй (сразу же после первого) с новым состоянием. Это нормальное поведение? Можно ли отключить такое поведение и получать сообщения только о новых состояниях?

(23 Янв '14, 17:04) mavrinpn mavrinpn's gravatar image

Данные изменяются каждый раз, когда получаем Report от устройства. Это, видимо, означает, что устройство первый раз посылает старое значение, а второй - новое. Почему так - смотрите лог Z-Way - там видно, как команды приходят от устройств (смотрите низкоуровневый лог и сравнивайте с командами Get и Set от контроллера). Но всегда есть спасение - если данные не менялись (пришёл отчёт с тем же значением), то в агрументе type у этого callback будет флаг стоять PHANTOM.

См. подробно http://habrahabr.ru/post/174825/

(24 Янв '14, 00:23) PoltoS ♦♦ PoltoS's gravatar image

Павел, удалось ли победить двойную посылку callback функции и получать только сообщения о новых состояниях ? Поделитесь пожалуйста, наступил на те же грабли и не могу найти решения... Сергей, не могли бы Вы показать на рабочем примере, как можно отловить этот флаг PHANTOM ? Статью на храбре читал, но просветления она не принесла, не силен я в Ява скриптах к сожалению...

(27 Авг '14, 02:07) Antti Antti's gravatar image

Вот пример из движка автоматизации:

var self = this;

zway.devices[nodeId].data.isFailed.bind(function(type, arg) {
    if (!(type & self.ZWAY_DATA_CHANGE_TYPE["PhantomUpdate"])) {
        console.log(this.value);
    }
});
(27 Авг '14, 03:27) PoltoS ♦♦ PoltoS's gravatar image

где-то рядом ещё это надо написать:

this.ZWAY_DATA_CHANGE_TYPE = {
    "Updated": 0x01,       // Value updated or child created
    "Invalidated": 0x02,   // Value invalidated
    "Deleted": 0x03,       // Data holder deleted - callback is called last time before being deleted
    "ChildCreated": 0x04,  // New direct child node created

    // ORed flags
    "PhantomUpdate": 0x40, // Data holder updated with same value (only updateTime changed)
    "ChildEvent": 0x80     // Event from child node   
};
(27 Авг '14, 03:28) PoltoS ♦♦ PoltoS's gravatar image

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

(27 Авг '14, 20:09) Antti Antti's gravatar image
showing 5 of 10 show 5 more comments

В версии 1.4 можно подписаться на события, там есть примеры витруальных устройств типа EventLog, который подписывается на всё. Можно посмотреть, какие события приходят ему от ваших управляющих устройств, и сделать своё устройство, которое подпишется на эти события и будет делать то, что вам надо.

ссылка

отвечен 20 Янв '14, 13:18

azimarev's gravatar image

azimarev
139327
процент согласия: 18%

Включаю устройство. Вывел аргумент type в лог - сначала "прилетает" 2 (Invalidated) (this.value -false), после этого сразу же 1 (Updated) (this.value - true). По флагу PHANTOM не отловить получается?

(27 Авг '14, 20:54) Antti Antti's gravatar image
Ваш ответ
toggle preview

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

По почте:

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

По RSS:

Ответы

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

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

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

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

×253
×32

Задан: 19 Янв '14, 17:48

Просмотров: 4,001 раз

Отредактирован: 27 Авг '14, 22:00

powered by OSQA