Wb-rules. Не читает значение через dev[]

Добрый вечер.

Делаю публикацию в mqtt определенного значения (и meta так же передаю):

var zwaveSensors = [
  {
    'dev': 'zway-2',
    'controlBattery': 'Battery (2) 2-0-128',
    'controlLeakDetected': 'Alarm Leak detected (2) 2-0-113-5-2-A',
    'title': 'Z-Wave. Датчик протечки 2 этаж, санузел, id 2', 
    'wasOnline': true
  },
  {
    'dev': 'zway-3',
    'controlBattery': 'Battery (3) 3-0-128',
    'controlLeakDetected': 'Alarm Leak detected (3) 3-0-113-5-2-A',
    'title': 'Z-Wave. Датчик протечки 2 этаж, санузел, умывальник, id 3',
    'wasOnline': true
  }
];

for (sensor in zwaveSensors) {
  trackMqtt("/devices/{}/controls/{}{}".format(zwaveSensors[sensor].dev, zwaveSensors[sensor].controlBattery, stringUpdateTime), function(message){
    publish("{}".format(message.topic.replace(stringUpdateTime, ' updateTime')), "{}".format(message.value), 2, true);
    publish("{}".format(message.topic.replace(stringUpdateTime, ' updateTime/meta')), JSON.stringify({"readonly":"true","type":"value"}), 2, true);
  });
}

Сообщения в mqtt есть (скрин ниже), и в устройствах так же все появляется:





Но при попытке прочитать значение через dev - получаю null:

defineRule("sensor_zwave_check_status", {
  when: cron("00 */1 * * *"),
  then: function () {
    log("updateTime2: {}", dev["zway-2/Battery (2) 2-0-128 updateTime"]);
    log("updateTime3: {}", dev["zway-3/Battery (3) 3-0-128 updateTime"]);
  }
});


Любые другие значения читаются. В чем может быть ошибка?

Добрый день.

К сожалению, не получается воспроизвести. А точно ли в топике число? Возможно есть пробел, например?

Так я пытаюсь вообще получить какое либо значение из этого топика (без привязки к тому число это или нет). Пробелов никаких нет, это я тоже проверял (через MQTT explorer тоже).

Что еще можно проверить, чтобы понять в чем проблема?
@avspnz

А устройство отображается в веб-интерфейсе на вкладке “Устройства”? Если нет, то и читаться, как правило, не будет. В таком случае нужно создать виртуальное устройство с аналогичными топиками и в trackMqtt() менять значение топика виртуального устройства:

function makeNewVirtualControl(vdName, nameControl, typeControl) {
    if (getDevice(vdName) === undefined) {
        defineVirtualDevice(vdName, {
            title: vdName,
            cells: {},
        })
    }
    if (!getDevice(vdName).isControlExists(nameControl)) {
        getDevice(vdName).addControl(nameControl, typeControl);
    }
}

makeNewVirtualControl("zway-2", "Battery (2) 2-0-128 updateTime", {type: "value", value: 0, readonly: true});
makeNewVirtualControl("zway-3", "Battery (3) 3-0-128 updateTime", {type: "value", value: 0, readonly: true});


var zwaveSensors = [
  {
    'dev': 'zway-2',
    'controlBattery': 'Battery (2) 2-0-128',
    'controlLeakDetected': 'Alarm Leak detected (2) 2-0-113-5-2-A',
    'title': 'Z-Wave. Датчик протечки 2 этаж, санузел, id 2', 
    'wasOnline': true
  },
  {
    'dev': 'zway-3',
    'controlBattery': 'Battery (3) 3-0-128',
    'controlLeakDetected': 'Alarm Leak detected (3) 3-0-113-5-2-A',
    'title': 'Z-Wave. Датчик протечки 2 этаж, санузел, умывальник, id 3',
    'wasOnline': true
  }
];

var stringUpdateTime = " updateTime";

for (sensor in zwaveSensors) {
  trackMqtt("/devices/{}/controls/{}{}".format(zwaveSensors[sensor].dev, zwaveSensors[sensor].controlBattery, stringUpdateTime), function(message){
    dev[zwaveSensors[sensor].dev + "/" + zwaveSensors[sensor].controlBattery + stringUpdateTime] = message.value;
  });
}

defineRule("sensor_zwave_check_status", {
  when: cron("00 */1 * * *"),
  then: function () {
    log("updateTime2: {}", dev["zway-2/Battery (2) 2-0-128 updateTime"]);
    log("updateTime3: {}", dev["zway-3/Battery (3) 3-0-128 updateTime"]);
  }
});

В том то и дело что устройство отображается и даже график по нему есть (приложил скриншоты)

Поменяйте ещё:

for (sensor in zwaveSensors) {
  trackMqtt("/devices/{}/controls/{}{}".format(zwaveSensors[sensor].dev, zwaveSensors[sensor].controlBattery, stringUpdateTime), function(message){
    publish("{}".format(message.topic.replace(stringUpdateTime, ' updateTime')), "{}".format(message.value), 2, true);
    publish("{}".format(message.topic.replace(stringUpdateTime, ' updateTime/meta')), JSON.stringify({"readonly":"true","type":"value"}), 2, true);
  });
}

на:

for (sensor in zwaveSensors) {
  trackMqtt("/devices/{}/controls/{}{}".format(zwaveSensors[sensor].dev, zwaveSensors[sensor].controlBattery, stringUpdateTime), function(message){
    publish("{}".format(message.topic.replace(stringUpdateTime, ' updateTime')), "{}".format(message.value), 2, true);
    publish("{}".format(message.topic.replace(stringUpdateTime, ' updateTime/meta/type')), "{}".format("value"), 2, true);
    publish("{}".format(message.topic.replace(stringUpdateTime, ' updateTime/meta/readonly')), "{}".format("true"), 2, true);
  });
}

Да, так заработало! Удивительно. Спасибо! Т.е. meta получается надо дублировать и в json отправить и как подтопики?

Ну отлично! Да, просто устройство не соответствовало конвенции, отсюда и возникла проблема.

1 Like