Сценарии - новая версия API
-
Пользователь @Alex_Jet написал в Сценарии - новая версия API:
@sergeyygr, думаю, что нужно делать так же как для счётчика газа. Писал об этом - тут
Главное верно определить вес импульса чтобы получить значения сразу в м/с или км/ч.
Хотя мне не до конца понятен принцип работы такого датчика. Он самостоятельно каждую секунду выдает сколько то импульсов, которые соответствуют скорости ветра в текущую единицу времени? Если так, то лучше "захватывать" эти показания сценарием, пересчитывать и присваивать датчику. Покажите что выдает отладчик на канале к которому подключен датчик?
Но опять же если все так как я написал выше, то можно пересчитывать показания с помощью формулы или через вкладку "Обработка значений" канала.Добрый день! А какое практическое значение имеет функция "Период опроса" в счетчике? Думаю в моем случае было бы полезно счетчику дать возможность обнулять с заданным периодом, опрашивать и выводить последние значение. Задача была решена!!!
-
@sergeyygr Добрый день!
Пока не совсем в теме по датчику. Но если воспроизвести скрипт от @Alex_Jet, то получится примерно так:- Опрашиваем датчик с заданным интервалом из сценария (в каналах опрос не нужен, т е период =0)
- По магической формуле считаем значение, используя значение счетчика
- Периодически сбрасываем счетчик
const WindSensor = Device('MyWindSensor'); script({ last_cnt:0, // Эту переменную нужно сохранять, поэтому ее выносим и далее исп как this.last_cnt boot() { return true; // Сценарий будет запускаться при старте сервера }, start() { this.resetCount(); // Взвести таймер - опрос раз в секунду, можно чаще (0.5 = 500 мсек) this.startTimer('T1', 1, 'onTimer'); }, resetCount() { // Передать запрос на сброс счетчика this.pluginCommand({unit:'megad1', command:{url:'/sec/?pt=7&cnt=0'}}); }, onTimer() { // Передать запрос на чтение, ответ придет в функцию getResponse this.pluginCommand({unit:'megad1', command:{url:'/sec/?pt=7&cmd=get', onResponse:'raw'}}, 'getResponse'); this.startTimer('T1', 1, 'onTimer'); // Следующий запрос }, getResponse(body) { // body = OFF/2 this.log('getResponse body= '+body); // Для отладки if (!body) return; const arr = body.split('/'); if (arr.length<2) { this.log('Ожидается значение счетчика после символа "/"'); return; // Ошибка, значение не получено } let cnt = arr[1]; if ( this.last_cnt != cnt ) { let wind_speed = (cnt - this.last_cnt) * 0.0875 + 0.1; this.last_cnt = cnt; this.assign(WindSensor, 'value', wind_speed); } if ( cnt > 1000 ) { this.resetCount(); this.last_cnt = 0; } } });
- Сценарий будет запускаться при старте сервера
- будет работать постоянно, потому что таймер все время перевзводится
- не имеет триггеров, то есть при необходимости его надо взводить/останавливать вручную (Запустить сценарий/ Остановить сценарий)
Потестируйте, возможно есть косяки или не все учтено
-
Пользователь @intrapro написал в Сценарии - новая версия API:
@sergeyygr Добрый день!
Пока не совсем в теме по датчику. Но если воспроизвести скрипт от @Alex_Jet, то получится примерно так:- Опрашиваем датчик с заданным интервалом из сценария (в каналах опрос не нужен, т е период =0)
- По магической формуле считаем значение, используя значение счетчика
- Периодически сбрасываем счетчик
const WindSensor = Device('MyWindSensor'); script({ last_cnt:0, // Эту переменную нужно сохранять, поэтому ее выносим и далее исп как this.last_cnt boot() { return true; // Сценарий будет запускаться при старте сервера }, start() { this.resetCount(); // Взвести таймер - опрос раз в секунду, можно чаще (0.5 = 500 мсек) this.startTimer('T1', 1, 'onTimer'); }, resetCount() { // Передать запрос на сброс счетчика this.pluginCommand({unit:'megad1', command:{url:'/sec/?pt=7&cnt=0'}}); }, onTimer() { // Передать запрос на чтение, ответ придет в функцию getResponse this.pluginCommand({unit:'megad1', command:{url:'/sec/?pt=7&cmd=get', onResponse:'raw'}}, 'getResponse'); this.startTimer('T1', 1, 'onTimer'); // Следующий запрос }, getResponse(body) { // body = OFF/2 this.log('getResponse body= '+body); // Для отладки if (!body) return; const arr = body.split('/'); if (arr.length<2) { this.log('Ожидается значение счетчика после символа "/"'); return; // Ошибка, значение не получено } let cnt = arr[1]; if ( this.last_cnt != cnt ) { let wind_speed = (cnt - this.last_cnt) * 0.0875 + 0.1; this.last_cnt = cnt; this.assign(WindSensor, 'value', wind_speed); } if ( cnt > 1000 ) { this.resetCount(); this.last_cnt = 0; } } });
- Сценарий будет запускаться при старте сервера
- будет работать постоянно, потому что таймер все время перевзводится
- не имеет триггеров, то есть при необходимости его надо взводить/останавливать вручную (Запустить сценарий/ Остановить сценарий)
Потестируйте, возможно есть косяки или не все учтено
Спасибо!
Настроил, в иконке показания суммируются.
Вот отладчик.
Вот лог.
Вот иконка.
-
@sergeyygr
Что я делаю не так?
-
@sergeyygr А у вас тип устройства какой? Счетчик? Нужен обычный аналоговый датчик.
-
Пользователь @intrapro написал в Сценарии - новая версия API:
@sergeyygr А у вас тип устройства какой? Счетчик? Нужен обычный аналоговый датчик.
Все заработало! Спасибо за это существенное уточнение!
-
@sergeyygr Хорошо, что заработало. А скорость то считает правильно? Датчик непростой
-
Пользователь @intrapro написал в Сценарии - новая версия API:
@sergeyygr Хорошо, что заработало. А скорость то считает правильно?
Эталонного измерителя нет). Только формула в паспорте
-
Пользователь @sergeyygr написал в Сценарии - новая версия API:
Пользователь @intrapro написал в Сценарии - новая версия API:
@sergeyygr Хорошо, что заработало. А скорость то считает правильно?
Эталонного измерителя нет). Только формула в паспорте
Считает - это сейчас КЛЮЧЕВОЙ результат!!!
-
Пользователь @sergeyygr написал в Сценарии - новая версия API:
Пользователь @sergeyygr написал в Сценарии - новая версия API:
Пользователь @intrapro написал в Сценарии - новая версия API:
@sergeyygr Хорошо, что заработало. А скорость то считает правильно?
Эталонного измерителя нет). Только формула в паспорте
Считает - это сейчас КЛЮЧЕВОЙ результат!!!
Если будет время, опишите задачу и решение в разделе Решения пользователей
Будем пользоваться
-
Пользователь @intrahouse написал в Сценарии - новая версия API:
Пользователь @sergeyygr написал в Сценарии - новая версия API:
Пользователь @sergeyygr написал в Сценарии - новая версия API:
Пользователь @intrapro написал в Сценарии - новая версия API:
@sergeyygr Хорошо, что заработало. А скорость то считает правильно?
Эталонного измерителя нет). Только формула в паспорте
Считает - это сейчас КЛЮЧЕВОЙ результат!!!
Если будет время, опишите задачу и решение в разделе Решения пользователей
Будем пользоватьсяЗакончу, настрою и выложу с фотками.
-
@intrapro, ИМХО нужно все же не каждую секунду опрашивать канал, а 1 раз в минуту/5 минут делать 5 измерений и усреднять их. Наверное, это можно сделать с помощью "Функции обработки" в канале?
-
@Alex_Jet, сценарий воспроизводит предложенный вами вариант скрипта php, там идет опрос каждую секунду (while(true) { file_get_contents ... sleep(1)} и периодически сброс счетчика на MegaD
Если можно опрашивать реже и усреднять - не проблема, усреднятьможно и в сценарии. Без сценария непонятно как сбрасывать счетчик, поэтому в канале опроса нет
-
Коллеги, помогите решить задачу. Имеем - кнопку ( не фиксируемую) для включения/выключения света. Причем кнопка имеет 3 варианта нажатия (1 клик, 2 клика, удержание) и каждый вариант работает по своему. Так же имеем датчик движения. Хочется чтобы освещение работало по датчику движения (появилось движение - лампа загоралась, исчезло движение и через N-минут лампа потухла), но! чтобы его можно было принудительно и на неограниченное время включить с помощью вышеописанной кнопки! Пока идей нет. Подкиньте чтобы я сделал мультисценарий.
-
@Alex_Jet, мне тоже хотелось сделать что-то подобное, но так и не придумал как. В качестве идеи предлагаю следующую. Кнопка управляет бинарным актуатором, а в основном сценарии кроме отслеживания состояния motion и lamp добавить отслеживание этого актуатора. При его включении например останавливать таймер выключения лампы, при выключении наоборот. Как-то так
-
@int144, у меня тоже была такая идея. Хотя вот сейчас родилась мысль!!! В плагине megad можно сделать любой номер канала. Например, для порта 3 (висит кнопка) сделать каналы SW3_1, SW3_2, SW3_3. К ним привязать свои актуаторы (они будут виртуальными - на мнемосхеме не нужны). В расширениях пишем SW3_1=TOGGLE. А в сценарии, в котором участвует датчик движения, лампа и кнопка проверяем в каком состоянии находится SW3_1. Сейчас попробую сделать.
-
@Alex_Jet, не совсем понял. Канал SW3_1 в качестве актуатора? А еще можно попробовать, чтобы кнопка управляла свойством auto, но в примере сценария был оператор выключающий lamp, т.е. его тогда надо корректировать
-
@int144, да именно так. В принципе этот канал меняет свое состояние.
Вообще вот этот сценарий работает как надо правда только в том случае если выключатель находится вне помещения (включил свет, потом зашел в помещение). А вот в случае если кнопка находится внутри помещения - нужен совсем другой сценарий....
-
@Alex_Jet, у меня используется именно он. Кстати я его на данный момент немного доработал. Я добавил в сценарий лампу над зеркалом. И когда она включена у меня таймер запускается на 20 мин, а когда выключена - на 3.
-
@Alex_Jet, я тут подумал на досуге и предлагаю все таки первый вариант идеи и сценарий, на который Вы указали постом выше. Для реализации предлагаю добавить виртуальный актуатор и доп. сценарий. Указанный Вами сценарий остается без изменений. Актуатор (например lamp_sw) переключается кнопкой, которая должна включить lamp в основном сценарии на неограниченное время. Далее используем доп.сценарий
const lamp_sw = Device("ActorD", "Наш актуатор"); const lamp = Device("LAMP","Лампа из основного сценария"); startOnChange(lamp_sw); script({ start() { if (lamp_sw.isOn()) { lamp.setAuto(false); if (lamp.isOff()) lamp.on(); } else {