Wb-jscript: различия между версиями

Материал из Wiren Board
(Перенаправление на Wb-rules)
Метка: новое перенаправление
 
(не показано 46 промежуточных версий 4 участников)
Строка 1: Строка 1:
== Введение ==
#REDIRECT [[wb-rules]]
Задача автоматизации - это упростить человеку жизнь. “Умный дом” - это, конечно, частный случай. Но полезный.
Попытаемся применить скрипты контроллера WB (Wiren Board 6) для управления.
Текст ниже предназначен тем, кто не имеет опыта программирования, но хочет научиться.
 
== Используемое оборудование ==
* [[Wiren_Board_6|Контроллер]]
* [[WBIO-DI-WD-14_I/O_Module|Модуль WBIO-DI-WD-14]]
* [[WBIO-DO-R1G-16_I/O_Module|WBIO-DO-R1G-16]]
----
''В названиях “DI” - Digital Input “DO” - Output соответственно.''
 
== Программирование ==
 
=== Скрипт ===
Скриптом называется обыкновенный текстовый файл. Для того чтобы он выполнялся движком [[Движок_правил_wb-rules|wb-rules]] нужно выполнить два условия:
# Имя файла должно заканчиваться на '''.js'''
# Файл должен располагаться в каталоге '''/etc/wb-rules'''
[[Веб-интерфейс_Wiren_Board|Веб-интерфейс]] контроллера имеет встроенный редактор скриптов, доступный из его главного меню по ссылке '''"Rules"'''
 
== Выполнение скриптов ==
Только что созданный скрипт после нажатия кнопки "Save" (и при запуске wb-rules) сразу же выполнится. То есть, будут созданы все переменные, правила, таймеры. И дальнейшее поведение скрипта будет определяться только событиями, как внешними (изменения состояния устройств, на которые "подписаны" правила) так и таймерами.
 
== Переменные ==
Где хранить значения, а также строки и все остальное, включая ссылки на объекты? Именно в переменных.
Можно представить каждую переменную как коробку. Подписанную коробку.
Подпись - это имя переменной, а содержимое коробки - это ее значение.
 
Кроме "простых" переменных еще используются массивы. Массив - это "стопка" значений, которые определяются одним именем переменной и "номером" в стопке.
''Еще есть структуры (объекты), но о них - позже.''
 
<blockquote>'''Важно:''' JS, по умолчанию, при присвоении переменной одного типа значения другого типа - меняет тип переменной. Иногда это вызывает неожиданное поведение.</blockquote>
 
Типы переменных в JS:
* String: представляет строку
* Number: представляет числовое значение
* Boolean: представляет логическое значение true или false.
* undefined: указывает, что значение не установлено
* null: указывает на неопределенное значение
 
Ниже попробуем создать первый скрипт и поймем значение типов.
 
== Логи ==
Использование логов для отладки  - бесценно. Иметь возможность в любом месте скрипта записать текущее значение переменной, состояние устройства очень помогает.
Логи в WB двух типов - с записью в файл (/var/log/mesages) и  в mqtt топик.
Лог вызывается такой командой:
log.{debug,info,warning,error}(fmt, [arg1 [, ...]])
Научимся ими пользоваться, а заодно, и напишем первый скрипт.
В меню “Rules” нажимаем “New” и в поле для имени, вверху пишем “logs_and_vars_test.js”
И в поле скрипта вставляем:
<syntaxhighlight lang="ecmascript">
//logs_and_vars_test.js
//Просто комментарий. Начинается с двойного слеша "//"
var testvar1; //Переменная "testvar1" Ничего не присваиваем при объявлении(создании), "пустая"
log.info("Тип и значение переменной testvar1", typeof(testvar1), testvar1); // Тип (и значение) undefined
testvar1 = "yellow submarine"; // Присвоим строку
log.info("Тип и значение переменной testvar1", typeof(testvar1), testvar1);
testvar1 = 42; //Присвоим число
log.info("Тип и значение переменной testvar1", typeof(testvar1), testvar1);
testvar1 = false; //Булево (true/false)
log.info("Тип и значение переменной testvar1", typeof(testvar1), testvar1);
 
testvar2 = "red submarine"; //Сразу при объявлении присваиваем значение
log.info("Тип и значение переменной testvar2", typeof(testvar2), testvar2);
 
testvar1 = testvar2; //Тип testvar1 - булево. testvar2 - строка
log.info("Тип и значение переменной testvar1", typeof(testvar1), testvar1);  // при присвоении тип поменялся.
 
</syntaxhighlight>
 
<blockquote>''Не забывайте '''пустую''' строку в конце скрипта.</blockquote>
 
<br>Прежде чем сохранять, давайте зададимся вопросом “как же логи читать?”
Два (даже три) способа.
* Самый простой: нажимаем на кнопку с символом гаечного ключа. Она находится в нижнем правом углу окна редактора скриптов.
[[Файл:Wb-jscript-Logs-1.png|200px|thumb|center|Кнопка для логов]]
Нажимаем - выдвигается консоль. Пока пустая, но после нажатия ''кнопки "Save"'' сюда выводятся сообщения.
[[Файл:Wb-jscript-Logs-2.png|400px|thumb|center|Панель лога]]
 
* Чуть сложнее: открываем ssh сессию на контроллере и вводим
<syntaxhighlight lang="bash">
tail -f /var/log/messages |grerp wb-rules
</syntaxhighlight>
Команда просматривает файл и при появлении в нем строчек с "'''wb-rules'''"
Нажмем опять ''кнопку "Save"'' - выводит их в '''stdout''' (на экран)
[[Файл:Wb-jscript-Logs-bash.png|400px|thumb|center|Логи в SSH сессии]]
<blockquote>
Чтобы кнопка "Save" стала вновь активной, надо что-нибудь изменить в окне редактора. Например, добавить пробел.
</blockquote>
Можно убедиться, что скрипт выполняется и даже совершает полезное действие - выводит сообщения.
 
Функция <syntaxhighlight lang="ecmascript">typeof</syntaxhighlight> принимает в качестве аргумента (то, что в скобках) '''переменную''' и возвращает нам ее '''тип'''
 
Если выполнить код:
<syntaxhighlight lang="ecmascript">
variable1 = "yellow submarine";
variable2 = typeof(variable1);
</syntaxhighlight>
 
То <syntaxhighlight lang="ecmascript">variable2</syntaxhighlight> будет иметь тип "'''string'''" и значение "'''yellow submarine'''"
 
== Условия ==
Очень часто нужно что-нибудь с чем-то сравнить. Например, температуру с желаемой (с ''уставкой'' на тайном языке наладчиков-проектировщиков).
Напишем простой пример, в котором сравним два значения.
<syntaxhighlight lang="ecmascript">
 
 
</syntaxhighlight>
 
<blockquote>''Не забывайте '''пустую''' строку в конце скрипта.</blockquote>
 
 
=== Использование ===
=== Отладка ===
 
== Управление оборудованием ==
 
== Таймеры ==

Текущая версия на 13:48, 19 января 2022

Перенаправление на: