Для этого в Расширениях добавлен флаг Расширенный порт (одновременная сработка датчиков)
Все датчики, которые могут сработать одновременно, нужно прописать в одном запросе (обратите внимание, что для MCP расширения (ext) нумеруются с 0, а каналы на сервере с 1, т е ext0 - это 32_1 )
Пример: Входящее от контроллера:
/?pt=32&ext0=*&ext1=*&ext2=*&ext3=*&ext4=*&ext5=*&ext6=*&ext7=*
Установить состояния каналов:
32_1=%ext0%&32_2=%ext1%&32_3=%ext2%&32_4=%ext3%&32_5=%ext4%&32_6=%ext5%&32_7=%ext6%&32_8=%ext7%
Расширенный порт: Да
В результате, для входящего запроса /pt=32&ext1=1&ext7=0 будут установлены каналы 32_2=1 и 32_8=0
При отправке команды плагину из сценария (любые запросы, которые принимает MegaD) ответ от контроллера можно получить и обработать прямо в сценарии
Например, было можно отправить команду из сценария:
this.pluginCommand({unit:'megad1', command:{url:'/sec/?cmd=7:1', onResponse:[{id:"7",value:1}]});
Здесь отправляем запрос на включение выхода 7.
onResponse задает массив - какие каналы (и соответственно связанные с ними устройства) нужно установить после получения положительного ответа от MegaD
Теперь добавлена возможность отправлять запросы и анализировать ответ на уровне сценария Таким образом можем, например, читать состояния портов внутри сценария
this.pluginCommand({unit:'megad1', command:{url:'/sec/?pt=7&cmd=get', onResponse:'raw'}}, 'getResponse');
onResponse:'raw' означает, что нужно вернуть сценарию ответ контроллера напрямую Второй параметр - имя функции обработчика
Ответ придет, если контроллер доступен и вернул статус 200, иначе ответа не будет, функция-обработчик не сработает, а сценарий останется активным. Чтобы сценарий завершился, предусмотрен выход по таймауту.
script({
start() {
// Передать запрос на megad1, ответ без обработки пусть придет в сценарий (onResponse:'raw')
this.pluginCommand({unit:'megad1', command:{url:'/sec/?pt=7&cmd=get', onResponse:'raw'}}, 'getResponse');
// Взвести таймер на случай, если ответа от контроллера нет
this.startTimer('T1', 3, 'onTimeout');
},
getResponse(body) {
// body
this.log('getResponse body= '+body);
this.exit();
},
onTimeout() {
this.log('Истек таймаут, ответ от megad1 не получен');
this.exit();
}
});
Ранее функция была привязана к номеру порта контроллера, теперь - к идентификатору канала
При запуске сценария при получении запроса от контроллера в объект параметра добавлен ip-адрес
Работа с расширенными каналами выполняется аналогично обычным, за исключением того, что на один порт сажается несколько входов-выходов, поэтому:
- В сообщении в ответ на /pt=32&cmd=get контролер передает 8 (16) значений через ;
ON;OFF;OFF;OFF;OFF;OFF;OFF
При парсинге этого запроса данные записываются в каналы: 32_1,...32_8 - нумерация каналов начинается с 1!!!
- В ответе на cmd=all этих значений нет, для 32 канала пишется MCP:
ON;OFF;....;temp:23.00/hum:24.00;MCP;...
1. При запуске сценария при получении запроса от контроллера добавлена возможность передать параметр
-
Можно прописать параметр жестко в настройке. После выбора сценария становится доступно строковое поле Параметр сценария
-
Если Параметр сценария не заполнен, сценарий получает на входе объект запроса.
Само управление выполняется через меню устройства в основном интерфейсе, версия системы 4.4.12
При выборе AO появляется строка Команда управления, по умолчанию пустая.
Если ее оставить пустой, будет использоваться стандартная команда:
/%pwd%/?cmd=%adr%:%value% (после подстановки /sec/?cmd=12:255)
Для преобразования значения логического уровня (яркость 0-100%) в значение физического уровня (0-255) служат два следующих параметра:
- Значения логического уровня 0-
- Значения физического уровня 0-
Обратите внимание, что значение логического уровня должно соответствовать max значению виртуального устройства, иначе слайдер будет работать некорректно.
Для использования других команд MegaD пропишите команду строке Команда управления, например:
/%pwd%/?pt=%adr%&pwm=%value%&cnt=2 (/sec/?pt=12&pwm=255&cnt=2)
Можно прописать пароль/ адрес напрямую в команде
/sec/?pt=12&pwm=%value%&cnt=2
Также используется канал AO, к нему надо привязать виртуальное устройство типа RGB
В системе имеется 3 типа RGB устройств:
- RGB (3 канала),
- RGBW (4 канала),
- RGBWW - (5 каналов).
Для MegaD нужно выбрать 3 канальный вариант.
Название канала лучше дать абстрактное, не привязанное к каналу (rgb35, myrgb, ...)
В строке Команда управления прописать, например
/%pwd%/?pt=35&ws=%value%
Параметры "Значение физического уровня", "Значение логического уровня" никакого влияния на rgb не оказывают
Сценарий выбирается в таблице запросов.
Например, выдать импульс:
this.pluginCommand({unit:'megad1', command:'/sec/?cmd=7:1;p10;7:0'});
Управление лентой WS2818
this.pluginCommand({unit:'megad1', command:'/sec/?pt=35&ws=FF0000&chip=10');
Если переключается выход, можно в command отправить onResponse - что должно переключиться на интерфейсе:
this.pluginCommand({unit:'megad1', command:{url:'/sec/?cmd=7:1;8:0', onResponse:[{id:"7",value:1},{id:"8",value:0}]});
- Добавлено свойство: "Восстанавливать выход при перезагрузке контроллера"
Для этих выходов при получении st=1 отправляется команда on, если выход был в on
- Добавлен параметр "Отправлять время на контроллер"
Если галочка установлена, то при старте плагина и при получении с контроллера st=1 сервер отправляет время:
/sec/?cf=7&stime=10:57:06:4
- Добавлен параметр "Интервал отправки запросов (мсек)"
Запрос зависит от подключенного оборудования, подробнее см на сайте ab-log
Отличие от существующего функционала: нет привязки к порту MegaD, которая нужна, если данные канала считываются по команде cmd=all. Подробнее см Общий принцип адресации каналов MegaD
Например, есть запросы для I2C:
/sec/?pt=31&scl=34&i2c_dev=htu21d&i2c_par=1
/sec/?pt=31&scl=34&i2c_dev=htu21d
Cоздаем два канала. ID каналов может быть любым, привязка к порту 31 не нужна!!!
Например, i2c_htu21d или htu21d_31 или mySensor
- Запрос /sec/?pt=32&cmd=list
- Ответ содержит как DS18B20, так и DS2413:
aad6a070000:25.43;85a56a070000:32.43;79c439000000:OFF/OFF;c6c439000000:ON/ON
Канал DS18B20 формируется как обычно: 32_aad6a070000
Каналы DS2413: 32_79c439000000_A, 32_79c439000000_B
Время для опроса нужно как обычно выставить только в одном из каналов!!
Больше никакой настройки не требуется, команды управления будут сформированы автоматически:
/sec/?cmd=32A:1&addr=79c439000000
- Добавлены свойства
- "Использовать функцию обработки при получении данных от контроллера" - checkbox
- Функция обработки значения - многострочное поле для ввода функции
Функция обработки аналогична Berry - за исключением возвращаемого значения.
Вернуть нужно значение или undefined (return;)
- Входные параметры:
- val - значение c контроллера
- depo - объект, который хранит данные между вызовами функции
Внутри объекта можно создавать любые структуры
function (val, depo) {
if (!depo.res) depo.res = [];
depo.res.push(val);
if (depo.res.length < 5) return; //Нужны еще измерения, значение не возвращаем
depo.res.sort();
let result = ((depo.res[1] + depo.res[2] + depo.res[3]) / 3).toFixed(2);
depo.res = []; //Перед следующими измерениями сбрасываем массив
return result; // Возвращаем результат расчета
}