Не нравится мне описанный подход. Ну и модифицировать можно одной-двумя строчками в том же правиле, равно как и взводить "таймер.
А можете помочь с кодом, от которого можем оттолкнуться в вашем варианте? У меня сейчас так:
defineVirtualDevice("export", {
title: "Export",
cells: {
main_power_total: {
type: "power",
value: 0,
order: 1
},
main_energy_total: {
type: "power_consumption",
value: 0,
order: 2
}
}
});
defineRule("sendDataToServer", {
when: cron("@every 5s"),
then: function () {
dev["export"]["main_power_total"] = dev["wb-map12e_180"]["Ch 1 Total P"];
dev["export"]["main_energy_total"] = dev["wb-map12e_180"]["Ch 1 Total AP energy"];
}
});
Функцию переписать так:
function mqtt_republic(sTopic, dPath, dTopic){
defineRule("republic_"+sTopic, {
whenChanged: sTopic,
then: function (newValue, devName, cellName) {
publish(dPath+devName+"/"+dTopic, newValue, 2, false);
//log.info(dPath+devName+"/"+cellName)
}
});
}
Ну и добавить в саму функцию примитивную процедуру: Проверка, не запущен ли таймер, если запущен: ничего не делать. Если не запущен - публиковать значение и запускать таймер. Таким образом публикация не чаще чем период таймера.
Ну и значение таймера опционально передавать в функцию.