Interpreter (обновлено: 23 Mar 2020, 17:21:13)

Опция простого скриптового языка для создания своей логики и математики: управление GPIO, вывод на дисплеи по условиям, отправка http get запросов с параметрами. Редактор скриптов находится непосредственно на самом модуле в веб интерфейсе.

Доступна тестовая вторая версия Interpreter (v2)-включается в шестеренке(по умолчанию включено), которая полноценно работает с оператором if а так же имеет ряд интересных функций.


Внешний вид веб интерфейса редактора скриптов:

 

Исправления и обновления опции:

17.04.17 - исправлена работа оператора goto.

01.05.17 - обновлен список переменных датчиков.

17.11.18 - доступна 2 версия интерпретатора


Базовые функции:

gpioset(x,y*)  - установка gpio. Пример gpioset(5,1). Не рекомендуется использовать vgpio номера при частом интервале выполнения скрипта

pwmset(x,y*) - установка уровня ШИМ. Пример pwmset(1,200).

if (условие*) - условный оператор. Поддерживается сравнение == , != ,  < , > , >= , <=. У старой версии интерпретатора несколько условий внутри IF не поддерживается!

end - выход из скрипта. У старой версии интерпретатора этим оператором или оператором goto должен оканчиваться скрипт или условие if.

else - после этого оператора выполняется код если условие if не выполнилось. Обязательное использование совместно с if.

delay(x) - остановка скрипта на указанное количество миллисекунд. На время остановки запуск по интервалу не происходит

goto XXX  переход к строке по ссылке XXX. Ссылка ставится в любом месте кода в виде :XXX , без использования delay количество переходов ограничено.

reboot() - перезапуск модуля.

speakline(строка) - воспроизведение MP3 из конструктора фраз. Возможно указать только как номер шаблона в виде #1.

valset(x,y*) - установка значения y глобальной переменной x, номер переменой x считается от нуля.

playwav(путь_до_файла) - проигрывание mp3/wav файла(ESP32).

imageprint(путь_до_файла) - вывод картинки на TFT дисплей(ESP32).


Новые функции во второй версии интерпретатора:

debug(х) - включает или отключает отладку в UART, только для ESP32 и ESP8266RTOS. x - 1 или 0.

httpget(url) - отправить по http строку данных. url - адрес/путь. Подробное описание ниже.

load(имя_файла) - выполняет файл скрипта с диска SD&SPIFFS (ESP32). Подробное описание ниже.

rgbsend(hex строка) - управление WS2812. Подробности в документации. Функция не проверена!

rgb16send(hex строка) -управление WS2812. Подробности в документации. Функция не проверена!

mqttsend(топик,значение) - отправка данных в mqtt. Значение может содержать шаблоны и метрики. Функция не проверена!

stepper(х,у) - управление степпером.

irsendraw(hex данные) - отправка raw ИК команд. Функция не проверена!

Строки, начинающиеся с // считаются комментариями, удобно временно отключать строку скрипта.

* - можно указывать переменные.


Изменение максимального размера скрипта

В дополнительных настройках(в шестеренке) доступно изменение максимального размера скрипта, По умолчанию размер установлен в 500 байт(+1 байт окончание строки), максимальный размер определен максимальным значением числа на вкладке debug в строке Len mem config , для ESP8266 конструктора это значение ограничено 4096 байт, для ESP8266 RTOS и ESP32 - 8192. Максимальный размер скрипта так же ограничен возможностями веб сервера.

Обратите внимание, что у уже настроенного модуля изменение параметра размера повлечет повреждение некоторых настроек у опций !!!


Работа с условным оператором if в 2 версии интерпретатора.

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

Примеры внизу страницы имеют отметку в скобках для какой версии пример(для старой или для новой)

Работа скриптов с дисков SD&SPIFFS.

Вторая версия интерпретатора на модулях ESP32 и ESP8266(RTOS) умеет работать с скриптами, находящиеся на дисках SD или SPIFFS.

Количество строк в файле не ограничено. Длина строки ограничена 1 кб.

Загрузить скрипт можно командой load(имя файла) только из окна-редактора.  Сами скрипты загружать другие файлы не умеют на данный момент.  Пример: load(/SPIFFS/loopnext.txt)

После выполнения файла скрипта управление передается обратно скрипту в окне-редакторе, если не задан параметр end.

Работа с GET запросами

В новой версии интерпретатора доступна отправка метрик на любой сервер используя функцию 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 рекомендуется использовать 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 - значение. Функция не проверена !

При включенной опции конструктора строк в функциях printw, printd или printm вместо текста можно указывать номер шаблона в виде #1 или метрик в виде printw(_DATE_  _TIME_).

matrixbr(уровень яркости) - установка яркости у LED матриц. 100 - выключает матрицу.


Функции отправки SMS и EMAIL

sendsms(текст сообщения) - отправка sms и email сообщений - все включенные сервисы отправки, можно использовать смс шаблоны, если они установлены в прошивке, пример sendsms(#1) или метрик в виде sendsms(_DATE_  _TIME_)

resetsms() - сброс флага отправки, применяется в противоположном действии условия для защиты от циклической отправки. Смотрите пример 6 в конце статьи.


Переменные (для математических функций и оператора IF):

gpioget(х) - чтение состояния GPIO.

adc - встроенный АЦП

valget(x) - глобальная переменная ,x - номер переменной. Нумерация начинается от 0.

Переменные времени: second, minute, hour, mday, monthminutesperday (минут в день ), secondsperday (секунд в день).

Список переменных смотрите внизу статьи

Переменные с датчиков температуры и влажности идут умноженные на 10 ! Если температуру кажет к примеру 26.4, то сравнивать её нужно как число 264.

Переменные с квадратными скобками [] - это массивы, в них нумерация идет с нуля.


Работа с глобальными переменными и математикой

В скриптах возможно использовать специализированные глобальные переменные, которые доступны и на чтение и на запись, в эту же переменную производится запись при работе с математикой. Количество и имена глобальных переменных фиксировано. Максимальное количество переменных - 5 ( от 0 до 4) , тип переменных int32.

Для работы с математикой используется функция valmath(x,Y+Z) , где x - это номер переменной начиная с нуля , Y+Z - это математическое действие. Поддерживается только одиночное действие прибавления, вычитания, деления или умножения. Так же поддерживается остаток от деления (%) 

Для установки переменной используем функцию valset(x,y).

Для чтения переменной используем valget(x)

Для вывода переменных используем макрос _VALx_

Тестовые примеры смотрим внизу статьи под номерами 7 и 8.


Ограничения:

У старой версии интерпретатора в условии if секции true другое условие if будет работать как логика "И" (смотрите пример 5 ниже). Используйте goto.

Лишние пробелы и другие знаки недопустимы. Каждый оператор должен быть в отдельной строке.

Длина кода на данный момент ограничена 500 байтами.

Если скрипт уже выполняется, то кнопка Test не работает. 


Сообщения ошибки:

1 - ошибка синтаксиса, например не хватает скобки

2 - ошибка синтаксиса

3 - превышен лимит переходов.

4 - не найдена переменная в условии

5 - ожидаем условие == , != ,  < , > , >= , <=

6 - не найдена функция (ошибка в названии или не установлена соответствующая опция)

7 - не найдена точка перехода у оператора goto.

8 - слишком малое значение delay.

9 - ошибка номера шаблона в конструкторе строк в операторах вывода.

10 - ошибка в математической функции.

11 - нет переменной с указанным номером.

12 - попытка деления на ноль

Дополнительные коды ошибок для 2 версии:

21 - использование операторов else или endif без if

22- невозможно загрузить файл скрипта с диска

23- превышено количество вложений if


Пример 1:

Описание: простейший термостат с управлением по gpio 14 и индикацией режимов(старая версия)

if(gpioget(14)==0)
printw(выключено)
end
else
if(data1wire[0]<300)
gpioset(16,1)
printw(холодно)
end
else
gpioset(16,0)
printw(горячо)
end
end

Описание: простейший термостат с управлением по gpio 14 и индикацией режимов(новая версия)

if(gpioget(14)==0)
printw(выключено)
else
if(data1wire[0]<300)
gpioset(16,1)
printw(холодно)
else
gpioset(16,0)
printw(горячо)
endif
endif

Пример 2:

Описание: простейшая мигалака GPIO с выводом состояния на главную страницу

:testm
printw(Тик)
gpioset(16,1)
delay(1000)
printw(Так)
gpioset(16,0)
delay(1000)
goto testm

Пример 3:

Описание: мигалака GPIO посложнее с выводом состояния на главную страницу и выключением через GPIO14

:testm
if(gpioget(14)==0)
printw(выключено)
gpioset(16,0)
end
else
printw(Тик)
gpioset(16,1)
delay(1000)
printw(Так)
gpioset(16,0)
delay(1000)
goto testm

Пример 4:

Описание: вывод поочередно из конструктора строк данных на  LCD дисплей. Аналогично можно использовать и для LED матриц.

printd(1,#1)
delay(2000)
printd(1,#2)
delay(2000)
printd(1,#3)

Пример 5:

Описание: Включает gpio16, если gpio14 включен и температура на ds18b20 ниже 30 градусов (старая версия).

if(gpioget(14)==1)
if(data1wire[0]<300)
gpioset(16,1)
end
else
gpioset(16,0)
end

Описание: Включает gpio16, если gpio14 включен и температура на ds18b20 ниже 30 градусов (новая версия).

if(gpioget(14)==1&&data1wire[0]<300)
gpioset(16,1)
else
gpioset(16,0)
endif

Пример 6:

Описание: мониторинг GPIO 12 и отправки sms и email при появлении единички на GPIO12 (старая версия)

if(gpioget(12)==1)
sendsms(Кто-то взломал дверь)
end
else
resetsms()
end

Описание: мониторинг GPIO 12 и отправки sms и email при появлении единички на GPIO12 (новая версия)

if(gpioget(12)==1)
sendsms(Кто-то взломал дверь)
else
resetsms()
endif

Пример 7:

Описание: вычисляем среднее значение 3 датчиков тремя действиями. Камменты убрать перед вставкой в редактор !!

valmath(0,data1wire[0]+data1wire[1]) // суммируем в глобальную переменную 0 значение 2 датчиков ds18b20
valmath(0,valget(0)+data1wire[2]) // прибавляем еще третий датчик ds18b20 к глобальной переменной 0
valmath(1,valget(0)/3) // делим на 3 глобальную переменную 0 для получения среднего значения, значение деления сохраняем в глобальной переменной 1.
printw(_VAL1_) // выводим тут через конструктор строк переменную _VAL1_
end

Пример 8:

Описание: Мигаем раз в 5 секунд светодиодом(старая версия)

valmath(0,secondsperday%5)
if(valget(0)=0)
gpioset(19,1)
delay(500)
gpioset(19,0)
end
else
end

Описание: Мигаем раз в 5 секунд светодиодом(новая версия)

valmath(0,secondsperday%5)
if(valget(0)=0)
gpioset(19,1)
delay(500)
gpioset(19,0)
endif

Пример 9:

Описание: Мигаем светодиодом каждые 10 секунд по 5 раз(старая версия)

valmath(0,secondsperday%10)
if(valget(0)==0)
valset(1,0)
goto testf
else
end
:testf
if(valget(1)<5)
gpioset(19,1)
delay(500)
gpioset(19,0)
delay(500)
valmath(1,valget(1)+1)
goto testf
else
end

Описание: Мигаем светодиодом каждые 10 секунд по 5 раз(новая версия)

valmath(0,secondsperday%10)
if(valget(0)==0)
valset(1,0)
:testf
if(valget(1)>=5)
end
endif
gpioset(16,1)
delay(500)
gpioset(16,0)
delay(500)
valmath(1,valget(1)+1)
goto testf
endif

Пример 10 (для версии v2):

Описание: планировщик по времени включения с 7 по 21 час

if(hour>=7&&hour<21)
gpioset(16,1)
else
gpioset(16,0)
endif


Список переменных

Key
ds3231t Температура DS3231
adc Внутренний АЦП (ESP8266)
ADCdata[x] Данные с АЦП PCF8591
am_h Влажность с датчика AM2321
am_t Температура с датчика AM2321
apdsb APDS9960 Освещенность синий
apdsc APDS9960 Освещенность
apdsg APDS9960 Освещенность зеленый
apdsr APDS9960 Освещенность красный
bh_l Освещенность с датчика BH1750
bme_h Влажность с датчика BME280
bme_p Давление с датчика BME280
bme_t Температура с датчика BME280
bmp_p Давление датчиков BMP180/085
bmp_t Температура датчиков BMP180/085
cntXi Данные с счетчика 60
co2data Датчики CO2 MH-Z1x
data1wire[х] Температура датчиков DS18B20
dht_hХ Влажность датчиков DHT22 DHT11
dht_tХ Температура датчиков DHT22 DHT11
hcsr04 HC-SR04
hdch Влажность датчика HDC1080
hdct Температура датчика HDC1080
hlw_c HLW8012 (Sonoff POW) Ток
hlw_v HLW8012 (Sonoff POW) Напряжение
hlw_w HLW8012 (Sonoff POW) Мощность
hlw_wh HLW8012 (Sonoff POW) Ватт/ч
ina_a Ток с датчика INA219
ina_v Напряжение с датчика INA219
mb[y][x] ModBus метрики
mlxa Температура окружающая MLX90614
mlxo Температура объекта MLX90614
nmval[x] Принятые данные с датчиков narodmon.ru
pmcn Ток с устройства Power Monitor
pmspm10 PM1.0
pmspm100 PM1.00
pmspm25 PM2.5
pmv Напряжение с устройства Power Monitor
rtd MAX31865 Температура
sht30_h Влажность с датчика SHT30
sht30_t Температура с датчика SHT30
sht_h Влажность с датчика SHT21
sht_t Температура с датчика SHT21
tsllux Данные с TSL2561
valget(x) Переменные Interpreter
vl53l0x Расстояние VL53L0X
vsens[y][x] Данные с датчиков Virtual SENS
vw_a[x][y] АЦП с VirtualWire
vw_b[x][y] Один байт с VirtualWire
vw_c[x][y] Счетчики с VirtualWire
vw_h[x][y] Влажность с VirtualWire
vw_t[x][y] Температура с VirtualWire

Список метрик для функций вывода на дисплеи и httpget

Topic Description
_IP_ IP адрес устройства
_MEM_ Свободное ОЗУ
_UPTIME_ Время работы
_RSSI_ Уровень сигнала (нет на старых SDK)
_TIME_ Время
_TIMES_ Время с секундами
_WEEK_ День недели
_RADIO_ Имя текущей интернет станции
_APDSC_ APDS9960 Освещенность
_APDSR_ APDS9960 Освещенность красный
_APDSG_ APDS9960 Освещенность зеленый
_APDSB_ APDS9960 Освещенность синий
_TSSETx_ Установка термостата
_TSONx_ Состояние термостата вкл/выкл
_CCSCO2_ CO2 датчика CCS811
_CCSTVOC_ TVOC датчика CCS811
_LORSxy_ Метрики LORA
_RTD_ MAX31865 Температура
_HDCT_ Температура датчика HDC1080
_HDCH_ Влажность датчика HDC1080
_PMS10_ PM1.0
_PMS25_ PM2.5
_PMS100_ PM1.00
_VL53L0X_ Расстояние VL53L0X
_MByyxx_ ModBus метрики
_OWT_ Температура воздуха OpenWeatherMap
_OWH_ Влажность воздуха OpenWeatherMap
_OWP_ Давление воздуха OpenWeatherMap
_OWWIND_ Скорость ветра OpenWeatherMap
_OWD_ Описание погоды OpenWeatherMap
_OWC_ Облачность OpenWeatherMap
_OWF_ Температура по ощущениям OpenWeatherMap
_OWR3_ Количество осадков 3 часа OpenWeatherMap
_OWR1_ Количество осадков 1 часа OpenWeatherMap
_OWV_ Видимость OpenWeatherMap
_SUNDW_ Восход солнца OpenWeatherMap
_SUNUP_ Заход солнца OpenWeatherMap
_SUNDAY_ Продолжительность дня OpenWeatherMap
_AS5600_ Угол AS5600
_GPSLAT_ Широта GPS приемник
_GPSLON_ Долгота GPS приемник
_GPSH_ Высота GPS приемник
_GPSS_ Скорость GPS приемник
_GPSC_ Курс GPS приемник
_GPSN_ Количество спутиков GPS приемник
_ADC_ Внутренний АЦП (ESP8266)
_IADCx_ Внутренние АЦП (ESP32)
_LM_ Температура с датчика LM75 или DS1621
_INAV_ Напряжение с датчика INA219
_INAC_ Ток с датчика INA219
_DHTTx_ Температура датчиков DHT22 DHT11
_DHTHx_ Влажность датчиков DHT22 DHT11
_BMPT_ Температура датчиков BMP180/085
_BMPP_ Давление датчиков BMP180/085
_CNTxI_ Данные с счетчика 60
_BH_ Освещенность с датчика BH1750
_AMT_ Температура с датчика AM2321
_AMH_ Влажность с датчика AM2321
_DSWx_ Температура датчиков DS18B20
_BMET_ Температура с датчика BME280
_BMEH_ Влажность с датчика BME280
_BMEP_ Давление с датчика BME280
_SHTT_ Температура с датчика SHT21
_SHTH_ Влажность с датчика SHT21
_SHT30T_ Температура с датчика SHT30
_SHT30H_ Влажность с датчика SHT30
_HEAT_ Температура с термопары MAX6675
_CVV_ Напряжение с устройства CC/CV
_CVC_ Ток с устройства CC/CV
_PMV_ Напряжение с устройства Power Monitor
_PMC_ Ток с устройства Power Monitor
_PMW_ Мощность с устройства Power Monitor
_PMWH_ Расход с устройства Power Monitor
_RFID_ Данные с RFID
_SHT10T_ Температура SHT1x
_SHT10H_ Влажность SHT1x
_CO2_ Датчики CO2 MH-Z1x
_PING_ ping тест статус
_VSyx_ Данные с датчиков Virtual SENS
_GTT_ Температура с gismeteo.ru на сегодня
_GTH_ Влажность с gismeteo.ru на сегодня
_GYT_ Температура с gismeteo.ru на завтра
_GYH_ Влажность с gismeteo.ru на завтра
_GTP_ Давление с gismeteo.ru на сегодня
_GYP_ Давление с gismeteo.ru на завтра
_GTWIND_ Скорость и направление ветра gismeteo.ru сегодня
_GYWIND_ Скорость и направление ветра gismeteo.ru завтра
_NMx_ Принятые данные с датчиков narodmon.ru
_ADCx_ Данные с АЦП PCF8591
_RTCT_ Температура DS3231
_NRFxCy_ Счетчик с модулей NRF24
_NRFxTy_ Температура с модулей NRF24
_NRFxHy_ Влажность с модулей NRF24
_NRFxAy_ АПЦ с модулей NRF24
_NRFxGy_ Состояние GPIO с модулей NRF24
_NRFxBy_ Другие данные с модулей NRF24
_RSSIGSM_ RSSI GSM
_PCFCx_ Счетчик импульсов PCF8583
_PCFCTx_ Счетчик импульсов PCF8583 на сегодня
_PCFCYx_ Счетчик импульсов PCF8583 на вчера
_RSx_ Температура с модулей RC датчик
_RSx_ Влажность с модулей RC датчик
_RSx_ АЦП с модулей RC датчик
_CNTx_ Счетчики импульсов.
_INTx_ Событие прерывания
_PWMx_ Состояние ШИМ
_GPIOx_ Состояние GPIO входа
_DATE_ Дата. Требуется поддержка календаря
_VALDESx_ Глобальные переменные конструктора кода
_SCALE_ Весы HX711
_MCPA_ Данные с АЦП MCP3201
_ADSx_ Данные с АЦП ADS1115
_VZCO2_ Датчик VZ-89T CO2
_VZTV_ Датчик VZ-89T tvoc
_NLxT_ Температура с датчиков NooLite
_NLxH_ Влажность с датчиков NooLite
_HCSR_ HC-SR04
_TSL_ Данные с TSL2561
_MCMSG_ Количество сообщений в электронном ящике
_MCUNS_ Количество непрочитанных сообщений в электронном ящике
_UPSI_ Данные с UPS Монитора. Напряжение на входе.
_UPSF_ Данные с UPS Монитора. Напряжение на входе.
_UPSO_ Данные с UPS Монитора. Напряжение на выходе.
_UPSH_ Данные с UPS Монитора. Частота сети
_UPST_ Данные с UPS Монитора. Температура в корпусе
_UPSB_ Данные с UPS Монитора. Напряжение батареи.
_UPSS_ Данные с UPS Монитора. Нагрузка
_MLXO_ Температура объекта MLX90614
_MLXA_ Температура окружающая MLX90614
_VALx_ Переменные Interpreter
_VWTxy_ Температура с VirtualWire
_VWHxy_ Влажность с VirtualWire
_VWCxy_ Счетчики с VirtualWire
_VWAxy_ АЦП с VirtualWire
_VWBxy_ Один байт с VirtualWire
_HLWW_ HLW8012 (Sonoff POW) Мощность
_HLWV_ HLW8012 (Sonoff POW) Напряжение
_HLWC_ HLW8012 (Sonoff POW) Ток
_HLWWH_ HLW8012 (Sonoff POW) Ватт/ч