Добрый вечер.
в документации в примерах для when и asSoon указана такая конструкция для последующего then:
then: function (newValue, devName, cellName) {}
откуда берутся эти значения, если в when и asSoon фактически может и не содержаться никаких топиков, а возвращаемое значение этих функций всегда boolean, да еще и срабатывает then всегда только при true
у мненя для кода
Summary
var aRoofHeaters = [
“fl0-box3_1-R7/K1”,
“fl0-box3_1-R7/K2”,
“fl0-box3_1-R7/K3”,
“fl0-box3_1-R7/K4”,
“fl0-box3_1-R7/K5”,
“fl0-box3_1-R7/K6”,
“fl0-box3_1-R6/K1”,
“fl0-box3_1-R6/K2”,
]
var aTimers =
var HeatReqTopic = “fl0-box5-DI1/Input 7”;
timePause = 1 // пауза между включениями
var ps_RoofHeaters = new PersistentStorage(“RoofHeatersControl”, { global: true });
ps_RoofHeaters [“state”] = (ps_RoofHeaters [“state”] === true);
ps_RoofHeaters [“forced”] = (ps_RoofHeaters [“forced”] === true);
var HeatReq = false
function stopTimers(){
aRoofHeaters.forEach(function(topic,idx){
if (typeof aTimers[idx] ===‘number’ && aTimers[idx]>=0) {
clearTimeout(aTimers[idx])
aTimers[idx] = null;
}
})
}
function setRoofHeaterState(){
var state = ( ( ps_RoofHeaters [“state”] && HeatReq) || ps_RoofHeaters [“forced”] )
state = (state === true )? true : false;
log(“RoofHeater: setRoofHeaterState: ({})”,(state)?“Включаю”:“Выключаю”);
stopTimers()
aRoofHeaters.forEach(function(topic,idx){
aTimers[idx] = setTimeout(function() {
aTimers[idx] = null
if (dev[topic] !== state) {
log(“RoofHeater: setRoofHeaterState: {} ({})”,topic,(state)?“Включаю”:“Выключаю”);
dev[topic] = state
}
}, idxtimePause1000*( (state)?1:0 ) + 50 );
})
}
function getRelayStates(){
return !aRoofHeaters.every(function (topic){ return !(dev[topic] === true);})
}
defineRule(“ruleRoofHeaterControl_heat”, {
when: function(){ return ( ( (dev[HeatReqTopic] === true)? true:false ) !== HeatReq ) },
then: function(newValue, devName, cellName) {
HeatReq = (dev[HeatReqTopic] === true)? true : false
log(“RoofHeater: ruleRoofHeater_heat: Запрос от датчика ({})”,(HeatReq)?“Включить”:“Выключить”,newValue, devName, cellName);
dev[“RoofHeatersControl/HeatRequest”] = HeatReq;
setRoofHeaterState()
}
});
defineRule(“ruleRoofHeaterControl_enable”, {
when: function(){ return ( ( (dev[“RoofHeatersControl/Control”] === true)? true:false ) !== ps_RoofHeaters [“state”] ) },
then: function(newValue, devName, cellName) {
ps_RoofHeaters [“state”] = (dev[“RoofHeatersControl/Control”] === true)? true:false ;
log(“RoofHeater: ruleRoofHeater_enable: Управление по датчику ({})”,(ps_RoofHeaters [“state”])?“Включено”:“Выключено”,newValue, devName, cellName);
setRoofHeaterState()
}
});
defineRule(“ruleRoofHeaterControl_forced”, {
when: function(){ return ( ( (dev[“RoofHeatersControl/ForcedOn”] === true)? true:false ) !== ps_RoofHeaters [“forced”] ) },
then: function(newValue, devName, cellName) {
ps_RoofHeaters [“forced”] = (dev[“RoofHeatersControl/ForcedOn”] === true)? true:false ;
log(“RoofHeater: ruleRoofHeaterControl_forced: Принудительно Включить ({})”,(ps_RoofHeaters [“forced”])?“Активно”:“Неактивно”,newValue, devName, cellName);
setRoofHeaterState()
}
});
var getStates = defineRule(“ruleRoofHeaterControl_RelayStates”, {
whenChanged: aRoofHeaters,
then: function(newValue, devName, cellName) {
dev[“RoofHeatersControl/RelayStates”] = getRelayStates()
if (newValue === undefined || newValue === null){return}
log(“RoofHeater: ruleRoofHeaterControl_RelayStates: Реле {}/{} изменило состояние на {}”,devName, cellName, (newValue)?“Включено”:“Выключено” );
// setRoofHeaterState() ! не включать
}
});
defineVirtualDevice(‘RoofHeatersControl’, {
title: ‘Обогрев кровли управление’,
cells: {
ForcedOn: {
title: “Принудительно Включить”,
type: “switch”,
value: ps_RoofHeaters [“forced”],
readonly: false,
order: 1
},
Control: {
title: “Управление по датчику (вкл) / Обогрев Выключен (выкл)”,
type: “switch”,
value: ps_RoofHeaters [“state”],
readonly: false,
order: 2
},
HeatRequest: {
title: “Запрос нагрева от датчика”,
type: “switch”,
value: HeatReq,
readonly: true,
order: 3
},
RelayStates: {
title: “Состояние реле”,
type: “switch”,
value: getRelayStates(),
readonly: true,
order: 4
},
}
});
log(“RoofHeater: rule loaded”);
runRule(getStates);
после нажатия “сохранить” получаю каждый раз разное значение для newValue, devName, cellName типа:
RoofHeater: ruleRoofHeater_heat: Запрос от датчика (Включить) 8.04 fl0-box2_2-UPS3 battery_voltage
RoofHeater: ruleRoofHeater_heat: Запрос от датчика (Включить) 707544 fl0-box2_3-DI2_13 Uptime
при дальнейшей сработке правила такого нет