Перейти к содержанию

Навигация

Движок правил wb-rules: различия между версиями

Строка 15: Строка 15:
'''Самую полную информацию по написанию правил смотрите здесь: [https://github.com/contactless/wb-rules https://github.com/contactless/wb-rules]. Ниже дана лишь краткая вводная информация и несколько примеров'''
'''Самую полную информацию по написанию правил смотрите здесь: [https://github.com/contactless/wb-rules https://github.com/contactless/wb-rules]. Ниже дана лишь краткая вводная информация и несколько примеров'''


Правила бывают двух типов - непосредственно правила (начинаются со слов ''defineRule'') и виртуальные устройства (начинаются со слов ''defineVirtualDevice''). Виртуальные устройства - это появляющиеся в веб-интерфейсе новые "виртуальные" элементы управления - например, кнопка-выключатель, которая на самом деле выключает два устройства одновременно.
Правила бывают двух типов - непосредственно правила (начинаются со слов ''defineRule'') и виртуальные устройства (начинаются со слов ''defineVirtualDevice''). Виртуальные устройства - это появляющиеся в веб-интерфейсе новые элементы управления - например, кнопка-выключатель, которая на самом деле выключает два устройства одновременно. Она не привязана напрямую ни к какому физическому устройству, а действия при её нажатии определяются написанным вами скриптом.


Любое количество разных правил можно хранить в одном файле. Обычно в одном файле хранятся правила, отвечающие за одну функцию.
Любое количество разных правил можно хранить в одном файле. Обычно в одном файле хранятся правила, отвечающие за близкие функции.


Сначала разберём обычное правило:
[[File:Web-scripts-rule1.png|400px|thumb|Правило для управления обогревателем, записанное через веб-интерфейс]]


Для начала разберём простое правило - при превышении температуры выключи обогреватель. Температуру получаем с датчика [[1-Wire]], обогреватель подключён к Реле 1 внешнего релейного модуля [[WB-MRM2]].
<syntaxhighlight lang="ecmascript">
<syntaxhighlight lang="ecmascript">


defineRule("motion_detector", { //название правила - motion_detector
defineRule("heater_control", { //название правила - "контроль обогревателя", может быть произвольным
   whenChanged: "wb-gpio/D1_IN", //при изменении состояния канала wb-gpio/D1_IN
   whenChanged: "wb-w1/28-0115a48fcfff", //при изменении состояния датчика 1-Wire с идентификатором 28-0115a48fcfff
   then: function (newValue, devName, cellName) {
   then: function (newValue, devName, cellName) { //выполняй следующие действия
dev["wb-gpio"]["Relay_2"] = newValue;
if ( dev["wb-w1"]["28-0115a48fcfff"] > 30) { //если температура датчика больше 30 градусов
dev["wb-mrm2_6"]["Relay 1"] = newValue;
      dev["wb-mrm2_130"]["Relay 1"] = 0; //установи Реле 1 модуля WB-MRM2 с адресом 130 в состояние "выключено"
 
    } else {
      dev["wb-mrm2_130"]["Relay 1"] = 1; //установи Реле 1 модуля WB-MRM2 с адресом 130 в состояние "включено"
    }
   }
   }
});
});


</syntaxhighlight>
</syntaxhighlight>
*Первая строка - кодовое слово ''defineRule'' и название правила
*Вторая строка - кодовое слово для определения, когда выполняется правило, - ''whenChanged'' - "при изменении параметра", далее название параметра, при изменении которого запустится правило - температура с датчика 1-Wire. Название параметра записывается в виде "Device/Control", где названия ''Device'' и ''Control'' для каждого параметра можно найти на странице ''Settings'' веб-интерфейса в таблице ''MQTT Channels''.
*Третья строка - начало функции, которая будет исполняться
*Затем идёт условие - "если значение температуры больше порогового, то ...". Значение параметра записывается в виде ''dev[Device][Control]'' - заметьте, оно отличается от вида записи параметра, при изменении которого запускается правило, потому что там речь идёт о ''параметре'', а здесь - о ''значении'' того же параметра.
*Затем мы выставляем значения для реле в каждом случае - ''0'' - "выключено", ''1'' - "включено". Названия ''Device'' и ''Control'' для реле смотрим всё в той же таблице ''MQTT Channels'' на странице ''Settings'' веб-интерфейса.