Сценарии - новая версия API
-
@gis:
Подскажите (только начал осваивать систему), а можно ли в сценариях выполнить произвольный запрос? Имеется TFT wi-fi дисплей. Вывод текста на дисплей выполняется запросом [ip адрес]/lcdmsg?st=X&txt=text. Где X - номер строки, text - текст, который надо вывести. Необходимо сформировать строку текста (text) со значением температуры, полученной от устройства и вывести эту строку на дисплей запросом. Подскажите как это сделать?
Добрый день, попробуйте так:
const request = require('/opt/intrahouse-c/backend/node_modules/request'); const temp = DeviceT("DEVICE_ID"); startOnChange([temp]); script({ start() { request(`http://127.0.0.1/lcdmsg?st=1&txt=My temp ${temp.getValue()}℃`); } });
-
То есть русские буквы не выводятся, а другие символы выводятся? Тогда дело не в скорости. Нужно попробовать вывести просто текст. И разбираться с перекодировкой.
Текст на латинице конечно выводится, а вот русские буквы - никак. Хотя на PHP с этим вообще никаких проблем нет (см.код выше).
-
То есть русские буквы не выводятся, а другие символы выводятся? Тогда дело не в скорости. Нужно попробовать вывести просто текст. И разбираться с перекодировкой.
Текст на латинице конечно выводится, а вот русские буквы - никак. Хотя на PHP с этим вообще никаких проблем нет (см.код выше).
Добрый день, сделайте вывод текста который подставляете в url на php и nodejs. Если строки одинаковые то, дело в чем-то другом.
-
@dev:
Добрый день, попробуйте так:
> const request = require('/opt/intrahouse-c/backend/node_modules/request'); > const temp = DeviceT("DEVICE_ID"); > > startOnChange([temp]); > > script({ > start() { > request(`http://127.0.0.1/lcdmsg?st=1&txt=My temp ${temp.getValue()}℃`); > } > }); > >
К сожалению сценарий не сработал, при попытке запуска выдается сообщение внизу экрана:
Error action: {command 'startscene TFT'} request is not defined
TFT - название сценария
DEVICE_ID - подставил идентификатор рабочего датчика температуры
-
@gis:
К сожалению сценарий не сработал, при попытке запуска выдается сообщение внизу экрана:
Error action: {command 'startscene TFT'} request is not defined
TFT - название сценария
DEVICE_ID - подставил идентификатор рабочего датчика температуры
Попробуйте так:
const temp = Device("DEVICE_ID"); startOnChange(temp); script({ start() { require("http").get(`http://192.168.0.xx/lcdmsg?st=1&txt=${temp.value}` ); } });
-
Текст на латинице конечно выводится, а вот русские буквы - никак. Хотя на PHP с этим вообще никаких проблем нет (см.код выше).
iconv-lite преобразует из utf8 верно, проблема скорее всего в преобразовании буфера в строку для размещения в url
let text = buf.toString("hex" или "latin1" или ??)
Хотелось бы действительно увидеть строку запроса с русскими буквами в кодировке cp866, которую формирует php.
Например, для символов АБВГ
-
Текст на латинице конечно выводится, а вот русские буквы - никак. Хотя на PHP с этим вообще никаких проблем нет (см.код выше).
iconv-lite преобразует из utf8 верно, проблема скорее всего в преобразовании буфера в строку для размещения в url
let text = buf.toString("hex" или "latin1" или ??)
Хотелось бы действительно увидеть строку запроса с русскими буквами в кодировке cp866, которую формирует php.
Например, для символов АБВГ
Nodejs проверить не могу, все онлайн инструменты глючат :(
-
Попробуйте так:
> const temp = Device("DEVICE_ID"); > > startOnChange(temp); > > script({ > start() { > require("http").get(`http://192.168.0.xx/lcdmsg?st=1&txt=${temp.value}` ); > } > }); > >
Большое спасибо, так сработало. Хорошо бы добавить возможность управления устройствами с помощью запросов в HTTP-плагин.
-
@gis:
Попробуйте так:
> > const temp = Device("DEVICE_ID"); > > > > startOnChange(temp); > > > > script({ > > start() { > > require("http").get(`http://192.168.0.xx/lcdmsg?st=1&txt=${temp.value}` ); > > } > > }); > > > >
Большое спасибо, так сработало. Хорошо бы добавить возможность управления устройствами с помощью запросов в HTTP-плагин.
Добрый день, управление устройствами доступно, в настройках канала на вкладке команды
-
@gis:
Большое спасибо, так сработало. Хорошо бы добавить возможность управления устройствами с помощью запросов в HTTP-плагин.
gis, а что за такой интересный tft-экран с интерфейсом Wi-Fi?
-
Такой экран - http://radioseti.ru/index.php?route=product/product&path=71&product_id=183
Прошивка от проекта wifi-iot.com, описание команд - https://wifi-iot.com/p/wiki/102/ru/
-
iconv-lite преобразует из utf8 верно, проблема скорее всего в преобразовании буфера в строку для размещения в url
let text = buf.toString("hex" или "latin1" или ??)
C "latin1" на OLED, подключенный к MegaD по I2C, стали выводится русские буквы. Плагин megad зависает (после принудительных остановки и пуска все начинает работать) если в тексте есть пробел… Для MegaD пробел кодируется символами "_" и "s".
-
Большая просьба добавить в расписания возможность запуска сценария:
1. циклически, в определенный промежуток времени в каждого часа.
2. циклически в определенное время в течении каждого часа.
3. циклически в течении дня, через заданный промежуток времени.
Очень не хватает!
-
@gis:
Попробуйте так:
> > const temp = Device("DEVICE_ID"); > > > > startOnChange(temp); > > > > script({ > > start() { > > require("http").get(`http://192.168.0.xx/lcdmsg?st=1&txt=${temp.value}` ); > > } > > }); > > > >
Большое спасибо, так сработало. Хорошо бы добавить возможность управления устройствами с помощью запросов в HTTP-плагин.
Рано радовался - тоже есть проблема с отображением русских букв. Если отослать запрос с русскими буквами из браузера (хрома) то все нормально. Если отослать из сценария, то отображаются кракозябры. Подскажите, пожалуйста как перекодировать русский текст в сценарии в другую кодировку?
-
@gis:
Рано радовался - тоже есть проблема с отображением русских букв. Если отослать запрос с русскими буквами из браузера (хрома) то все нормально. Если отослать из сценария, то отображаются кракозябры. Подскажите, пожалуйста как перекодировать русский текст в сценарии в другую кодировку?
Почитайте выше комментарии. Нужно установить пакет iconv-lite и написать в сценарии 3 не хитрых строчки, которые также есть в комментарии от меня. Главное подобрать формат данных (в функции toString), который воспринимает дисплей.
@gis:Такой экран - http://radioseti.ru/index.php?route=product/product&path=71&product_id=183
Прошивка от проекта wifi-iot.com, описание команд - https://wifi-iot.com/p/wiki/102/ru/
<size size="85">Offtop. Задумка хорошая ESP+TFT дисплей, но исполнение - ужасное! Он реально так выглядит?</size>
-
@gis:
Рано радовался - тоже есть проблема с отображением русских букв. Если отослать запрос с русскими буквами из браузера (хрома) то все нормально. Если отослать из сценария, то отображаются кракозябры. Подскажите, пожалуйста как перекодировать русский текст в сценарии в другую кодировку?
iconv-lite устанавливать не торопитесь. Так должно работать:
const url = 'http://192.168.0.xx/lcdmsg?st=1&txt='+require('querystring').escape(`Температура ${temp.value}`); require("http").get(url);
-
@gis:
Рано радовался - тоже есть проблема с отображением русских букв. Если отослать запрос с русскими буквами из браузера (хрома) то все нормально. Если отослать из сценария, то отображаются кракозябры. Подскажите, пожалуйста как перекодировать русский текст в сценарии в другую кодировку?
Почитайте выше комментарии. Нужно установить пакет iconv-lite и написать в сценарии 3 не хитрых строчки, которые также есть в комментарии от меня. Главное подобрать формат данных (в функции toString), который воспринимает дисплей.
Спасибо за помощь.
-
@gis:
Рано радовался - тоже есть проблема с отображением русских букв. Если отослать запрос с русскими буквами из браузера (хрома) то все нормально. Если отослать из сценария, то отображаются кракозябры. Подскажите, пожалуйста как перекодировать русский текст в сценарии в другую кодировку?
iconv-lite устанавливать не торопитесь. Так должно работать:
> const url = 'http://192.168.0.xx/lcdmsg?st=1&txt='+require('querystring').escape(`Температура ${temp.value}`); > require("http").get(url); > >
Спасибо! Теперь все заработало как надо. Но почему-то не могу сделать сценарий активным в рабочих сценариях. Он запускается и сразу останавливается. Ошибок не выдает. Скрипт:
__**
-
@name Вывод на TFT
-
@desc Выводит информацию на TFT-дисплей
-
@version 4
*/
const tmp = Device("STEMP_M1_P36");
startOnChange(tmp);
script({
start() {
const url1 = 'http://192.168.0.41/lcdmsg?st=5&&font=2txt='+require('querystring').escape(
Температура: ${tmp.value} °C
);require("http").get(url1);
}
});__
-
-
Еще просьба подсказать, почему не работает привязка сценариев к устройствам?? В списке только Скрипт и отладчик. Не пункта Запуск для устройств, как это описано документации.
-
@gis:
Спасибо! Теперь все заработало как надо. Но почему-то не могу сделать сценарий активным в рабочих сценариях. Он запускается и сразу останавливается. Ошибок не выдает.
Все правильно. У вас нет ни таймеров, ни внутренних слушателей.
Есть только триггер (датчик температуры), по событиям которого сценарий будет срабатывать.
Если внутри сценария просто последовательность действий, он отработает и сразу завершится (станет не активным)
При следующем запуске он опять начнется со start(). Большая часть сценариев работает именно так и 99,9% времени находятся в неактивном состоянии.
Но если сценарий взводит таймеры и/или устанавливает слушателя событий устройства, то он остается активным, следит за своими таймерами и устройствами «изнутри», выполняет действия как реакцию на отслеживаемые события.
Более подробно про сценарии, в конце есть примеры: https://ih-systems.com/ru/about-scenes/
В Рабочих сценариях можно увидеть время последнего запуска/останова. Там же сценарий можно заблокировать, тогда он выполняться не будет.