Cпасибо.поднял скорость шины - да, действительно - намного быстрее стало работать,но небольшая задержка осталась.
Касаемо события. Поменял Input Counter на Input state (других вариантов обработки событий по входу я так понимаю нет?!) тоже работает ,но не корректно считывается нажатие клавиши ,а конкретно - работает только по длительному нажатию, но ,надеюсь,что этот вопрос получится решить скриптом обработки нажатий,о котором я спрашивал выше @almo
Подскажите пожалуйста, как прописывать правило: при изменении значения датчика температуры и при условии, что виртуальная кнопка выключена, тогда изменить температуру в котле.
Сейчас скрипт почему-то сам принудительно включает виртуальную кнопку “vacation”, поэтому условие “else” не отрабатывается:
defineRule(“Heater2”, {
whenChanged: “wb-w1/28-00000d21f6bc”,
then: function (newValue, devName, cellName) {
if (dev[“virtual3”][“vacation”] = true) {
dev[“wbe2-i-ebus_12”][“Heating Setpoint”] = 30;
dev[“wb-mwac_84”][“K2”] = false; //normally closed
log(date + ‘Protherm High ON’);
} else {
log(date + ‘Protherm high OFF’);
}
У вас не верная операция сравнение, в строке if (dev[“virtual3”][“vacation”] = true) вы не проверяете развен ли mqtt топик значению true, а задаете данному топику значение true.
= операция приравнивания
== операция сравнения
=== операция сторого сравнения
defineRule(“Heater2”, {
whenChanged: “wb-w1/28-00000d21f6bc”,
then: function (newValue, devName, cellName) {
if (dev[“virtual3”][“vacation”] == true) {
dev[“wbe2-i-ebus_12”][“Heating Setpoint”] = 30;
dev[“wb-mwac_84”][“K2”] = false; //normally closed
log(date + ‘Protherm High ON’);
} else {
log(date + ‘Protherm high OFF’);
}
Либо
defineRule(“Heater2”, {
whenChanged: “wb-w1/28-00000d21f6bc”,
then: function (newValue, devName, cellName) {
if (dev[“virtual3”][“vacation”]) {
dev[“wbe2-i-ebus_12”][“Heating Setpoint”] = 30;
dev[“wb-mwac_84”][“K2”] = false; //normally closed
log(date + ‘Protherm High ON’);
} else {
log(date + ‘Protherm high OFF’);
}
Пока серфил этот форум, несколько раз натыкался на вопрос, как написать правило, которое отключало бы блок питания светодиодной ленты, когда та не используется, и включало бы, когда лента включается. Привожу код, который скомпилировал из различных примеров и источников под свои нужды. Достаточно только подменить мои устройства своими. Комментарии оставляю, как у себя, чтобы самому не забыть для чего это все, поверьте, таким новичкам, как я это важно. )))
// Правило сработает, когда любой из каналов диммера wb-led_21/Channel 1, 2, 3 или 4 будет включен
// и включит блок питания соответствующей ленты через контакт реле wb-mr6cu_105/K1
// а затем выключит данное реле, если все каналы диммера wb-led_21 будут отключены.
var i = 0 // Объявляем переменную (счетчик) - "i" и присваиваем ей значение - "0".
defineRule("rampPowerSupply1", {
whenChanged: ["wb-led_21/Channel 1", "wb-led_21/Channel 2", "wb-led_21/Channel 3", "wb-led_21/Channel 4"], // Получаем значение контрола и
then: function(newValue, devName, cellName) { // передаем его в then функцию. Затем
if (newValue == 1) { // если это включение контрола, то
i = i + 1; // прибавляем к нашему счетчику "1"
dev["wb-mr6cu_105/K1"] = newValue; // и включаем блок питания с помощью реле
} else // если же это было выключение контрола, тогда
i = i - 1; // уменьшаем наш счетчик на "1" и сразу же
if (i == 0) { // проверяем не стало ли "0"? Если да, то
dev["wb-mr6cu_105/K1"] = newValue; // выключаем блок питания с помощью реле.
}
}
});
defineRule("rampPowerSupply2", { // Если нужно выключить все каналы диммера не по одному, а сразу, просто выключаем блок питания с помощью контрола реле
whenChanged: "wb-mr6cu_105/K1", // Принимаем значение
then: function(newValue, devName, cellName) { // Передаем его в функцию
if (newValue == 0) { // проверяем и если "ВЫКЛ", то выключаем все каналы ниже, присваивая им то же значение.
dev["wb-led_21/Channel 1"] = newValue;
dev["wb-led_21/Channel 2"] = newValue;
dev["wb-led_21/Channel 3"] = newValue;
dev["wb-led_21/Channel 4"] = newValue;
}
}
});