Здравствуйте!
сделайте так:
if (dev[“astra_1_sensor_2”][“Channel1”] ==1) //если вход активирован запустить таймер
if (dev[“astra_1_sensor_2”][“Channel1”] ==0) //если деактивирован остановить, т.е. очистить таймер если он был запущен.
Здравствуйте!
сделайте так:
if (dev[“astra_1_sensor_2”][“Channel1”] ==1) //если вход активирован запустить таймер
if (dev[“astra_1_sensor_2”][“Channel1”] ==0) //если деактивирован остановить, т.е. очистить таймер если он был запущен.
спасибо. оттестировал… поможите с оператором
каким оператором сбрасывается таймер? Clear timeout - его обнуляет… где это почитать-то
var Income_timer_1_timeout_ms = 200 * 1000;
var Income_timer_1_id = null;
defineRule("motion_detector_3", {
whenChanged: "astra_1_sensor_3/Channel1",
then: function (newValue, devName, cellName) {
if (newValue) {
if (dev["astra_1_sensor3"]["Channel1"] ==1)
{
dev["wb-mr14_10"]["K12"]=1;
var date= new Date();
var strDate= date.toString();
runShellCommand("curl -s -X POST https://api.telegram.org text='Incomming light now is ON - "+strDate+"'");
date = null;
strDate=null;
if (Income_timer_1_id) {
clearTimeout(Income_timer_1_id);
}
Income_timer_1_id = setTimeout(function () {
dev["wb-mr14_10"]["K12"]=0;
var date= new Date();
var strDate= date.toString();
runShellCommand("curl -s -X POST https://api.telegram.org/ text='Incomming light now is OFF -"+strDate+"'");
Income_timer_1_id = null;
}, Income_timer_1_timeout_ms);
} //if
if (dev["astra_1_sensor3"]["Channel1"] == 0)
{
// Что сюда вставить
}
}
});
Добрый день!
мне кажется это лишнее. вы же конкретно указываете изменение т.е. ==1 или ==0. а там меняется каждый раз при изменении на входе. про обнуление таймера не скажу. сам когда-то пытался получить ответ на этот вопрос. на get hab в правилах что-то есть, но объясняется плохо.
да спасибо. все получилось. мелочи портили скрипт. срабатывал неправильно.
подскажите как обьявить глобальную функцию для всех скриптов? для второй версии понятно через require, а для первой?
создал /wb-rules js файл с фунциями. подхватилось. правильно ли я сделал?
В первой версии wb-rules общее пространство у всех скриптов. т.е. можно разместить функцию/переменную в любом скрипте. При этом нужно помнить, что нельзя использовать разные глобальные переменные (функции) с одним именем в разных скриптах
ok. спасибо.
Здравствуйте .
Пробую написать правило для последовательного включения (через заданный интервал) реле по команде (из виртуального переключателя)
Не совсем понял как это возможно сделать в рамках одного правила .
Если обрабатывать команду и состояние предыдущего реле через обработчик AsSoonAs то все теоретически должно работать .
Не понятно, как оформить это действие в одно правило ?
Добрый день!
Самое простое, что приходит в голову, это описать несколько функций, включающих разные реле:
function relay1On() {dev["wb-mr11_111"]["K1"]=true; log('Relay 1 On');}
function relay2On() {dev["wb-mr11_111"]["K2"]=true; log('Relay 2 On');}
function relay3On() {dev["wb-mr11_111"]["K3"]=true; log('Relay 3 On');}
А дальше в обработчике правила в секции then:
вызывать их с нужной задержкой:
setTimeout(relay1On, 1000);
setTimeout(relay2On, 2000);
setTimeout(relay3On, 3000);
спасибо . буду пробовать
Дополню, что можно писать анонимные функции:
setTimeout(function() { dev["wb-mr11_111/K1"]=true; }, 1000);
Если кому интересно, то можно задать вирт. устройство произвольно из скрипта.
Логика проста.
Задаем массив объектов, которые хотим передать в вирт. устройство. Например:
[
{source_dev:"T3HLS-1/Temperature", target_dev:"Temperature1",modify_mode:"Kelvins"},
{source_dev:"T3HLS-1/External_Sensor_1", target_dev:"Temperature2",modify_mode:"Kelvins"},
{source_dev:"T3HLS-1/External_Sensor_2", target_dev:"Temperature3",modify_mode:"Kelvins"},
{source_dev:"T3HLS-1/Humidity", target_dev:"Humidity",modify_mode:"Round(x)"},
{source_dev:"T3HLS-1/Illuminance", target_dev:"Illuminance",modify_mode:"Round(xHyst2)"},
{source_dev:"T3HLS-1/Sound_Level", target_dev:"Sound_Level",modify_mode:"Round(xHyst2)"},
{source_dev:"T3HLS-1/Input_Voltage", target_dev:"Input_Voltage",modify_mode:"Round(x)"}
]);
затем обрабатываем этот массив, вынимая нужные поля и расставляя их в новом объекте полей (cells)
for (var i=0; i<this.SETTINGS.length;i++){
log("отрабатываем cell " + i);
cells[this.SETTINGS[i].target_dev] = {
type:"string",
value:"NA"
}
};
Ключевой для меня была конструкция cells[this.SETTINGS[i].target_dev]. Размещение переменной в квадратных скобках дает возможность создать поле с именем этой переменной.
ну и венец всему:
defineVirtualDevice(obj_name,{
title: obj_name,
cells:cells
});
Правильно я понимаю, что переменную SETTINGS нужно задать как
var SETTINGS = readConfig("/etc/settings.conf");
?
нет, SETTINGS - это массив, который я вношу как список полей.
[
{source_dev:"T3HL
и т.д.
Добрый день.
Поделитесь пожалуйста примером кода функции, которая может принимать переменное число аргументов? Хочу передавать ей произвольное количество реле и только один виртуальный выключатель. В зависимости от состояния реле, виртуальный выключатель будет или включен, или выключен.
Здравствуйте!
Временем для написания не располагаю, но,могу дать совет - используйте в аргументах массив. В функции обрабатывайте массив произвольной длины - кол-во реле.
Изначальна была функция:
// Функция проверяет состояние виртуального выключателя для всего этажа
function func_status_light_floor(name, virtualDevice) { // имя, виртуальный выключатель для этажа
defineRule(name, {
whenChanged: [ // Когда изменяется состояние любого реле
"light_main_boiler" + "/enabled",
"light_main_hallway" + "/enabled",
"light_main_tambour" + "/enabled",
],
then: function(newValue, devName, cellName) {
if (dev[light_main_boiler]["enabled"] == 0 && dev[light_main_hall_1]["enabled"] == 0 && dev[light_main_tambour]["enabled"] == 0) { // Если реле не включены
dev[virtualDevice]["enabled"] = 0;
} else {
dev[virtualDevice]["enabled"] = 1;
}
}
});
}
func_status_light_floor("floor_light", "light_1_floor")
Но мне нужно передавать произвольный список реле. Переделал, хотелось бы спросить, так вообще корректно обрабатывать массив реле?
// Функция проверяет состояние виртуального выключателя для всего этажа
function func_status_light_floor(name, relays_array, virtualDevice) { // имя, массив реле, виртуальный выключатель для этажа
defineRule(name, {
floor_lights_on = 0; // Количество активных выключателей на этаже
for(i = 0; i < relays_array.length; ++i) {
whenChanged: [ // Когда изменяется состояние реле из массива
relays_array[i] + "/enabled",
],
then: function(newValue, devName, cellName) {
if (dev[relays_array[i]]["enabled"] == 1 { // Проверяем активно ли реле
floor_lights_on += 1;
} else {
if (floor_lights_on > 0) {
floor_lights_on -= 1;
}
}
}
}
if (floor_lights_on == 0) {
dev[virtualDevice]["enabled"] = 0;
} else {
dev[virtualDevice]["enabled"] = 1;
}
});
}
func_status_light_floor("floor_lights", ["light_main_boiler", "light_main_hallway", "light_main_tambour"], "light_1_floor")
К сожалению, не могу проверить, но я бы делал не так. Вы пытаетесь создать одно правило с несколькими условиями срабатывания. Я бы не стал так экспериментировать, я бы в функции через цикл создавал бы несколько правил - каждое для конкретного реле с уникальным именем. И обязательно логи бы вставил для проверки, чтобы не оказалось так, что работает только последнее правило.
Обработкой была бы одна общая функция, которая при включении реле просто взводила бы выключатель, а при отключении, проверяла бы циклом все. Я бы не стал инкриментами пользоваться, не был бы уверен, что не будет накладок, действовал бы “в лоб”.
Спасибо, попробую реализовать по другому.
День добрый.
А можете показать весь скрипт для изучения?
Добрый. Весь скрипт мне сейчас не доступен, на другом компе. Нужно повозиться, что бы до него добраться. Я перечитал свой пост, там все указано, если есть какие-то конкретный вопросы - задавайте, попытаюсь вспомнить. Я отхожу от WB, не развиваю больше эту тему.