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

Навигация

Rule Examples: различия между версиями

Отметить эту версию для перевода
Метки: правка с мобильного устройства правка из мобильной версии Расширенная мобильная правка
(Отметить эту версию для перевода)
Строка 78: Строка 78:
var motion_timer_1_id = null;
var motion_timer_1_id = null;


<!--T:191-->
defineRule("motion_detector_1", {
defineRule("motion_detector_1", {
     whenChanged: "wb-gpio/D2_IN",
     whenChanged: "wb-gpio/D2_IN",
Строка 311: Строка 312:
})();
})();


<!--T:69-->
</syntaxhighlight>
</syntaxhighlight>
== Импульсные счетчики ==
== Импульсные счетчики == <!--T:69-->


<!--T:192-->
Импульсный счетчик подключен к WB-MCM8. Выдает 1 импульс на 10 литров воды. При подключении на счетчике были показания 123.120 м³, что равно 123120 литрам воды. У WB-MCM8 при подключении было насчитано 7 импульсов.
Импульсный счетчик подключен к WB-MCM8. Выдает 1 импульс на 10 литров воды. При подключении на счетчике были показания 123.120 м³, что равно 123120 литрам воды. У WB-MCM8 при подключении было насчитано 7 импульсов.


<!--T:193-->
<syntaxhighlight lang="ecmascript">
<syntaxhighlight lang="ecmascript">
var meterCorrection = 123120 // Корректировочное значение счетчика в литрах
var meterCorrection = 123120 // Корректировочное значение счетчика в литрах
Строка 322: Строка 324:
var inpulseValue = 10 // Количество литров на один импульс
var inpulseValue = 10 // Количество литров на один импульс


<!--T:194-->
defineVirtualDevice("water_meters", { // Создаем виртуальный девайс для отображения в веб интерфейсе.
defineVirtualDevice("water_meters", { // Создаем виртуальный девайс для отображения в веб интерфейсе.
     title: "Счетчики воды",
     title: "Счетчики воды",
Строка 332: Строка 335:
});
});


<!--T:195-->
defineRule("water_meter_1", {
defineRule("water_meter_1", {
     whenChanged: "wb-mcm8_29/Input 1 counter",
     whenChanged: "wb-mcm8_29/Input 1 counter",
Строка 342: Строка 346:
</syntaxhighlight>
</syntaxhighlight>


== Обработка счётчиков нажатий ==
== Обработка счётчиков нажатий == <!--T:196-->
{{Anchor|press-actions}}
{{Anchor|press-actions}}
=== Описание ===
=== Описание ===
Последние версии прошивок устройств Wiren Board могут распознавать типы нажатий подключённых к входам кнопок и транслировать их по [[Modbus]] на контроллер Wiren Board. О том, как устройство распознаёт типы нажатий, читайте в его документации.  
Последние версии прошивок устройств Wiren Board могут распознавать типы нажатий подключённых к входам кнопок и транслировать их по [[Modbus]] на контроллер Wiren Board. О том, как устройство распознаёт типы нажатий, читайте в его документации.  


<!--T:197-->
Для обработки нажатий нужно отслеживать на контроллере состояние счётчика нужного типа нажатия и, при его изменении, выполнять действие.
Для обработки нажатий нужно отслеживать на контроллере состояние счётчика нужного типа нажатия и, при его изменении, выполнять действие.


<!--T:198-->
Обработку счётчиков удобно делать на [[wb-rules]], но вы можете использовать любой инструмент для автоматизации, например, [[Node-RED]]. Чтобы ускорить опрос счетчиков, настройте [[RS-485:Configuration via Web Interface#poll-period |период опроса]].
Обработку счётчиков удобно делать на [[wb-rules]], но вы можете использовать любой инструмент для автоматизации, например, [[Node-RED]]. Чтобы ускорить опрос счетчиков, настройте [[RS-485:Configuration via Web Interface#poll-period |период опроса]].


=== Примеры ===
=== Примеры === <!--T:199-->
{{YouTube
{{YouTube
|link=https://youtu.be/C60KB7TCeKg
|link=https://youtu.be/C60KB7TCeKg
Строка 362: Строка 368:
# Короткое, а затем длинное — уменьшает яркость.
# Короткое, а затем длинное — уменьшает яркость.


<!--T:200-->
Так как изменение яркости требует растянутое во времени действие, то мы используем таймер. Также мы контролируем состояние входа с кнопкой и прекращаем действие при отпускании кнопки.
Так как изменение яркости требует растянутое во времени действие, то мы используем таймер. Также мы контролируем состояние входа с кнопкой и прекращаем действие при отпускании кнопки.


<!--T:201-->
<syntaxhighlight lang="js">
<syntaxhighlight lang="js">
/* ---------------------------- */
/* ---------------------------- */
Строка 369: Строка 377:
/* ---------------------------- */
/* ---------------------------- */


<!--T:202-->
defineRule({
defineRule({
   whenChanged: "wb-mcm8_20/Input 1 Single Press Counter",
   whenChanged: "wb-mcm8_20/Input 1 Single Press Counter",
Строка 377: Строка 386:




<!--T:203-->
/* ---------------------------- */
/* ---------------------------- */
/* 2. Double Press Counter: Off action*/
/* 2. Double Press Counter: Off action*/
/* ---------------------------- */
/* ---------------------------- */


<!--T:204-->
defineRule({
defineRule({
   whenChanged: "wb-mcm8_20/Input 1 Double Press Counter",
   whenChanged: "wb-mcm8_20/Input 1 Double Press Counter",
Строка 389: Строка 400:




<!--T:205-->
/* --------------------------------------- */
/* --------------------------------------- */
/* 3. Long Press Counter: Increase brightness */
/* 3. Long Press Counter: Increase brightness */
/* --------------------------------------- */
/* --------------------------------------- */


<!--T:206-->
defineRule({
defineRule({
   whenChanged: "wb-mcm8_20/Input 1 Long Press Counter",
   whenChanged: "wb-mcm8_20/Input 1 Long Press Counter",
Строка 401: Строка 414:
});
});


<!--T:207-->
// A rule that will increase the brightness on a timer
// A rule that will increase the brightness on a timer
defineRule({
defineRule({
Строка 407: Строка 421:
     var i = dev["wb-mdm3_58/Channel 1"];
     var i = dev["wb-mdm3_58/Channel 1"];


     if (i < 100 && dev["wb-mcm8_20/Input 1"]) {
     <!--T:208-->
if (i < 100 && dev["wb-mcm8_20/Input 1"]) {
       i++
       i++
       dev["wb-mdm3_58/Channel 1"] = i
       dev["wb-mdm3_58/Channel 1"] = i
Строка 417: Строка 432:




<!--T:209-->
/* -------------------------------------------- */
/* -------------------------------------------- */
/* 4. Shortlong Press Counter: Decrease brightness */
/* 4. Shortlong Press Counter: Decrease brightness */
/* -------------------------------------------- */
/* -------------------------------------------- */


<!--T:210-->
defineRule({
defineRule({
   whenChanged: "wb-mcm8_20/Input 1 Shortlong Press Counter",
   whenChanged: "wb-mcm8_20/Input 1 Shortlong Press Counter",
Строка 429: Строка 446:
});
});


<!--T:211-->
// A rule that will decrease the brightness on a timer
// A rule that will decrease the brightness on a timer
defineRule({
defineRule({
Строка 435: Строка 453:
     var i = dev["wb-mdm3_58/Channel 1"];
     var i = dev["wb-mdm3_58/Channel 1"];


     if (i > 0 && dev["wb-mcm8_20/Input 1"]) {
     <!--T:212-->
if (i > 0 && dev["wb-mcm8_20/Input 1"]) {
       i--
       i--
       dev["wb-mdm3_58/Channel 1"] = i
       dev["wb-mdm3_58/Channel 1"] = i
Строка 444: Строка 463:
});
});


<!--T:213-->
</syntaxhighlight>
</syntaxhighlight>


=== Универсальный модуль для wb-rules ===
=== Универсальный модуль для wb-rules === <!--T:214-->
Мы написали модуль для wb-rules [https://github.com/wirenboard/wb-community/tree/main/wb-press-actions wb-press-actions], который облегчает обработку нажатий в ваших скриптах.
Мы написали модуль для wb-rules [https://github.com/wirenboard/wb-community/tree/main/wb-press-actions wb-press-actions], который облегчает обработку нажатий в ваших скриптах.


== Датчик MSW v.3 ==
== Датчик MSW v.3 == <!--T:215-->


<!--T:216-->
При подключении датчика WB-MSW v.3 к контроллеру Wiren Board есть возможность создавать интересные сценарии, используя данные с датчика. На пример Включать свет по движению, сигнализировать светодиодами о превышении значения СО2 или VOC, Включать Кондиционер, если жарко или увлажнитель воздуха, если воздух слишком сухой. Правила создаются индивидуально под задачи. Здесь мы приведем несколько примеров для понимания принципа работы с датчиком. Больше примеров написания правил можно найти в документации '''[[Движок правил wb-rules]]'''.
При подключении датчика WB-MSW v.3 к контроллеру Wiren Board есть возможность создавать интересные сценарии, используя данные с датчика. На пример Включать свет по движению, сигнализировать светодиодами о превышении значения СО2 или VOC, Включать Кондиционер, если жарко или увлажнитель воздуха, если воздух слишком сухой. Правила создаются индивидуально под задачи. Здесь мы приведем несколько примеров для понимания принципа работы с датчиком. Больше примеров написания правил можно найти в документации '''[[Движок правил wb-rules]]'''.


=== CO2 ===
=== CO2 === <!--T:217-->
При концентрации CO2 меньше 650 - раз в 10 секунд мигаем зеленым.
При концентрации CO2 меньше 650 - раз в 10 секунд мигаем зеленым.


<!--T:218-->
При концентрации CO2 свыше 651, но меньше 1000 - раз в 5 секунд мигаем желтым.
При концентрации CO2 свыше 651, но меньше 1000 - раз в 5 секунд мигаем желтым.


<!--T:219-->
При концентрации CO2 свыше 1001 - раз в секунду мигаем красным.
При концентрации CO2 свыше 1001 - раз в секунду мигаем красным.
<div class="mw-collapsible mw-collapsed"; style="width:600px; overflow: hidden;">
<div class="mw-collapsible mw-collapsed"; style="width:600px; overflow: hidden;">
Строка 487: Строка 510:
</syntaxhighlight>
</syntaxhighlight>
</div>
</div>
=== Max Motion ===
=== Max Motion === <!--T:220-->
"Max Motion" - максимальное значение датчика движения за N время. Время от 1 до 60 секунд можно выставить в 282 регистре. По умолчанию 10 секунд. При достижении Max Motion значения 50 проверяем достаточно ли освещена комната, если нет - включаем свет. Как только значение Max Motion упадет ниже 50 свет выключаем.
"Max Motion" - максимальное значение датчика движения за N время. Время от 1 до 60 секунд можно выставить в 282 регистре. По умолчанию 10 секунд. При достижении Max Motion значения 50 проверяем достаточно ли освещена комната, если нет - включаем свет. Как только значение Max Motion упадет ниже 50 свет выключаем.


<!--T:221-->
<div class="NavFrame">
<div class="NavFrame">
   <div class="NavContent">
   <div class="NavContent">
Строка 511: Строка 535:
== Системные правила == <!--T:70-->
== Системные правила == <!--T:70-->


<!--T:222-->
Многие показания, которые видны в веб-интерфейсе контроллера из коробки, тоже создаются правилами на движке wb-rules. Их код находится здесь: [https://github.com/wirenboard/wb-rules-system https://github.com/wirenboard/wb-rules-system]. Системные правила собраны в пакет <code>wb-rules-system</code>, сами файлы скриптов на контроллере находятся в папке <code>/usr/share/wb-rules-system/</code>.  
Многие показания, которые видны в веб-интерфейсе контроллера из коробки, тоже создаются правилами на движке wb-rules. Их код находится здесь: [https://github.com/wirenboard/wb-rules-system https://github.com/wirenboard/wb-rules-system]. Системные правила собраны в пакет <code>wb-rules-system</code>, сами файлы скриптов на контроллере находятся в папке <code>/usr/share/wb-rules-system/</code>.  


Строка 675: Строка 700:
</syntaxhighlight>
</syntaxhighlight>


== Термостат ==
== Термостат == <!--T:223-->
Пример простого термостата из [https://support.wirenboard.com/t/novaya-versiya-dvizhka-pravil/4196/158 темы на портале поддержки].
Пример простого термостата из [https://support.wirenboard.com/t/novaya-versiya-dvizhka-pravil/4196/158 темы на портале поддержки].


<!--T:224-->
<syntaxhighlight lang="js">
<syntaxhighlight lang="js">
defineVirtualDevice("Termostat", {
defineVirtualDevice("Termostat", {
Строка 698: Строка 724:
    },.......
    },.......


<!--T:225-->
var hysteresis = 0.5;
var hysteresis = 0.5;
function Termostat(name, temp, setpoint, TS, TS_onoff) {
function Termostat(name, temp, setpoint, TS, TS_onoff) {
Строка 716: Строка 743:
}
}


<!--T:226-->
Termostat("R01-TS16-1", "A60-M1W3/External Sensor 1", "Termostat/R01-TS16-1-setpoint", "wb-gpio/EXT4_R3A1", "Termostat/R01-TS16-1-onoff"); // Прихожая теплый пол
Termostat("R01-TS16-1", "A60-M1W3/External Sensor 1", "Termostat/R01-TS16-1-setpoint", "wb-gpio/EXT4_R3A1", "Termostat/R01-TS16-1-onoff"); // Прихожая теплый пол


Строка 899: Строка 927:
</syntaxhighlight>
</syntaxhighlight>


== Отправка сообщения через Telegram-бота ==
== Отправка сообщения через Telegram-бота == <!--T:227-->
{{Anchor|telegram}}
{{Anchor|telegram}}
Сообщения отправляются с использованием [https://core.telegram.org/api#telegram-api Telegram API] через <code>curl</code>.
Сообщения отправляются с использованием [https://core.telegram.org/api#telegram-api Telegram API] через <code>curl</code>.


<!--T:228-->
<syntaxhighlight lang="ecmascript">
<syntaxhighlight lang="ecmascript">
var message = "Text"; // напишите свой текст сообщения
var message = "Text"; // напишите свой текст сообщения
Строка 909: Строка 938:
var command = 'curl -s -X POST https://api.telegram.org/bot{}/sendMessage -d chat_id={} -d text="{}"'.format(token, chat_id, message);
var command = 'curl -s -X POST https://api.telegram.org/bot{}/sendMessage -d chat_id={} -d text="{}"'.format(token, chat_id, message);


<!--T:229-->
runShellCommand(command);
runShellCommand(command);
</syntaxhighlight>
</syntaxhighlight>


== Обработка ошибок в работе с serial-устройствами ==
== Обработка ошибок в работе с serial-устройствами == <!--T:230-->
Реализована через подписку на все топики '''meta/error'''.
Реализована через подписку на все топики '''meta/error'''.


<!--T:231-->
<syntaxhighlight lang="ecmascript">
<syntaxhighlight lang="ecmascript">
defineVirtualDevice("meta_error_test", {
defineVirtualDevice("meta_error_test", {
Строка 933: Строка 964:


   
   
<!--T:232-->
trackMqtt("/devices/+/controls/+/meta/error", function(message){
trackMqtt("/devices/+/controls/+/meta/error", function(message){
   log.info("name: {}, value: {}".format(message.topic, message.value))
   log.info("name: {}, value: {}".format(message.topic, message.value))
Строка 946: Строка 978:




<!--T:233-->
[[File:Sample-custom-config-1.png|300px|thumb|right|Пример конфигурации]]
[[File:Sample-custom-config-1.png|300px|thumb|right|Пример конфигурации]]
[[File:Sample-custom-config-2.png|300px|thumb|right|Пример скрипта]]
[[File:Sample-custom-config-2.png|300px|thumb|right|Пример скрипта]]
Строка 954: Строка 987:
Но сложную настройку с меню и вариантами так не сделать.
Но сложную настройку с меню и вариантами так не сделать.


<!--T:234-->
Правильный, но сложный способ — создать новую вкладку в разделе Configs с редактируемыми полями параметров установок .
Правильный, но сложный способ — создать новую вкладку в разделе Configs с редактируемыми полями параметров установок .


<!--T:235-->
Потребуются три файла:
Потребуются три файла:


<!--T:236-->
1. Схема вывода html странички в разделе Configs : /usr/share/wb-mqtt-confed/schemas/test-config.schema.json
1. Схема вывода html странички в разделе Configs : /usr/share/wb-mqtt-confed/schemas/test-config.schema.json
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 965: Строка 1001:
"description":"Long description configuration",
"description":"Long description configuration",


<!--T:237-->
"configFile": {
"configFile": {
"path":"/etc/test-config.conf",
"path":"/etc/test-config.conf",
Строка 970: Строка 1007:
},
},


<!--T:238-->
"properties": {
"properties": {
"temperature_setpoint": {
"temperature_setpoint": {
Строка 980: Строка 1018:
},
},


<!--T:239-->
"humidity_setpoint": {
"humidity_setpoint": {
"type":"number",
"type":"number",
Строка 993: Строка 1032:
</syntaxhighlight>
</syntaxhighlight>


<!--T:240-->
2. Описание конфигурации по умолчанию (при сохранении формы в веб интерфейсе, значения запишутся в этот файл) : /etc/test-config.conf
2. Описание конфигурации по умолчанию (при сохранении формы в веб интерфейсе, значения запишутся в этот файл) : /etc/test-config.conf
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
Строка 1001: Строка 1041:
</syntaxhighlight>
</syntaxhighlight>


<!--T:241-->
3. Скрипт, обновляющий конфиг : /mnt/data/etc/wb-rules/test-config-script.js
3. Скрипт, обновляющий конфиг : /mnt/data/etc/wb-rules/test-config-script.js


<!--T:242-->
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
var config = readConfig("/etc/test-config.conf");
var config = readConfig("/etc/test-config.conf");


<!--T:243-->
log("temperature setpoint is: {}".format(config.temperature_setpoint));
log("temperature setpoint is: {}".format(config.temperature_setpoint));
</syntaxhighlight>
</syntaxhighlight>


<!--T:244-->
Последний файл можно в том числе редактировать из веб-интерфейса на вкладке Scripts.
Последний файл можно в том числе редактировать из веб-интерфейса на вкладке Scripts.


<!--T:245-->
В json файлах описаны схемы вывода html странички браузером, по общепринятому стандарту отображения. Описание ключей тут: json-schema.org.
В json файлах описаны схемы вывода html странички браузером, по общепринятому стандарту отображения. Описание ключей тут: json-schema.org.


<!--T:246-->
После создания файлов, нужно выполнить рестарт сервисов
После создания файлов, нужно выполнить рестарт сервисов


<!--T:247-->
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
service wb-mqtt-confed restart
service wb-mqtt-confed restart


<!--T:248-->
service wb-rules restart
service wb-rules restart
</syntaxhighlight>
</syntaxhighlight>


<!--T:249-->
При нажатии кнопки Save в веб-интерфейсе, будет перезапускаться сервис wb-rules, а значения установок - записываться в правила.
При нажатии кнопки Save в веб-интерфейсе, будет перезапускаться сервис wb-rules, а значения установок - записываться в правила.


Строка 1444: Строка 1493:
   });
   });


   <!--T:190-->
   defineRule("acVegOff", {
defineRule("acVegOff", {
     when: function() {
     when: function() {
       return vegetablesTemperature < 17.8
       return vegetablesTemperature < 17.8
Строка 1456: Строка 1504:
})()
})()
</syntaxhighlight>
</syntaxhighlight>
== Полезные ссылки ==
== Полезные ссылки == <!--T:190-->
* [[Wb-rules | Краткое описание wb-rules на wiki]]
* [[Wb-rules | Краткое описание wb-rules на wiki]]
* [https://github.com/wirenboard/wb-rules Полное описание wb-rules на Github]
* [https://github.com/wirenboard/wb-rules Полное описание wb-rules на Github]
</translate>
</translate>
translator, wb_editors
4218

правок