Опция простого скриптового языка для создания своей логики и математики: управление GPIO, вывод на дисплеи по условиям, отправка http get запросов с параметрами. Редактор скриптов находится непосредственно на самом модуле в веб интерфейсе. Вызов скрипта происходит по указанному интервалу в настройках.
Документация ниже относится к версии Interpreter (v2.2).
Обновление 24.02.2023 - Версия v2.2. Установка системных переменных intvalX через знак равно. Поддержка таймеров, запись переменных во flash и eeprom.
25.02.2023 - добавлена поддержка gpio event.
Внешний вид веб интерфейса редактора скриптов:
17.04.2017 - исправлена работа оператора goto.
01.05.2017 - обновлен список переменных датчиков.
17.11.2018 - доступна 2 версия интерпретатора.
14.08.2020 - упразднена документация по первой версии интерпретатора.
06.02.2021 - глобальное обновление имен переменных. Актуальный список переменных на модуле на вкладке Metrics.
28.08.2021 - добавлена поддержка расширенной работы с математикой и поддержка дробных чисел (только RTOS). Документация ниже.
31.01.2022 - обновление версии Interpreterа до 2.1. Глобальные переменные сейчас везде начинаются с нумерации от 1.
04.03.2022 - переменные состояния gpio и pwm сейчас называются как gpioX и pwmX , где Х - номер gpio или pwm.
24.02.2023 - обновление версии Interpreterа до 2.2. Установка системных переменных intvalX через знак равно. Поддержка таймеров, запись переменных во flash и eeprom.
25.02.2023 - добавлена поддержка gpio event.
gpioset(x,y*) - установка gpio. Пример gpioset(5,1). Не рекомендуется использовать vgpio и d2d номера при частом интервале выполнения скрипта
pwmset(x,y**) - установка уровня ШИМ, где x - номер ШИМ, y - значение ШИМ. Пример pwmset(1,200).
thermoset(x,y**) - управление термостатом, где x - номер термостата, у - установка термостата. Пример в документации термостата.
if (условие*) - условный оператор. Поддерживается сравнение == , != , < , > , >= , <=. Более подробное описание ниже:
endif - обязательный оператор окончания действия оператора if.
end - выход из скрипта.
else - после этого оператора выполняется код если условие if не выполнилось. Обязательное использование совместно с if.
delay(x) - остановка скрипта на указанное количество миллисекунд. На работу модуля не влияет. На время остановки запуск по интервалу не происходит.
beep(x,y) - генерация частоты через опцию beeper, где x - время, y - частота. Подробнее в описание в опции.
goto XXX переход к строке по ссылке XXX. Ссылка ставится в любом месте кода в виде :XXX , без использования delay количество переходов ограничено.
reboot() - перезапуск модуля.
speakline(строка) - воспроизведение MP3 из конструктора фраз. Возможно указать как номер шаблона в виде #1 так и сам шаблон.
mp3cmd(команда,параметр) - управление MP3 UART плеером , все команды в документации на плеер.
valset(x,y*) - установка значения y глобальной переменной x, номер переменой x считается от 1. Устаревшая функция, используйте приравнивание (Пример 16).
valmath(X,Y+Z) - математическое действие, описание ниже. Устаревшая функция, используйте приравнивание (Пример 16).
playwav(путь_до_файла) - проигрывание mp3/wav файла(ESP32).
imageprint(путь_до_файла) - вывод картинки на TFT дисплей(ESP32).
debug(х) - включает или отключает отладку в UART, только для ESP32 и ESP8266RTOS. x - 1 или 0.
httpget(url) - отправить по http строку данных. url - адрес/путь. Подробное описание ниже.
load(имя_файла) - выполняет файл скрипта с диска SD&SPIFFS (ESP32 и ESP8266RTOS), а так же в Linux приложении. Подробное описание ниже.
rgbsend(hex строка) - управление WS2812. Подробности в документации.
rgb16send(hex строка) -управление WS2812. Подробности в документации.
mqttsend(топик,значение) - отправка данных в mqtt. Значение может содержать шаблоны и метрики.
stepper(х,у*) - управление степпером.
irsendraw(hex данные) - отправка raw ИК команд.
irsend(режим,команда) - отправка ИК команды.
sleep(x) - отправка модуля в спящий режим на время х (секунды). Требуется установка опции спящего режима.
Строки, начинающиеся с // считаются комментариями, удобно временно отключать строку скрипта.
* - можно указывать переменные.
** - поддерживается математическое выражение. Должна быть самая актуальная прошивка.
В дополнительных настройках(в шестеренке) доступно изменение максимального размера скрипта, По умолчанию размер установлен в 500 байт(+1 байт окончание строки), максимальный размер определен максимальным значением числа на вкладке debug в строке Len mem config , для ESP8266 конструктора это значение ограничено 4096 байт, для ESP8266 RTOS и ESP32 - 8192. Максимальный размер скрипта так же ограничен возможностями веб сервера.
Обратите внимание, что у уже настроенного модуля изменение параметра размера , если опция NVS2 не включена, повлечет повреждение некоторых настроек у опций!!!
if(условие*) - условный оператор,. Поддерживается сравнение == , != , < , > , >= , <=. Пробелы не допускаются
Условие может содержать несколько сравнений, через оператор ИЛИ , например if(second==0||second==30) - включить или на 0 или на 30 секунде.
И через оператор И, например if(second>=10&&second<=30) -включить, когда секунды больше либо равно 10 и меньше либо равно 30 т.е. включаем когда секунды в диапазоне от 10 до 30.
else - необязательный оператор. После этого оператора выполняется код если условие if не выполнилось.
endif - этим оператором должно заканчиваться секция действий оператора if.
Вариант с else:if(условие) функции, когда условие выполняется else функции, когда условие не выполняется endifВариант без else:
if(условие) функции, когда условие выполнено endif
Поддерживается вложенность операторов до 255 уровней! После endif выполнение скрипта продолжается.
goto внутри if использовать крайне не рекомендуется, допустимо, если это бесконечный цикл с условием, где идет выход из скрипта по оператору end
На модулях ESP32 и ESP8266(RTOS) возможна работа скриптами, находящиеся на дисках SD или SPIFFS. Поддерживается работа с диска и в Linux приложении.
Количество строк в файле не ограничено. Длина строки ограничена 1 кб.
Загрузить скрипт можно командой load(имя файла) только из окна-редактора. Сами скрипты загружать другие файлы не умеют на данный момент. Пример: load(/SPIFFS/loopnext.txt)
После выполнения файла скрипта управление передается обратно скрипту в окне-редакторе, если не задан параметр end.
Доступна отправка метрик на любой сервер используя функцию httpget(url), где url - это полноценный адрес ,можно отправить на любой сервер или на другой модуль esp без авторизации. Поддерживается установка порта через двоеточие. Пробелы и спецсимволы в запросе недопустимы. Поддерживаются текстовые метрики (вида _ХХХ_).
Примеры:
Отправка данных на Thingspeak.com: httpget(api.thingspeak.com/update?key=<ключ>&field1=_BMPT_&field2=_BMPP_&field3=_DHTT1_&field4=_DHTH1_)
Отправка данных на Domoticz: httpget(192.168.1.100:8080/json.htm?param=udevice&type=command&idx=55&nvalue=0&svalue=_BMPT_)
Можно отправлять несколько запросов подряд , в ESP8266 NoOS рекомендуется использовать delay(500) между несколькими запросами.
printw(текст) - вывод текста на главной модуля. Поддерживаются html теги.
printd(номер строки,текст) - вывод на дисплей модуля LCD.
printd(номер строки,номер шрифта,текст) - вывод на дисплей модуля OLED и TFT, добавлен обязательный параметр размер шрифта.
printm(скорость строки, текст) - вывод на LED матрицы.
printn(id,текст) - вывод на Nextion дисплей. Пример: printn(d0,_TIMES_).
printnraw(raw дата) вывод raw данных на Nextion дисплей.
printuart(текст) - вывод строки в uart используя опцию UART bridge.
printmx(x,y,z*) - функция вывода на 7 Сегм MAX7219. x - знакоместо, y - тип вывода(0..3). z - значение.
segsetbr(x) - Управление яркостью 7 Сегм MAX7219.
printmt(z*) - функция вывода на TM1637.
tmsetbr(x) - Управление яркостью TM1637.
printei(z,x,y,текст) - Вывод текста на E-Ink LILYGO T5 V3. Подробнее в документации на дисплей.
В текстовых дисплеях в функциях printw, printd, printm и прочие вместо текста можно указывать номер шаблона в виде #1 конструктора строк или сразу текстовые метрики в виде printw(_DATE_ _TIME_).
В числовых дисплеях (обозначенных звездочкой) используются числовые переменные.
matrixbr(уровень яркости) - установка яркости у LED матриц. 100 - выключает матрицу.
Список текстовых метрик и числовых переменных находится внизу статьи !
sendsms(текст сообщения) - отправка уведомлений через Telegram, ICQ, Email, SMS GSM, SMS.RU, SMSC.RU - все включенные сервисы отправки, можно использовать текстовые шаблоны, если они установлены в прошивке, пример sendsms(#1) или текстовые метрики в виде sendsms(_DATE_ _TIME_)
resetsms() - сброс флага отправки, применяется в противоположном действии условия для защиты от циклической отправки. Смотрите пример 6 в конце статьи.
gpioX - чтение состояния GPIO. До 4.03.22 - gpioget(х)
pwmX - чтение состояния PWM. До 4.03.22 - pwm[x]
Переменные времени: second, minute, hour, mday, month, week, minutesperday (минут в день ), secondsperday (секунд в день).
Список остальных переменных смотрите на вкладке Metrics модуля (для старых прошивок - внизу статьи)
Переменные с датчиков температуры и влажности идут умноженные на 10 или 100 ! Если температуру кажет к примеру 26.4, то сравнивать её нужно как число 264. Не относиться при включенной опции расширенной математики.
В скриптах возможно использовать специализированные глобальные переменные, которые доступны и на чтение и на запись, в эту же переменную производится запись при работе с математикой. Количество глобальных переменных задается в шестеренке , тип переменных int32.
Для работы с математикой используется функция valmath(X,Y+Z) , где X - это номер переменной начиная с 1, Y+Z - это математическое действие. Ограничение: без опции расширенной математики поддерживается только одиночное действие прибавления, вычитания, деления или умножения. Так же поддерживается остаток от деления (%) .*
Для установки переменной используем функцию valset(x,y). считая от 1.*
* - функции устарели.
Для чтения переменной используем intvalX считая от 1.
Для вывода переменных используем макрос _INTVALx_ считая от 1
Тестовые примеры смотрим внизу статьи под номерами 7 и 8.
Обновление от 24.02.23:
Сейчас установка переменной intvalX может задаваться через знак равно, например intval1=5 или intval1=5+dsw1 . Этим упраздняется использование функций valset(x,y) и valmath(X,Y+Z).
Доступно сохранение в переменную intvalfX и intvaleepX - соответственно сохранение во flash и eeprom(опция должна быть включена). Переменные работают только с целыми числами. Установка и чтение переменных аналогично intvalX. Количество переменных задается в шестеренке опции, по умолчанию равно 0(выключено). Сохранение происходит только если значение переменной изменилось.
Тестовые примеры смотрим внизу статьи под номером 16.
Опция доступна только на RTOS прошивках, включая ESP32 и на Linux ! По умолчанию не включена - включается в шестеренке опции !
Опция позволяет использовать сложную и вложенную математику и поддержкой дробных чисел в условии IF. Допустимо писать любые выражения и их комбинации, включая скобки для установки приоритета решения.
Так же дополнительно поддерживаются следующие переменные и функции:
pi - число Пи
e - число E.
x^y - возведение в степень y числа x
map(x,ind,inu,outd,outp) - классическая функция map, пример: map(adc,0,4095,0,3.3) - приведение значения ацп к 3.3в
ceil(x) - округляет x в большую сторону. Пример: valmath(0,ceil(dsw1))
floor(x) - округляют аргумент x до наибольшего целого числа.
abs(x) - модуль числа х
sqrt(x) - квадратный корень числа x
exp(x) - значение экспоненты от x
Триготрометрия:
sin(x) - синус числа х
cos(x) - косинус числа х
tan(x) - тангенс угла x
sinh(x) - гиперболический синус числа х
cosh(x) - гиперболический косинус числа х
tanh(x) - гиперболический тангенс числа x
atan(x) - арктангенс числа x
asin(x) - арксинус числа x
acos(x) - арккосинус числа x
ln(x) - натуральный логарифм от x
log10(x) -десятичный логарифм от x
Глобальные переменные при включенной данной опции работают с дробными числами(до 3 знаков), выводят их везде в данном виде.
Для использования таймеров требуется их включить в шестеренке опции - установить их количество. По умолчанию 0 (выключено). Не стоит ставить большое количество, если их много не требуется - этим вы забираете ресурсы устройства.
Доступные функции:
timer(x,y) - многократный запуск таймера номер x , на время y (секунды).
timerone(x,y) - однократный запуск таймера номер x , на время y (секунды).
timerstop(x) - остановка таймера х.
Если вы хотите перезапустить таймер, то перед вызовом timer() и timerone() требуется остановить этот таймер через timerstop(). Пока таймер запущен, то повторный вызов игнорируется !
Событие вызова таймера происходит через условие if внутри которого указывается событие таймера timereventX , где Х - номер таймера. Условие должно быть в общем цикле скрипта, для точности в 1 секунду требуется устанавливать интервал запуска скрипта так же 1 секунда. Условие события таймера сработает, если время отчета таймера уже вышло.
Примеры использования таймера внизу статьи под номерами 14, 15, 18.
Для использования gpio event требуется их включить в шестеренке опции - установить их количество. По умолчанию 0 (выключено).
Опция позволяет запускать действие только после изменения состояния gpio, а не постоянно как в случае обычном сравнении gpio в условии if.
Доступные функции:
gpioint(x,y,z) - запуск контроля события номер x на gpio y с режимом z, где z может принимать значения any - любое изменение, neg - событие на отрицательное состояние, pos - событие на положительное состояние, none - выключить контроль.
Событие вызова изменения состояния gpio происходит через условие if внутри которого указывается событие gpio gpioeventX . где X - номер события. Условие должно быть в общем цикле и для быстрой реакции требуется установка минимального интервала в 1 секунду или зацикливание через goto.
Примеры использования gpio event внизу статьи под номерами 17, 18, 19.
Лишние пробелы и другие знаки недопустимы. Каждый оператор должен быть в отдельной строке.
Если скрипт уже выполняется, то кнопка Test не работает.
1 - ошибка синтаксиса, например не хватает скобки
2 - ошибка синтаксиса
3 - превышен лимит переходов.
4 - не найдена переменная в условии
5 - ожидаем условие == , != , < , > , >= , <=
6 - не найдена функция (ошибка в названии или не установлена соответствующая опция)
7 - не найдена точка перехода у оператора goto
8 - слишком малое значение delay
9 - ошибка номера шаблона в конструкторе строк в операторах вывода
10 - ошибка в математической функции
11 - нет переменной с указанным номером
12 - попытка деления на ноль
21 - использование операторов else или endif без if
22- невозможно загрузить файл скрипта с диска
23- превышено количество вложений if
24- нумерация переменной изменена, сейчас она считается от 1.
При включенной опции расширенной математики и поддержки дробных чисел в примерах ниже нужно корректировать значения сравнения в условиях.
Описание: простейший термостат с управлением по gpio 14 и индикацией режимов
if(gpio14==0) printw(выключено) else if(dsw1<300) gpioset(16,1) printw(холодно) else gpioset(16,0) printw(горячо) endif endif
Описание: простейшая мигалка GPIO с выводом состояния на главную страницу
:testm printw(Тик) gpioset(16,1) delay(1000) printw(Так) gpioset(16,0) delay(1000) goto testm
Описание: мигалка GPIO посложнее с выводом состояния на главную страницу и выключением через GPIO14
:testm if(gpio14==0) printw(выключено) gpioset(16,0) delay(1000) else printw(Тик) gpioset(16,1) delay(1000) printw(Так) gpioset(16,0) delay(1000) endif goto testm
Описание: вывод поочередно из конструктора строк данных на LCD дисплей. Аналогично можно использовать и для LED матриц.
printd(1,#1) delay(2000) printd(1,#2) delay(2000) printd(1,#3)
Описание: Включает gpio16, если gpio14 включен и температура на ds18b20 ниже 30 градусов.
if(gpio14==1&&dsw1<300) gpioset(16,1) else gpioset(16,0) endif
Описание: мониторинг GPIO 12 и отправки sms и email при появлении единички на GPIO12.
if(gpio12==1) sendsms(Кто-то взломал дверь) else resetsms() endif
Описание: вычисляем среднее значение 3 датчиков тремя действиями. Комменты убрать перед вставкой в редактор !! Пример ниже без использования расширенной математики - с ним все проще: valmath(1,(dsw1+dsw2+dsw3)/3)
valmath(1,dsw1+dsw2) // суммируем в глобальную переменную 1 значение 2 датчиков ds18b20 valmath(1,intval1+dsw3) // прибавляем еще третий датчик ds18b20 к глобальной переменной 1 valmath(1,intval1/3) // делим на 3 глобальную переменную 1 для получения среднего значения, значение деления сохраняем в глобальной переменной 1. printw(_INTVAL1_) // выводим тут через конструктор строк переменную _INTVAL1_ end
Описание: Мигаем раз в 5 секунд светодиодом
valmath(1,secondsperday%5) if(intval1==0) gpioset(19,1) delay(500) gpioset(19,0) endif
Описание: Мигаем светодиодом каждые 10 секунд по 5 раз
valmath(1,secondsperday%10) if(intval1==0) valset(2,0) :testf if(intval2>=5) end endif gpioset(16,1) delay(500) gpioset(16,0) delay(500) valmath(2,intval2+1) goto testf endif
Описание: Простой планировщик по времени включения с 7 по 21 час
if(hour>=7&&hour<21) gpioset(16,1) else gpioset(16,0) endif
Описание: Простой способ включения GPIO на заданное время.
if(gpio16==1) delay(2000) gpioset(16,0) endif
Описание: Сложный способ включения GPIO на заданное время. Не мешает действиям других условий в скрипте. Время задается period*X
if(gpio12==1) valmath(1,intval1+1) if(intval1>Х) gpioset(12,0) endif else valset(1,0) endif
Описание: работа с циклом используя goto с периодом 100мс - delay обязателен.
:testm свой код delay(100) goto testm
Описание: Мигаем светодиодом каждые 10 секунд с включением на 3 секунды используя 2 таймера, один из них работает в однократном запуске.
timer(1,10) if(timerevent1) gpioset(16,1) timerone(2,3) endif if(timerevent2) gpioset(16,0) endif
Описание: Способ включения GPIO на заданное время используя таймер. Не мешает действиям других условий в скрипте. Замена примерам 11 и 12.
if(gpio16==1) timerone(1,2) endif if(timerevent1) gpioset(16,0) endif
Описание: 7 пример по новому используя приравнивание переменной через знак равно. Пример ниже без использования расширенной математики - с ним все проще: intval1=(dsw1+dsw2+dsw3)/3
intval1=dsw1+dsw2 intval1=intval1+dsw3 intval1=intval1/3 printw(_INTVAL1_)
Описание: Использование gpio event. Мониторинг GPIO 16 только при изменении состояния. Отсылка уведомления через Telegram(sms и другое), отправка GET запроса и установка gpio 12.
gpioint(1,16,neg) if(gpioevent1) resetsms() sendsms(кто-то взломал дверь) httpget(192.168.1.42/testget) gpioset(12,1) endif
Описание: Использование gpio event и таймера. Мониторинг GPIO 15(например датчик движения) и включение GPIO 16 на 60 секунд. timerstop() тут сбрасывает отчет и не дает выключить GPIO 16 при постоянном изменении состояния на GPIO 15.
gpioint(1,15,pos) if(gpioevent1) gpioset(16,1) timerstop(1) timerone(1,60) endif if(timerevent1) gpioset(16,0) endif
Описание: Использование gpio event в качестве кнопок для управления GPIO. Пример на 2 кнопки. Реализован цикл через goto с паузой для быстрой реакции. Замена опции gpio key для особых не стандартных случаев.
:loop gpioint(1,16,neg) if(gpioevent1) gpioset(12,2) endif gpioint(2,17,neg) if(gpioevent2) gpioset(14,2) endif delay(100) goto loop
Key |
---|
Topic | Description |
---|---|
_IP_ | IP адрес устройства |
_MEM_ | Свободное ОЗУ |
_UPTIME_ | Время работы |
_RSSI_ | Уровень сигнала WI-FI |
_TIME_ | Время |
_TIMES_ | Время с секундами |
_WEEK_ | День недели |
_RFID_ | Данные с RFID |
_PING_ | ping тест статус |
_GTT_ | Температура с gismeteo.ru на сегодня |
_GTH_ | Влажность с gismeteo.ru на сегодня |
_GYT_ | Температура с gismeteo.ru на завтра |
_GYH_ | Влажность с gismeteo.ru на завтра |
_GTP_ | Давление с gismeteo.ru на сегодня |
_GYP_ | Давление с gismeteo.ru на завтра |
_NMx_ | Принятые данные с датчиков narodmon.ru |
_DATE_ | Дата. Требуется поддержка календаря |
Остальные актуальные метрики необходимо смотреть на вкладке metrics на самом устройстве.