Работа в цикле с массивом

Имеется множество zigbee датчиков, чтоб слать сообщения в телеграмм и контролировать заряд батареи и доступность применяется правило wb-rules.
когда датчик забивается вручную, проблем нет, но если через массив, то возникает проблема.
Вот такой код не работает:
//Zidbee сенсоры без батареи
var sensorZBnet = [“Выключатель кухня”,“Выключатель_туалет_верх”,“Выключатель_Валя”,“Выключатель_гостинная”,“Выключатель_коридор”,“Выключатель_матвей”,“Выключатель_марк”,“Выключатель_спальня”,
“Выключатель_кабинет”,“Выключатель_вход_раздевалка”,“Выключатель_вход_улица”,“Выключатель_веранда”,“Front_yard2”,“Front_yard1”];

//Zidbee сенсоры с батареей
var sensorZBwirless = [“Stora_Valya”,“Termosensor_kitchen”,“Temperature_bath_down”,“Termosensor_matvey”,“Termosensor_bedroom”,“Stora_Mark”,“Temperature_entrance”,“Temperature_kitchen”,“Temperature_Mark”,
“Temperature_work_room”,“Temperature_bath_up”,“Temperature_bedroom”,“Temperature_Matvey”,“Движение_вход_раздевалка”,“Temperature_undeground”,“0x00158d0002c8e42e”,“Termosensor_valya”];

//Определение длинны соответствующих сенсоров
n_sensorZBnet = sensorZBnet.length;
n_sensorZBwirless = sensorZBwirless.length;
//инициализация счётчиков
//var contZBn = 0;
//var contZBw = 0;

//Запуск правил для безбатарейных сенсоров

for (contZBn=0;contZBn<n_sensorZBnet; contZBn++) {
LastSeenZigbee1(sensorZBnet[contZBn]+“1”,[sensorZBnet[contZBn]][“/last_seen”],net);
}
//Запуск правил для батарейных сенсоров
for (contZBw=0;contZBw<n_sensorZBwirless; contZBw++) {
LastSeenZigbee1(sensorZBwirless[contZBw]+"1",[sensorZBwirless[contZBw]]["/last_seen"],batery);

А вот такой - работает:
LastSeenZigbee1("Termosensor_valya1","Termosensor_valya/last_seen",batery)

Вопрос почему, видимо имя топика не принимается функцией, но из-за чего, не ясно.

Добрый день.
При сохранении правила ошибок нет никаких?
Также странная запись типа: [sensorZBwirless[contZBw]]["/last_seen"]
Как я вижу, в функцию вторым аргументом вы передаете строку, а в цикле что-то странное.
Попробуйте так:

for (contZBn=0;contZBn<n_sensorZBnet; contZBn++) {
LastSeenZigbee1(sensorZBnet[contZBn]+“1”,sensorZBnet[contZBn] + “/last_seen”,net);
}
//Запуск правил для батарейных сенсоров
for (contZBw=0;contZBw<n_sensorZBwirless; contZBw++) {
LastSeenZigbee1(sensorZBwirless[contZBw]+"1",sensorZBwirless[contZBw] + "/last_seen",batery);

Так изначально и было
Вот полный код:
‘’’
startTicker(“my_timeout”, 1000); //задание счётчика на 5 минут (60000 милисекунд)

//создание функции по расчёты времени последнего появления в сети датчика зигби
//в функцию передаются имя параметра и mqtt топик параметра
function LastSeenZigbee1( my_name, my_device, my_time){
//создание виртуального устройства, для отправкит топиков
defineVirtualDevice( my_name ,{
cells: {
LastSeenZigbee:{ //название функции, которая передаётся, время от последней передачи данных
type : “value”,
value : 0
},
LastSeenAccess:{ //название функции, которая передаётся, доступен ли датчик
type : “switch”,
value : true
},
}
});

//создание правила время с последней отправки данных
  defineRule(my_name,{
      when: function () {return timers.my_timeout.firing;}, //работа счётчика
      then: function() { 
       	var nowDate = new Date();
        var Lastseen = (nowDate.getTime()-dev[my_device]);//
      	dev[my_name + "/LastSeenZigbee"] = dev[my_device]; //расчёт времени
        if (Lastseen <= my_time){					//сравнение с временем отклика
      		dev[my_name + "/LastSeenAccess"] = true;
        }  
        else if (Lastseen > my_time){					//если больше заданного, то отправляется сообщение в телеграмм
     		dev[my_name + "/LastSeenAccess"] = false;            
        }         
    }
  });	

}

//функция отправки в телеграмм соббщений о потери сязи с датчиком
function LastSeenTelegramm( my_name_t){
defineRule(my_name_t, {
whenChanged: my_name_t+“/LastSeenAccess”,
then: function (newValue, devName, cellName) {
if (newValue == false){
var message = “сенсор " +my_name_t + " не отвечает” ; // напишите свой текст сообщения
var token = “6210900063:AAHkx1MsF-GC8r2RLp2nXZenDgJF4sbCiBQ”; // замените на токен бота
var chat_id = 625322874; // замените на свой chat_id
var command = ‘curl -s -X POST https://api.telegram.org/bot{}/sendMessage -d chat_id={} -d text=“{}”’.format(token, chat_id, message);
runShellCommand(command);
}
}
});
}

batery = 3600000 //1 час
net = 600000 //10 минут

//Zidbee сенсоры без батареи
var sensorZBnet = [“Выключатель кухня”,“Выключатель_туалет_верх”,“Выключатель_Валя”,“Выключатель_гостинная”,“Выключатель_коридор”,“Выключатель_матвей”,“Выключатель_марк”,“Выключатель_спальня”,
“Выключатель_кабинет”,“Выключатель_вход_раздевалка”,“Выключатель_вход_улица”,“Выключатель_веранда”,“Front_yard2”,“Front_yard1”];

//Zidbee сенсоры с батареей
var sensorZBwirless = [“Stora_Valya”,“Termosensor_kitchen”,“Temperature_bath_down”,“Termosensor_matvey”,“Termosensor_bedroom”,“Stora_Mark”,“Temperature_entrance”,“Temperature_kitchen”,“Temperature_Mark”,
“Temperature_work_room”,“Temperature_bath_up”,“Temperature_bedroom”,“Temperature_Matvey”,“Движение_вход_раздевалка”,“Temperature_undeground”,“0x00158d0002c8e42e”,“Termosensor_valya”];

//Определение длинны соответствующих сенсоров
n_sensorZBnet = sensorZBnet.length;
n_sensorZBwirless = sensorZBwirless.length;
//инициализация счётчиков
//var contZBn = 0;
//var contZBw = 0;

//Запуск правил для безбатарейных сенсоров
for (contZBn=0;contZBn<n_sensorZBnet; contZBn++) {
LastSeenZigbee1(sensorZBnet[contZBn]+“1”,sensorZBnet[contZBn]+“/last_seen”,net);
}
//Запуск правил для батарейных сенсоров
for (contZBw=0;contZBw<n_sensorZBwirless; contZBw++) {
LastSeenZigbee1(sensorZBwirless[contZBw]+“1”,sensorZBwirless[contZBw]+“/last_seen”,batery);
}
‘’’
При этом топики создаются, но
сам mqtt
Front_yard11/LastSeenZigbee value /devices/Front_yard11/controls/LastSeenZigbee 1698613803460
значение не изменяется вообще.
Никаких предупреждений и ошибок нет

Сформулируйте свою проблему чуть проще/разделите проблемы на разные. Оформленный код без соблюдения рекомендаций иллюстрации кода очень тяжело читать.

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

Имеется функция:

startTicker("my_timeout", 1000); //задание счётчика на 5 минут (60000 милисекунд)

//создание функции по расчёты времени последнего появления в сети датчика зигби
//в функцию передаются имя параметра и mqtt топик параметра
function LastSeenZigbee1( my_name, my_device, my_time){					
	//создание виртуального устройства, для отправкит топиков
	  defineVirtualDevice( my_name ,{
 	  	cells: {
 	    	LastSeenZigbee:{ 			//название функции, которая передаётся, время от последней передачи данных
	 	       			type : "value",
	       				value : 0
	     	},
	     	LastSeenAccess:{ 			//название функции, которая передаётся, доступен ли датчик
	       				type : "switch",
	        			value : true
	     	},
	   	}
	});
  
	//создание правила время с последней отправки данных
	  defineRule(my_name,{
	      when: function () {return timers.my_timeout.firing;}, //работа счётчика
 	      then: function() { 
 	       	var nowDate = new Date();
            var Lastseen = (nowDate.getTime()-dev[my_device]);//
  	      	dev[my_name + "/LastSeenZigbee"] = dev[my_device]; //расчёт времени
  	        if (Lastseen <= my_time){					//сравнение с временем отклика
  	      		dev[my_name + "/LastSeenAccess"] = true;
            }  
            else if (Lastseen > my_time){					//если больше заданного, то отправляется сообщение в телеграмм
   	     		dev[my_name + "/LastSeenAccess"] = false;            
            }         
        }
 	  });	
}

Если дальше прописать

LastSeenZigbee1("Termosensor_valya1","Termosensor_valya/last_seen",batery)

То всё работает корректно, но т.к. датчиков много, то решил это сделать через массив, чтоб потом удобнее было редактировать и создавать новые правила
Потому стало так:

batery = 3600000 //1 час
net = 600000 //10 минут

//Zidbee сенсоры без батареи
var sensorZBnet = ["Выключатель кухня","Выключатель_туалет_верх","Выключатель_Валя","Выключатель_гостинная","Выключатель_коридор","Выключатель_матвей","Выключатель_марк","Выключатель_спальня",
               "Выключатель_кабинет","Выключатель_вход_раздевалка","Выключатель_вход_улица","Выключатель_веранда","Front_yard2","Front_yard1"];

//Zidbee сенсоры с батареей
var sensorZBwirless = ["Stora_Valya","Termosensor_kitchen","Temperature_bath_down","Termosensor_matvey","Termosensor_bedroom","Stora_Mark","Temperature_entrance","Temperature_kitchen","Temperature_Mark",
                   "Temperature_work_room","Temperature_bath_up","Temperature_bedroom","Temperature_Matvey","Движение_вход_раздевалка","Temperature_undeground","0x00158d0002c8e42e","Termosensor_valya"];

//Определение длинны соответствующих сенсоров
n_sensorZBnet = sensorZBnet.length;	
n_sensorZBwirless = sensorZBwirless.length;
//инициализация счётчиков
//var contZBn = 0;
//var contZBw = 0;

//Запуск правил для безбатарейных сенсоров
for (contZBn=0;contZBn<n_sensorZBnet; contZBn++) {
  LastSeenZigbee1(sensorZBnet[contZBn]+"1",sensorZBnet[contZBn]+"/last_seen",net);
}
//Запуск правил для батарейных сенсоров
for (contZBw=0;contZBw<n_sensorZBwirless; contZBw++) {
  LastSeenZigbee1(sensorZBwirless[contZBw]+"1",sensorZBwirless[contZBw]+"/last_seen",batery);
}

В этом случае скрипт ошибок не пишет, топики mqtt создаются, но не изменяются (в случае ошибки топики вообще не создавались)


Стоит значение ок, но сама эта величина не изменяется вообще, при этом если в участке кода

then: function() { 
 	       	var nowDate = new Date();
            var Lastseen = (nowDate.getTime()-dev[my_device]);//
  	      	dev[my_name + "/LastSeenZigbee"] = dev[my_device]; //расчёт времени

весто

dev[my_name + "/LastSeenZigbee"] = dev[my_device]

вписать

dev[my_name + "/LastSeenZigbee"] = nowDate.getTime()

не меняя больше ничего вообще, данные mqtt меняются.
Получается что dev[my_device] передаётся как-то не верно, и я понять не могу почему, не предупреждений ни замечаний от правил нет

Выведите в лог само значение dev[myDevice] и его тип:

log.info(‘Значение=’ + dev[myDevice] + ’ Тип=’ + typeof dev[myDevice]);

Сдается мне, что dev[myDevice] вам строку возвращает, а вам нужна дата.

Куда бы я не вставлял эту строку, у правила возникает ошибка

Ошибка правила: SyntaxError: error parsing token (line 79)
duk_lexer.c:1272

Но вообще сам логер пестрит такой ошибкой:

2023-11-01 21:48:26ECMAScript error: TypeError: type error (rc -105)
anon native strict preventsyield
anon /usr/share/wb-rules-system/scripts/lib.js:113 preventsyield
setDevValue /usr/share/wb-rules-system/scripts/lib.js:123 preventsyield
anon /etc/wb-rules/LS_test.js:27 preventsyield
call native strict preventsyield
anon /usr/share/wb-rules-system/scripts/lib.js:243 preventsyield

LS_test.js - и есть данное правило
и если anon /etc/wb-rules/LS_test.js:27 ссылка на строку правила, то это строка

dev[my_name + "/LastSeenZigbee"] = dev[my_device]; //расчёт времени 

Если переписать лог на

 log.info(typeof my_device);

то там выводится string

Проблема понятна, решено так:

var nowDate = new Date;
var LSDevice = dev[my_device];
var Lastseen = (nowDate-LSDevice);//
dev[my_name + "/LastSeenZigbee"] =Lastseen; //расчёт времени

Теперь заработало, спасибо

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.