translator, wb_editors
4444
правки
Метки: правка с мобильного устройства правка из мобильной версии Расширенная мобильная правка |
Matveevrj (обсуждение | вклад) (Отметить эту версию для перевода) |
||
Строка 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: | ||
})(); | })(); | ||
</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: | ||
}); | }); | ||
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> |