# Содержание
- [Описание](#description)
- [Введение с примерами](#getting-started)
- [Пример 1](#sample-1)
- [Пример 2](#sample-2)
- [Пример 3](#sample-3)
- [Блоки](#blocks)
- [Системные блоки](#system-blocks)
- [Отладка](#debug-output)
- [Комментарий](#comment)
- [Управление состоянием](#control-state)
- [Обновление состояния](#update-state)
- [Связывание состояний](#bind-states)
- [Запись состояний](#write-states)
- [Создание переменных](#create-state)
- [Получение значения состояния](#get-value-of-state)
- [Получение ID объекта](#get-object-id)
- [Исполнительные блоки](#actions-blocks)
- [Exec - выполнение](#exec---execute)
- [Запросить URL](#request-url)
- [Отправить Блокам](#send-to-blocks)
- [Отправить к telegram](#send-to-telegram)
- [Отправить к SayIt](#send-to-sayit)
- [Отправить к pushover](#send-to-pushover)
- [Отправить к email](#send-email)
- [Пользовательское sendTo block](#custom-sendto-block)
- [Блоки даты и времени](#date-and-time-blocks)
- [Сравнение времени](#time-comparision)
- [Сравнение фактического времени](#actual-time-comparision)
- [Получение фактического формата времени](#get-actual-time-im-specific-format)
- [Получение времени астрономических событий на сегодня](#get-time-of-astro-events-for-today)
- [Преобразование блоков](#convert-blocks)
- [Преобразование к числовому формату](#convert-to-number)
- [Преобразование к формату Boolean](#convert-to-boolean)
- [Получение типа переменной](#get-type-of-variable)
- [Преобразование в date/time object](#convert-to-datetime-object)
- [Преобразование date/time object к string](#convert-datetime-object-to-string)
- [Преобразование JSON к object](#convert-json-to-object)
- [Преобразование object к JSON](#convert-object-to-json)
- [Преобразование c JSONata выражением](#convert-by-jsonata-expression)
- [Триггер](#trigger)
- [Триггер по состояниям](#trigger-on-states-change)
- [Триггер по изменению состояния](#trigger-on-state-change)
- [Информация триггера](#trigger-info)
- [Расписание](#schedule)
- [Триггер по астрономическому событию](#trigger-on-astro-event)
- [Именованное расписание](#named-schedule)
- [Очистка расписания](#clear-schedule)
- [CRON диалог](#cron-dialog)
- [CRON правило](#cron-rule)
- [Событие при обновлении файла](#событие-при-обновлении-файла)
- [Отменить событие при обновлении файла](#отменить-событие-при-обновлении-файла)
- [Таймауты](#timeouts)
- [Задержка выполнения](#delayed-execution)
- [Очистить отложенное выполнение](#clear-delayed-execution)
- [Выполнение по интервалу](#execution-by-interval)
- [Остановить выполнение по интервалу](#stop-execution-by-interval)
- [Логические](#logic)
- [Блок If else](#if-else-block)
- [Блок сравнения](#comparision-block)
- [Логический блок AND/OR](#logical-and-or-block)
- [Блок отрицания](#negation-block)
- [Логическое значение TRUE/FALSE](#logical-value-true-false)
- [Нулевой блок](#null-block)
- [Тестовый блок](#test-block)
- [Циклы](#loops)
- [Повторить N раз](#repeat-n-times)
- [Повторять пока](#repeat-while)
- [Счетчик](#count)
- [Для каждого](#for-each)
- [Выйти из цикла](#break-out-of-loop)
- [Математические](#math)
- [Числовое значение](#number-value)
- [Арифметические операции +-\*/^](#arithmetical-operations--)
- [Корень квадратный, Abs, -, ln, log10, e^, 10^](#square-root-abs---ln-log10-e-10)
- [sin, cos, tan, asin, acos, atan](#sin-cos-tan-asin-acos-atan)
- [Математические постоянные: pi, e, phi, sqrt(2), sqrt(1/2), infinity](#math-constants-pi-e-phi-sqrt2-sqrt12-infinity)
- [Четное, нечетное, простое, целое, положительное, отрицательное, делимое на](#is-even-odd-prime-whole-positive-negative-divisibly-by)
- [Изменение переменной со знаком плюс или минус](#modify-variably-by-value-plus-or-minus)
- [Округленное, приближенное, действительное значение](#round-floor-ceil-value)
- [Операции со списком значений: сумма, минимум, максимум, среднее, медиана, мода, отклонения, случайное значение](#operations-on-the-list-of-values-sum-min-max-average-median-modes-deviation-random-item)
- [Модуль](#modulus)
- [Установить предел для значения по минимуму и максимуму](#limit-some-value-by-min-and-max)
- [Случайное значение от 0 до 1](#random-value-from-0-to-1)
- [Случайное значение между минимальным или максимальным](#random-value-between-min-and-max)
- [Текст](#text)
- [Строковое значение](#string-value)
- [Объединение строк](#concatenate-strings)
- [Добавить строку в переменную](#append-string-to-variable)
- [Длина строки](#length-of-string)
- [Строка пустая](#is-string-empty)
- [Найти позицию в строке](#find-position-in-string)
- [Получить символ в строке по определенной позиции](#get-symbol-in-string-on-specific-position)
- [Получить подстроку](#get-substring)
- [Преобразование в верхний или в нижний регистр](#Convert-to-upper-case-or-to-lower-case)
- [Строка обрезки](#trim-string)
- [Списки](#lists)
- [Создать пустой список](#create-empty-list)
- [Создать список значений](#create-list-with-values)
- [Создать список с тем же значением N раз](#create-list-with-same-value-n-times)
- [Получить длину списка](#get-length-of-list)
- [Список пуст](#is-list-empty)
- [Найти позицию элемента в списке](#Find-position-of-item-in-list)
- [Получить элемент в списке](#get-item-in-list)
- [Указать элемент в списке](#set-item-in-list)
- [Получить подсписок](#get-sublist-of-list)
- [Преобразование текста в список и наоборот](#convert-text-to-list-and-vice-versa)
- [Цвет](#colour)
- [Цветовое значение](#colour-value)
- [Произвольный цвет](#random-colour)
- [RGB палитра](#rgb-colour)
- [Смешанные цвета](#mix-colours)
- [Переменные](#variables)
- [Установить значение переменной](#set-variables-value)
- [Получить значение переменной](#get-variables-value)
- [Функции](#functions)
- [Создать функцию из блоков без возвращения значения](#create-function-from-blocks-with-no-return-value)
- [Создать функцию из блоков с возвращением значения](#create-function-from-blocks-with-return-value)
- [Вернуть значение в функцию](#return-value-in-function)
- [Создать пользовательскую функцию без возвращения значения](#create-custom-function-with-no-return-value)
- [Создать пользовательскую функцию с возвращением значения](#create-custom-function-with-return-value)
- [Вызов функции](#call-function)
# Описание
Blockly - визуальный редактор, который позволяет пользователям писать программы, составляя блоки вместе. Он предназначен для людей, у которых отсутствует опыт работы в области программирования.
# Введение с примерами
## Пример 1
**Управление переменной по изменению какой-либо другой переменной**

Это классический случай включения или выключения чего-либо по другому событию.
В этом случае свет включается или выключается, если обнаружено движение или детектор движения посылает состояние IDLE.
Прежде всего вставьте блок «События => Событие: если объект». Выберите объект (Motion), состояние которого будет использоваться для управления этим событием.
Добавьте в событие другой блок - "Системные => установить объект на" и выберите объект (Light), состояние которого должно управляться событием.
Вставьте в блок "установить" блок - «Системные => Значение у объекта» и выберите в диалоговом окне объект (Motion), значение которого будет записано в объект (Light).
В блоке триггера есть специальная переменная ** значение "". Эта переменная всегда там определена, используйте ее по своему усмотрению. Данная переменная содержит текущее значение состояния триггера, при этом вы также можете создать более простое правило, используя блок «Переменная =>элемент» и переименовать его в «значение».

```
Switch light ON or OFF it motion detected or IDLE
ne
javascript.0.Motion
javascript.0.Light
FALSE
val
javascript.0.Motion
```
## Пример 2
**Включить свет при движении и выключить через 10 минут, если движение не обнаружено.**

Если состояние «Движение» стало true, выполните:
- выключатель «Свет» включить
- запустить задержку на 10 минут, чтобы выключить «Свет» и очистить все установленные задержки для этого состояния
Вы можете заметить, что флаг «очистка запущенных» уже установлен последней командой. Это позволит очистить все запущенные таймеры для данного состояния, а таймер будет перезапущен.
```
Switch light ON and OFF in 10 minutes of IDLE
true
true
javascript.0.Motion
javascript.0.Light
FALSE
TRUE
javascript.0.Light
TRUE
600000
TRUE
FALSE
```
## Пример 3
**Отправить электронное сообщение, если температура воздуха на улице превысит 25°С.**

Пояснение:
Сначала мы должны определить переменную, чтобы знать, отправлялось или нет электронной почтой оповещение о превышении температуры, и заполнить ее значением «ложь».
Затем мы подписываемся на изменения температуры. Мы можем выполнять наше правило периодически, но это не настолько эффективно.
Если температура изменилась, мы сравниваем ее значение с 25 и проверяем состояние переменной отправки.
Если оповещение не отправлялось и температура превысила 25°С, мы заполняем переменную отправки значением "истина" и отправляем оповещение по электронной почте. Конечно, перед установкой и настройкой должен быть установлен адаптер электронной почты.
При понижении температуры ниже 23°С заполняем переменную отправки значением "ложь".
Мы сравниваем температуру с 23, чтобы не отправлять электронные письма каждый раз, когда температура колеблется около 25°С.
Чтобы создать блок «if ... else if ...», вы должны нажать на значок шестеренки и добавить необходимые части в блок «IF».

Вы можете указать комментарий для каждого блока, выбрав «Добавить комментарий» в контекстном меню. Позднее вы можете открыть комментарии, нажав на значок вопросительного знака.

Вы можете свернуть некоторые большие блоки для лучшего представления кода путем выбора в контекстном меню «Свернуть блок».

Пример для импорта:
```
Send email if outside temperature is more than 25 grad Celsius.
emailSent
FALSE
ne
true
javascript.0.Outside_temperature
AND
EQ
emailSent
FALSE
emailSent
Remember, that email was sent
FALSE
FALSE
log
myaddress@domain.com
Temperature is over 25°C
Temperature alert
LT
value
23
emailSent
FALSE
```
# Блоки
## Системные блоки
### Отладка

Этот блок ничего не делает, кроме как выводит строки записей в журнал. Вы можете использовать его для отладки вашего скрипта.
Как этот:

```
Print time into log every second
interval
1000
log
test
hh:mm:ss
```
Для сообщения можно указать 4 уровня важности:
- отладка (уровень отладки javascript адаптера должен быть включен)
- info (по умолчанию, по крайней мере, уровень info log должен быть установлен в настройках экземпляра javascript)
- предупреждение
- ошибка - будет отображаться всегда. Другие уровни важности могут быть проигнорированы, если важность журналирования в javascirpt адаптере выше.
### Комментарий

Напишите комментарии к своему коду, чтобы позже было проще его понимать.
Комментарий ничего не делает, это просто комментарий.
### Управление состоянием

Вы можете описать состояние двумя различными способами:
- контролируя что-либо и отправляя команду для завершения работы технического средства (этот блок)
- обновить некоторое состояние, чтобы просто информировать о, например,новой температуре ([next block](#update-state))
Типовое использование блока:

ID объекта должен быть выбран из диалога, и значение также должно быть определено. В зависимости от типа состояния, значение может быть [string](#string-value), [number](#number-value) или [boolean](#ogical-value-trueflase)..
Описание можно прочесть [тут](https://github.com/ioBroker/ioBroker/wiki/Adapter-Development-Documentation#commands-and-statuses).
Этот блок записывает команду в состояние (ack = false). Кроме того, можно указать задержку.
Если задержка не равна 0, состояние будет установлено не сразу, а после определенного в миллисекундах периода времени.
Вы можете остановить все запущенные уставки задержек при помощи управляющей команды.
Например, в следующей схеме состояние «Свет» будет контролироваться только один раз (через 2 секунды):

```
Will be executed only once
javascript.0.Light
TRUE
1000
FALSE
TRUE
javascript.0.Light
TRUE
2000
TRUE
TRUE
```
Но в этой схеме состояние «Свет» будет контролироваться дважды (через 1 секунду и через 2 секунды):

```
Will be executed twice
javascript.0.Light
TRUE
1000
FALSE
TRUE
javascript.0.Light
TRUE
2000
FALSE
FALSE
```
### Обновление состояния

Этот блок похож на [Управление состоянием](#control-state), единственным отличием является то, что он только обновляет значение. Никаких команд по управлению техническими средствами не отправляется.
Пример типового применения:

### Связывание состояний

Данный блок просто связывает два состояния друг с другом.
Вы можете достичь этого с помощью следующих блоков:

Вы можете выбрать, будет ли значение пересылаться, только тогда когда состояние источника было изменено или всегда, при обновлении состояния.
```
ne
javascript.0.Motion
javascript.0.Light
FALSE
value
```
### Запись состояния

Универсальный блок записи, может делать то же самое, что и ["Обновление состояния"](#update-state) и ["Управление состоянием"](#control-state) совместно.
Но в отличии от них вы можете определить Object ID и задать задержку с другими блоками, чтобы ваш скрипт стал более универсальным.
### Создание переменных

Существует два типа переменных, которые применяются в скриптах:
- локальные [переменные](#set-variables-value)
- глобальные переменные или состояния.
Глобальные переменные видны во всех скриптах, в отличии от локальных, которые видны только в текущем скрипте.
Глобальные переменные могут использоваться в vis, mobile и других логических или визуальных модулях, могут быть зарегистрированы в db или как-то еще.
Этот блок создает глобальную переменную, и если переменная уже существует, то команда будет проигнорирована. Вы можете спокойно вызывать этот блок при каждом запуске скрипта.
Пример типового применения:

```
Create state and subscribe on it changes
myState
ne
javascript.0.myState
log
test
Value of my state is
value
```
Вы можете начать использовать только что созданную переменную сначала в самом блоке.
Следующий код сообщит об ошибке при первом выполнении, так как подписка на «myState» не может найти объект:

При повторном выполнении никаких предупреждений не появится, так как переменная все же существует.
### Получение значения состояния

Используйте данный блок для получения значения состояния. Вдобавок к значению, у вас появится доступ к следующим аттрибутам:
- Значение
- Подтверждение - command = false или update = true
- Отметка времени в миллисекундах с 1970.1.1 (имеет тип «Date object»)
- Последнее изменение значения в миллисекундах с 1970.1.1 (имеет тип «Date object»)
- Качество
- Источник - имя экземпляра, который написал последнее значение, например, "system.adapter.javascript.0"
Пример вывода времени последнего изменения значения:

```
Print time of last change for myState
log
test
Last change of myState was at
hh:mm:ss
lc
javascript.0.myState
```
### Получение ID объекта

Данный блок вспомогательный, он существует чтобы удобнее было выбирать ID объекта для триггерного блока.
Нажав на значение ID объекта, откроется диалоговое окно выбора ID.
Типовое применение:

```
Typical usage of Object ID selector
ne
default
javascript.0.myState
log
Changed
```
## Исполнительные Блоки
### Exec - выполнение

Выполнение определенной команды в системе. По типу, когда кто-нибудь набирает такую команду при помощи консоли SSH.
Выполнение команды определяется разрешениями пользователя, под которым запускался iobroker.
Если не требуется никаких выводов, то их можно проигнорировать:

Если требуется анализ выходных данных:

```
Execute some system command
TRUE
ls /opt/
log
result
result
```
Анализируя выходные данные необходимо будет создать три специальные переменные:
- result, при успешном завершении результат выводится на консоль (например, для «ls/opt» он выглядит как «iobroker nodejs»)
- error object, в случае, когда команда не может быть выполнена javascript модулем.
- stderr, ошибка вывода выполняемой программы.
Кроме того, если уровень доступа к логу соответствует, то такая же команда будет отправлена в лог.
### request URL- запросить URL

Запрашивает URL и возвращает результат.
Пример:

Анализируя выходные данные будет создано 3 специальных переменных: result, результат содержит тело запрашиваемой страницы
- result, результат содержит тело запрашиваемой страницы
- error, описание ошибки
- response (только для профессионалов), ответ - специальный объект имеющий тип http.[http.IncomingMessage](https://nodejs.org/api/http.html#http_class_http_incomingmessage)
Если не требуется никаких выводов, то их можно проигнорировать. Путем отключения опции "с результатом".
## Отправить Блокам
### Отправить к telegram

Данный блок используется для отправки сообщений в клиент telegram посредством адаптера telegram.
Соответственно, адаптер telegram должен быть установлен и сконфигурирован.
При отправке сообщения какому-нибудь специализированному драйверу, вы должны выбрать установленный адаптер драйвера (обычно telegram.0), иначе сообщение будет отправлено всем существующим драйверам.
Свойства *сообщения* являются обязательными, и именно этот текст будет отправлен клиенту.
ID пользователя не является обязательным и этот ID из [telegram](https://core.telegram.org/bots/api#user) (Уникальный идентификатор пользователя или бота).
Кроме того, если уровень доступа к логу соответствует, то такая же команда будет отправлена в лог.
### Отправить к SayIt

Этот блок используется при отправке текста драйверу sayit для произношения этого текста.
Соответственно, адаптер sayit должен быть установлен и сконфигурирован.
При отправке сообщения какому-нибудь специализированному драйверу, вы должны выбрать установленный адаптер драйвера (обычно sayit.0), иначе сообщение будет отправлено всем существующим драйверам.
Свойства *сообщения* являются обязательными, и именно этот текст будет произнесен.
Вы должны проверить свойство language. Так как оно применяется для движка text2speech.
Громкость необязательна (обычно от 0 до 100).
Кроме того, если уровень доступа к логу соответствует, то такое же сообщение будет отправлено в лог.
### Отправить к pushover

Этот блок используется для отправки текста pushover клиенту. Про pushover драйвер вы можете прочесть [здесь](https://github.com/ioBroker/ioBroker.pushover).
Соответственно, адаптер pushover должен быть установлен и сконфигурирован.
При отправке сообщения какому-нибудь специализированному драйверу, вы должны выбрать установленный адаптер драйвера (обычно pushover.0), иначе сообщение будет отправлено всем существующим драйверам.
Свойства *сообщения* являются обязательными и именно этот текст будет отправлен клиенту.
Все остальные свойства необязательны, об этих свойствах вы можете прочесть [здесь](https://pushover.net/api):
- *ID устройства* - пользовательское имя вашего устройства для отправки сообщения прямо на это устройство, а не на все устройства пользователя (несколько устройств могут быть разделены запятой)
- *заголовок* - заголовок вашего сообщения, иначе используется название вашего приложения
- *URL* - дополнительный URL для отображения вашего сообщения
- *URL заголовок* - заголовок для вашего дополнительного URL-адреса, иначе просто указывается URL-адрес
- *приоритет* - -2 при отправке без уведомлений/предупреждений, -1 всегда отправлять как скрытое уведомление, 1 при отображении в качестве высокоприоритетного, обходя бесшумный режим пользователя, или 2 требовать подтверждения от пользователя
- *время в мс* - временная метка Unix даты и времени вашего сообщения для отображения пользователю, а не то время, когда ваше сообщение было получено нашим API
- *звук* - наименование одного из звуков, поддерживаемых устройством клиента, чтобы не использовать выбор звука по умолчанию.
Кроме того, если уровень доступа к логу соответствует, то такое же сообщение будет отправлено в лог.
### Отправить к email

Этот блок используется для отправки текста по электронной почте.
Соответственно, адаптер email должен быть установлен и сконфигурирован.
При отправке сообщения какому-нибудь специализированному драйверу, вы должны выбрать установленный адаптер драйвера (обычно email.0), иначе сообщение будет отправлено всем существующим драйверам.
Свойства *текста* являются обязательными и именно этот текст будет отправлен клиенту.
Несомненно, адресат (to) должен быть заполнен действительным адресом электронной почты.
Вы можете прикрепить файлы (обычно изображения) к электронной почте. Чтобы использовать изображения в тексте, вы должны изменить формат на HTML (установите флажок «Отправить как HTML»), и текст будет выглядеть так:
```
Embedded image 1: 
Embedded image 2: 
```
Вы можете ссылаться на файлы так ```
```. «File1» и «file2» являются зарезервированными идентификаторами и не могут быть изменены.
«Имя файла» должно содержать полный путь к изображению на диске.

```
FALSE
user@myemail.com
<p>Embedded image 1: <img src='cid:file1'/></p>
From Sweet Home
/opt/video/imageCam.png
```
Кроме того, если уровень доступа к логу соответствует, то такое же сообщение будет отправлено в лог.
### Пользовательское sendTo block

Данный блок вспомогательный для отправки внутреннего системного сообщения (sendTo) любому адаптеру.
Конечно, вы также можете использовать пользовательский функциональный блок, чтобы сделать что-нибудь беспредельное, и также отправлять сообщения.
Вы можете определить свои собственные параметры для команды sendTo:

Узнать больше можно [здесь](https://github.com/ioBroker/ioBroker.javascript#sendto) о "sendTo".
Пример отправки SQL-запроса к sql адаптеру:

```
Send query to SQL adapter
sql.0
query
TRUE
log
SELECT * FROM datapoints
log
test
result
JSON.stringify
cmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7
Describe this function...
```
Если у вас будет хоть один параметр с пустым именем, то тогда структура не будет создана, как здесь:
```
var obj, result;
/**
* Describe this function...
*/
function JSON_stringify(obj) {
return JSON.stringify(obj);
}
// Send query to SQL adapter
sendTo("sql.0", "query", 'SELECT * FROM datapoints', function (result) {
console.log((JSON_stringify(result)));
});
console.log("sql.0: " + "");
```
Или, как запросить историю из SQL-адаптера:

```
Get history from SQL adapter
end
object
sql.0
getHistory
TRUE
system.adapter.admin.0.memRss
{start: end - 3600000, end: end, aggregate: "minmax"}
log
test
result
JSON.stringify
cmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7
JSON.stringify object
```
Сгенерированный код javascript:
```
var obj, end, result;
/**
* JSON.stringify object
*/
function JSON_stringify(obj) {
return JSON.stringify(obj);
}
// Get history from SQL adapter
end = (new Date().getTime());
sendTo("sql.0", "getHistory", {
"id": 'system.adapter.admin.0.memRss',
"options": {start: end - 3600000, end: end, aggregate: "minmax"}
}, function (result) {
console.log((JSON_stringify(result)));
});
```
Если вы начнете значение с "{", это будет интерпретироваться как строка JSON. Используйте двойные кавычки в строке.
## Блоки даты и времени
### Сравнение времени

Если используется оператор «между» или «не между», блок выглядит так:

Вы можете указать время, которое необходимо сравнить. Блок предполагает, что время это «Date object».

Существуют следующие режимы сравнения:
- меньше чем, проверьте, действительно ли текущее время меньше указанного времени.
- равно или меньше
- больше чем
- равно или больше
- равно
- между, проверяется попало ли время в некоторый промежуток.
- например, если время должно быть между 12:00 и 20:00. Проверяется фактическое время больше или равно 12:00 и меньше, чем 20:00. 20:00 вернет false.
- или, например, для случая с 21:00 до 8:00. В данном случае будет проверено, фактическое время больше или равно 21:00 или меньше 8:00.
- не между, в случае если время не попадает в заданный промежуток дневного времени. Если время меньше начала и больше или равно концу (если время начала больше времени окончания, то оно проверяется на следующее условие - время больше или равно, чем конец и меньше, чем начало).
Действуют следующие форматы времени:
- YYYY-MM-DD hh:mm:ss
- YYYY-MM-DD hh:mm
- hh:mm:ss
- hh:mm
### Сравнение фактического времени

Этот блок используется для сравнения дневного времени с фактическим временем. Он имеет ту же логику, что и [Сравнение времени](#time-comparision), но ограничения не могут быть в виде блоков, и данный блок сравнивает только фактическое время. (для совместимости со старыми версиями)
### Получение фактического формата времени

Возвращает текущее время в определенном формате.
Поддерживаются следующие форматы:
- миллисекунды - возвращает только миллисекунды текущей секунды от 0 до 999 (не миллисекунды эпохи). Чтобы получить миллисекунды эпохи, используйте «Date object»;
- секунды - возвращает секунды текущей минуты от 0 до 59,
- секунд в дне - возвращает количество секунд от начала дня (от 0 до 24 * 3600 - 1),
- минуты - возвращает минуты текущего часа от 0 до 59,
- минут в дне - возвращает количество минут от начала дня (от 0 до 24 * 60 - 1),
- часы - возвращает часы текущего дня от 0 до 23,
- дней в месяце - получить день месяца от 1 до 31,
- месяц как число - получить месяц как число от 1 до 12,
- месяц как текст - получить месяц как текст. Язык должен быть указан.
- месяц как короткий текст - получить месяц как короткий текст: Янв, Фев, Мар, Апр, Май, Июнь, Июль, Авг, Сен, Окт, Ноя, Дек. Язык должен быть указан.
- короткий год - год от 0 до 99, например, в 2016 году результат будет 16.
- полный год - полный год: 2016
- день недели текстом - получить день недели в виде текста.
- день недели как короткий текст - получить день недели как короткий текст: Вс, Пн, Вт, Ср, Чт, Пт, Сб.
- день недели как число - день недели как число от 1 (понедельник) до 7 (воскресенье).
- пользовательский формат - вы можете указать свой собственный [формат](https://github.com/ioBroker/ioBroker.javascript#formatdate).
- Date object - возвращает дату и время как количество миллисекунд с начала эпохи (1970.1.1 00: 00: 00.000Z GMT). Это всегда GMT.
- yyyy.mm.dd - 2016.09.14
- yyyy/mm/dd - 2016/09/14
- yy.mm.dd - 16.09.14
- yy/mm/dd - 16/09/14
- dd.mm.yyyy - 14.09.2016
- dd/mm/yyyy - 14/09/2016
- dd.mm.yy - 14.09.16
- dd/mm/yy - 14/09/16
- mm/dd/yyyy - 09/14/2016
- mm/dd/yy - 09/14/16
- dd.mm. - 14.09.
- dd/mm - 14/09
- mm.dd - 09.14
- mm/dd - 09/14
- hh:mm - 12:00
- hh:mm:ss - 12:00:00
- hh:mm:ss.sss - 12:00:00.000
### Получение времени астрономических событий на сегодня

Возвращает время текущего дня в виде определенного астрономического события.
Атрибут «offset» это смещение в минутах. Оно может быть и отрицательным, при определении времени до астрономического события.
Следующие значения могут использоваться в качестве атрибута астро-функции:
- sunrise: восход (верхний край солнца появляется на горизонте)
- sunriseEnd: восход солнца заканчивается (нижний край солнца касается горизонта)
- goldenHourEnd: конец «золотого часа» (мягкий свет, наиболее подходящее время для фотографии)
- solarNoon: солнечный полдень (солнце находится в наивысшей точке)
- goldenHour: начало «золотого часа»
- sunsetStart: начало заката (нижний край солнца касается горизонта)
- sunset: закат (солнце полностью заходит за горизонт, начинаются вечерние гражданские сумерки)
- dusk: начало вечерних навигационных сумерек (время, когда уже достаточно темно, но всё еще можно ориентироваться по горизонту в море)
- nauticalDusk: начало вечерних астрономических сумерек (визуально темно, но недостаточно для астрономических наблюдений)
- night: начало ночи (достаточно темно для большинства астрономических наблюдений)
- nightEnd: конец ночи (и начало утренних астрономических сумерек)
- nauticalDawn: начало утренних навигационных сумерек
- dawn: утренняя заря (начало утренних гражданских сумерек)
- nadir: надир (самый темный момент ночи, солнце находится в самом низком положении)
Возвращаемое значение имеет тип «Date Object», то есть число миллисекунд от 1970.01.01.
**Примечание:** для использования «астро-функции» в настройках адаптера javascript должны быть определены «широта» и «долгота».
## Преобразование блоков
Иногда требуется преобразовать значение в другой тип. Следующие блоки позволяют преобразовывать значение в определенные типы.
### Преобразование к числовому формату

Преобразование к числовому формату (с плавающей запятой).
### Преобразование к формату Boolean

Преобразование к формату Boolean (правда или ложь).
### Преобразование в строку

Преобразует значение в строку.
### Получение типа переменной

Получить тип значения. Тип может быть: boolean, number, string, object.
### Преобразование в date/time object

Преобразовать значение в "Date object". Прочтите [здесь](#get-actual-time-im-specific-format), что такое "Date object".
### Преобразование date/time object к string

Преобразовать «Date object» в строку. Данное преобразование имеет те же параметры форматирования, что и [Получить фактический формат времени](#get-actual-time-im-specific-format).
### Преобразование JSON к object

Преобразует строку JSON в объект javascript. Если произойдет ошибка, будет возвращен пустой объект. (только для профессионалов)
### Преобразование object к JSON

Преобразуйте объект Javascript в строку JSON. Если выбран параметр prettify, результирующая строка выглядит так:
```
{
"a": 1,
"b": 2
}
```
если нет:
```
{"a": 1, "b": 2}
```
### Преобразование c JSONata выражением

Конвертировать объект Javascript по выражению JSONata. Вы можете прочитать больше об этом здесь: [https://jsonata.org/](https://jsonata.org/)
Пример полезной нагрузки:
```
{"example": [{"value": 4},{"value": 7},{"value": 13}]}
```
Результат:
```
[{"value": 4},{"value": 7},{"value": 13}]
24
4
13
```
## Триггер
### Триггер по состояниям

Данный блок выполняет некоторое действие, если состояние заданных объектов изменено или обновлено. Это основной блок для построения взаимодействия между различными состояниями и, соответственно, системами.
При помощи этого блока вы можете собрать различные состояния и отправить сообщение или email по изменению значения.
Типовое использование блока:

```
Switch light on if motion detected
ne
javascript.0.Motion
javascript.0.Light
FALSE
TRUE
```
Вы можете определить столько идентификаторов ObjectID, сколько хотите, через диалоговое окно расширения:

Если используется только один ID объекта, то тогда будут доступны следующие специальные переменные в заявленном блоке:
- value - фактическое значение состояния
- oldValue - устаревшее значение состояния

```
ne
javascript.0.Motion
log
test
Actual value is
value
Old value was
oldValue
```
В противном случае, если для триггера используется более одного ID объекта, вы можете получить доступ к значению и устаревшему значению через [Информация триггера](#trigger-info).
### Триггер по изменению состояния

Это такой же блок, что и «Триггер по состояниям», но без возможности использования нескольких ID объектов при срабатывании (для совместимости версий).
### Информация триггера

Получение информации о значении, метке времени или ID состояния, которое вызвало срабатывание триггера.
Данный блок может использоваться только внутри блоков ["Триггер по состояниям"](#trigger-on-states-change) или ["Триггер по изменению состояния"](#trigger-on-state-change).
Доступна следующая информация:
- object ID - ID состояния, которое запускает триггер
- name - наименование состояния из common.name
- description - описание состояния из common.desc
- channel ID - ID канала, которому принадлежит состояние. Если канал отсутствует, то он будет нулевым.
- channel name - имя канала, которому принадлежит состояние. Если канал отсутствует, то он будет нулевым.
- device ID - ID устройства, которому принадлежит состояние. Если канал отсутствует, то он будет нулевым.
- device name - имя устройства, которому принадлежит состояние. Если канал отсутствует, то он будет нулевым.
- state value - фактическое значение состояния сработки
- state timestamp - фактическая временная метка в виде Date object
- state quality - фактическое качество кода значения
- origin of value - имя объекта, вызывающего изменение
- is command or update - это команда (ack = false) или update (ack = true)
- last change of state - время последнего изменения значения
- previous value - предыдущее значение состояния до срабатывания триггера
- previous timestamp - предыдущая временная метка этого состояния до срабатывания триггера
- previous quality - предыдущее качество этого состояния до срабатывания триггера
- previous origin - предыдущее возникновение этого состояния, до того, как триггер сработал
- previous command or update - предыдущий тип этого значения, до срабатывания триггера
- previous last change - предыдущее «последнее измененное значение» этого состояния до срабатывания триггера
Типовое использование:

```
ne
javascript.0.Motion
log
test
Actual value is
state.val
Old value was
oldState.val
```
### Расписание

Это второй основной блок для автоматизации после ["Триггер по состояниям"](#trigger-on-states-change). Этот блок позволяет выполнять некоторые действия периодически.
Описание правила построения расписания будет выполнено в хорошо документированном CRON [формате](https://en.wikipedia.org/wiki/Cron).В расширении можно определить и секунды.
Если необходимо использовать секунды, то они должны быть определены как самый первый параметр правила CRON, и правило будет состоять из 6 частей.
В общем CRON правило состоит из 5 или 6 частей:
- правила по секундам (необязательно)
- правила по минутам
- правила по часам
- правила по дням месяца
- правила по месяцам
- правила по дням недели.
Для каждой части разрешены следующие форматы:
- \* - сработка каждую (секунду, минуту, час, ...)
- X (например, 5) - сработка только в эту секунду, минуту, час ...
- from-to (например, 1-9) - сработка только в этом интервале
- \*/X (например, * / 5) - срабатывать каждые X секунд, минут ... В случае "\*/5" в течение нескольких часов триггер будет срабатывать в 0, 5, 10, 15 и в 20 часов.
- числа и интервалы могут быть объединены запятой (например, 1,3,4-6). Не делайте пробелов между числами, потому что пространство является разделителем для частей правила.
\*/10 \* \* \* 6,7 - срабатывать каждые 10 минут в субботу и воскресенье.
\*/30 \* \* \* \* \* - срабатывать каждые 30 секунд.
```
┌───────────── мин (0 - 59)
│ ┌────────────── час (0 - 23)
│ │ ┌─────────────── день месяца (1 - 31)
│ │ │ ┌──────────────── месяц (1 - 12)
│ │ │ │ ┌───────────────── день недели (0 - 6) (0 to 6 от Воскресенья до Субботы; 7 также Воскресенье)
│ │ │ │ │
│ │ │ │ │
│ │ │ │ │
* * * * * расписание
```
или при использовании секунд:
```
┌───────────── секунды (0 - 59)
│ ┌───────────── мин (0 - 59)
│ │ ┌────────────── час (0 - 23)
│ │ │ ┌─────────────── день месяца (1 - 31)
│ │ │ │ ┌──────────────── месяц (1 - 12)
│ │ │ │ │ ┌───────────────── день недели (0 - 6) (0 to 6 от Воскресенья до Субботы; 7 также Воскресенье)
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │
* * * * * * расписание
```
Но вы также можете построить и свои такие же правила. Нажав на правило, откроется диалог CRON, и вы можете указать мышью свое правило.

### Триггер по астрономическому событию

Выполнение некоторых действий по астрологическому событию. Возможны следующие события:
- sunrise: восход (верхний край солнца появляется на горизонте)
- sunriseEnd: восход солнца заканчивается (нижний край солнца касается горизонта)
- goldenHourEnd: конец «золотого часа» (мягкий свет, наиболее подходящее время для фотографии)
- solarNoon: солнечный полдень (солнце находится в наивысшей точке)
- goldenHour: начало «золотого часа»
- sunsetStart: начало заката (нижний край солнца касается горизонта)
- sunset: закат (солнце полностью заходит за горизонт, начинаются вечерние гражданские сумерки)
- dusk: начало вечерних навигационных сумерек (время, когда уже достаточно темно, но всё еще можно ориентироваться по горизонту в море)
- nauticalDusk: начало вечерних астрономических сумерек (визуально темно, но недостаточно для астрономических наблюдений)
- night: начало ночи (достаточно темно для большинства астрономических наблюдений)
- nightEnd: конец ночи (и начало утренних астрономических сумерек)
- nauticalDawn: начало утренних навигационных сумерек
- dawn: утренняя заря (начало утренних гражданских сумерек)
- nadir: надир (самый темный момент ночи, солнце находится в самом низком положении)
**Примечание:** для использования «астро-функции» в настройках адаптера javascript должны быть определены «широта» и «долгота».
Кроме того, вы можете установить смещение в минутах до астрологического события, например, сработка триггера за 1 час до рассвета:

Как вы видите, смещение может быть и отрицательным, при указании времени перед астрологическими событиями.
### Именованное расписание

Данный блок похож на блок [Расписание](#schedule), но помимо этого у него есть возможность установки правила CRON по строке, а также возможность остановить расписание.
Вы можете присвоить уникальное имя этому блоку расписания, а затем позже очистить его с помощью [Очистка расписания](#clear-schedule).
Вот пример настраиваемого будильника:

```
Configurable alarm. Set time as: hh:mm
alarmTime
ne
javascript.0.alarmTime
alarm
alarm
* * * * *
state.val
log
Wake up!
time to CRON
dmFyIHBhcnRzID0gdGltZS5zcGxpdCgnOicpOwovLyBpZiBpdCBpcyBDUk9OCmlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHJldHVybiB0aW1lOwpyZXR1cm4gcGFydHNbMV0gKyAnICcgKyBwYXJ0c1swXSArICcgKiAqIConOw==
Describe this function...
```
### Очистка расписания

С помощью этого функционального блока вы можете очистить Именованное расписание. Если вы измените имя еще один раз, не очищая его, то тогда останется старое имя.
Пример использования в [Именованное расписание](#named-schedule)
### CRON диалог

Создать правило CRON из диалога. Этот блок может быть соединен с [Именованное расписание](#named-schedule).

```
Every 0th minute every hour
schedule
* * * * *
0 * * * *
log
It is exactly
It is exactly
h
o'clock
```
### CRON правило

Составляет правило CRON из разных частей.
Вы можете отобразить правило, как блок или как строку:

Вы также можете указать секунды для правила CRON при помощи дополнительного параметра «с секундами»

Этот блок может использоваться (как и [CRON диалог](#cron-dialog)) только с [Именованное расписание](#named-schedule).
### Событие при обновлении файла

Вы можете подписаться на обновления файлов и выполнить какое-либо действие. Например, здесь содержимое vis будет распечатываться при каждом обновлении проекта:
```
data
TRUE
vis.0
main/*
log
test
data
```
**Важно**: эта функция доступна только с js-controller@4.1.x или новее.
### Отменить событие при обновлении файла

С помощью этого блока вы можете отписаться от событий при обновлении файла.
**Важно**: эта функция доступна только с js-controller@4.1.x или новее.
## Таймауты
### Задержка выполнения

При помощи этого блока вы можете выполнять другие блоки, отложенные на некоторое время, указанное в миллисекундах. Если вы знаете Javascript, то это такая же функция, как setTimeout.
В блочном режиме нет «паузы», но вы можете использовать этот блок для имитации паузы. Если вы разместите все блоки, которые должны быть выполнены после паузы, то вы получите тот же эффект, что и при паузе.
У каждого отложенного выполнения может быть свое уникальное имя. Оно может быть отменено другим блоком. [Очистить отложенное выполнение](#clear-delayed-execution)

```
log
Make a pause 5 seconds
timeout
5000
log
After pause
```
### Очистить отложенное выполнение

Данный блок используется для отмены задержки запуска по имени. Типовое использование - имитация сценария обнаружения движения. По первому движению свет должен загореться, а после последнего движения, через 30 секунд, свет должен погаснуть.

```
ne
node-red.0.javascript.0.Motion
EQ
value
TRUE
log
Motion detected
Switch light ON
javascript.0.Light
FALSE
TRUE
Stop timer, even if it not running
lightOff
lightOff
5000
log
Light OFF
javascript.0.Light
FALSE
FALSE
```
### Выполнение по интервалу

Данный блок позволяет вам периодически выполнять какое-либо действие. Конечно, есть блок CRON, но у CRON блока наименьший интервал равен одной секунде.
Этот блок может выполнять действия в миллисекундных периодах.
Если вы установите интервал меньше (менее 100 мс) чем он может быть, то эти интервалы будут больше.
Аналогично блоку таймаута, вы также можете присвоить уникальное имя интервалу.
### Остановить выполнение по интервалу

При помощи этого блока вы можете отменить периодическое выполнение блока интервалов по их именам.
## Логические
### Блок If else
### Блок сравнения
### Логический блок AND/OR
### Блок отрицания
### Логическое значение TRUE/FALSE
### Нулевой блок
### Тестовый блок
## Циклы
### Повторить N раз
### Повторять пока
### Счетчик
### Для каждого
### Выйти из цикла
## Математические
### Числовое значение
### Арифметические операции +-\*/^
### Корень квадратный, Abs, -, ln, log10, e^, 10^
### sin, cos, tan, asin, acos, atan
### Математические постоянные: pi, e, phi, sqrt(2), sqrt(1/2), infinity
### Четное, нечетное, простое, целое, положительное, отрицательное, делимое на
### Изменение переменной со знаком плюс или минус
### Округленное, приближенное, действительное значение
### Операции со списком значений: сумма, минимум, максимум, среднее, медиана, мода, отклонения, случайное значение
### Модуль
### Установить предел для значения по минимуму и максимуму
### Случайное значение от 0 до 1
### Случайное значение между минимальным или максимальным
## Текст
### Строковое значение
### Объединение строк
### Добавить строку в переменную
### Длина строки
### Строка пустая
### Найти позицию в строке
### Получить символ в строке по определенной позиции
### Получить подстроку
### Преобразование в верхний или в нижний регистр
### Строка обрезки
## Списки
### Создать пустой список
### Создать список значений
### Создать список с тем же значением N раз
### Получить длину списка
### Список пуст
### Найти позицию элемента в списке
### Получить элемент в списке
### Указать элемент в списке
### Получить подсписок
### Преобразование текста в список и наоборот
## Цвет
### Цветовое значение
### Произвольный цвет
### RGB палитра
### Смешанные цвета
## Переменные
### Установить значение переменной

Чтобы понять, как использовать этот блок, вы должны знать основные правила программирования, в частности, как использовать переменные.
С помощью этого блока вы можете записать в глобальную переменную (видимую отовсюду в этом скрипте) и использовать ее для хранения некоторых значений. Если переменная не существует, она будет объявлена автоматически.
Этот блок может создать новую переменную или использовать существующую.

Вот этот код:

```
item
0
```
делает только это:
```
var item;
item = 0;
```
### Получить значение переменной

Этот блок получает значение переменной. Вы можете создать новый или использовать уже существующий.

Существует одно исключение с триггерными блоками: [Триггер по состояниям](#trigger-on-states-change) и [Триггер по изменению состояния](#trigger-on-state-change).
Внутри этих блоков переменная «значение» уже существует, но в любом случае для чтения этих значений вам необходимо переименовать переменную в значение и затем использовать ее.

## Функции
### Создать функцию из блоков без возвращения значения

С помощью этого блока вы можете комбинировать некоторые повторяющиеся последовательности в функции, а затем использовать эту функцию повсюду в текущем блочном режиме.
Ниже приведен пример функции, которая просто печатает текущее время в лог.

```
Print current time
printTime
Describe this function...
log
test
hh:mm:ss.sss
```
После создания функции вы можете использовать эту функцию следующим образом:

```
interval
1000
```
Вы сможете найти эту новую функцию в меню блоков:

Помимо этого, через диалог конфигурации вы можете указать аргументы для функции. Вам доступно редактирование имен аргументов в одном и том же диалоговом окне.

Пример функции, которая выводит сумму первого и второго аргумента:

```
Print sum of a and b
printSum
Describe this function...
log
test
ADD
1
a
1
b
```
В меню переменных, вы можете найти аргументы:

И использовать эту функцию следующим образом:

```
5
6
```
### Создать функцию из блоков с возвращением значения

Данный блок похож на предыдущий, но он еще и возвращает результат функции, который в дальнейшем можно использовать в блоках.

```
do something
Return sum of a and b
ADD
1
a
1
b
```
Применение схоже с другими функциональными блоками:

```
log
test
5
6
sum
Return sum of a and b
ADD
1
a
1
b
```
Для всех функций вы можете добавить комментарий или описание.

В блоке возврата вы можете использовать специальный элемент возврата:


```
log
test
5
log
test
wd
numberToDay
Return sum of a and b
EQ
day
0
Sunday
EQ
day
1
Monday
EQ
day
2
Tuesday
EQ
day
3
Wednesday
EQ
day
4
Thursday
EQ
day
5
Friday
EQ
day
6
Saturday
EQ
day
7
Sunday
Invalid day
```
### Вернуть значение в функцию

Просмотреть использование данного блока можно в [Создать функцию из блоков с возвращением значения](#create-function-from-blocks-with-return-value]).
Данный блок может использоваться только там и необходим для возврата значения в середину функции.
### Создать пользовательскую функцию без возвращения значения

Иногда существующие блоки не подходят для решения конкретной проблемы. С помощью этого блока вы можете создать свой собственный блок как функцию, которая может принимать параметры и выполнять некоторые действия. Чтобы написать такую функцию, вы должны знать javascript. Вы можете использовать внутри все функции, написанные скриптами.
Чтобы написать код, вы должны щелкнуть '...' в конце блока, и откроется диалоговое окно редактора.

В противном случае, использование этого блока аналогично использованию стандартных функциональных блоков, таких как [Создать функцию из блоков с возвращением значения](#create-function-from-blocks-with-return-value]) или [Создать функцию из блоков без возвращения значения](#create-function-from-blocks-with-no-return-value]).
### Создать пользовательскую функцию с возвращением значения

Данный пользовательский функциональный блок возвращает значения. Для того, чтобы вернуть результат из функции напишите:
```
return 'your result';
```
Как здесь:

```
sum
cmV0dXJuIGEgKyBiOw==
Summarise a and b
log
test
5
6
```
### Вызов функции


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