Добрый вечер.
Делаю публикацию в 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"]);
}
});
Любые другие значения читаются. В чем может быть ошибка?
avspnz
13.Февраль.2024 08:57:48
4
Добрый день.
К сожалению, не получается воспроизвести. А точно ли в топике число? Возможно есть пробел, например?
Так я пытаюсь вообще получить какое либо значение из этого топика (без привязки к тому число это или нет). Пробелов никаких нет, это я тоже проверял (через MQTT explorer тоже).
Что еще можно проверить, чтобы понять в чем проблема?
@avspnz
avspnz
13.Февраль.2024 10:55:44
7
А устройство отображается в веб-интерфейсе на вкладке “Устройства”? Если нет, то и читаться, как правило, не будет. В таком случае нужно создать виртуальное устройство с аналогичными топиками и в 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"]);
}
});
В том то и дело что устройство отображается и даже график по нему есть (приложил скриншоты)
avspnz
13.Февраль.2024 12:52:43
9
Поменяйте ещё:
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);
});
}
Spinoza
13.Февраль.2024 13:21:38
10
Да, так заработало! Удивительно. Спасибо! Т.е. meta получается надо дублировать и в json отправить и как подтопики?
avspnz
13.Февраль.2024 13:35:40
11
Ну отлично! Да, просто устройство не соответствовало конвенции , отсюда и возникла проблема.
1 лайк