Сценарии - новая версия API
-
@dev:
Добрый день, здорово что у Вас получилось
Коллеги, с наступившим Новым Годом Вас!!!
Я немного поторопился с выводами о работе iconv…сценарий при запуске не ругался и в отладчике что-то подобное cp866 выводилось. Однако на практике оказалось не все так радужно - на OLED ничего нет. Связываю это с большой скорострельностью node.js и его "параллельной работе". Да, кстати, при обновлении системы из dependencies исчезает дописанная строка с версией iconv-lite.
Еще смысл такой, что функцию вывода данных на OLED пришлось наворотить таймерами...таймер для очистки первой строки дисплея, для вывода новой первой строки, для вывода значения параметра... иначе все не читабельно и с кучей артефактов:(
DataToOLED(text, value, unit, plugin, channel) { let iconv = require("/opt/intrahouse-c/backend/node_modules/iconv-lite"); let buf = iconv.encode(text, "cp866"); this.text = buf.toString(); //Центрирование параметра на OLED let length = this.text.length; let col = (128 - length*6)/2; this.col = col.toFixed(0); //Форматирование цифровых значений let str = ""; //Вспомогательная переменная if(value < 100) value = value.toFixed(1); str = value.toString(); if(str.length < 4 && value > 0) this.str = 's+' +str; else if(str.length < 4) this.str = 'ss' +str; else if(str.length < 5) this.str = 's' +str; //Выбор единицы измерения if(unit == "grad") this.unit = ":"; else if(unit == "percent") this.unit = "s"; //"%" else if(unit == "ppm") this.unit = "s"; //"p" //Вывод команд на дисплей this.ClearOLED(); //Очищаем первую строчку this.startTimer("T2", 0.3, "SendTextToOLED"); this.startTimer("T3", 0.5, "SendValueToOLED"); if(!this.oled_state) { //Если дисплей выключен //то включаем его после обновления параметра this.startTimer("T4", 0.7, "TurnOnOLED"); } },
На php все гораздо легче и работает на порядок предсказуемо, никакие задержки не нужны:
$my_temp = number_format($temp_bme280, 1); // Получаем значение из базы и форматируем его if ( strlen($my_temp) < 4 && $my_temp > 0 ) $my_temp = "s+$my_temp"; elseif (strlen($my_temp) < 4 ) $my_temp = "ss$my_temp"; elseif (strlen($my_temp) < 5 ) $my_temp = "s$my_temp"; $text = "Улица"; $text = iconv("utf-8", "cp866", $text); $length = strlen($text); $col = (128 - $length*6)/2; $col = round($col); file_get_contents("http://192.168.11.25/sec/?pt=31&disp_cmd=1&row=0"); file_get_contents("http://192.168.11.25/sec/?pt=31&text=" .$text. "&col=" .$col. "&row=0"); file_get_contents("http://192.168.11.25/sec/?pt=31&text=$my_temp:");
-
Всех с Новым Годом!! Удачи и интересных задач в Новом Году!!
@Alex_Jet:Я немного поторопился с выводами о работе iconv…сценарий при запуске не ругался и в отладчике что-то подобное cp866 выводилось. Однако на практике оказалось не все так радужно - на OLED ничего нет. Связываю это с большой скорострельностью node.js и его "параллельной работе".
То есть русские буквы не выводятся, а другие символы выводятся? Тогда дело не в скорости. Нужно попробовать вывести просто текст. И разбираться с перекодировкой.
Да, кстати, при обновлении системы из dependencies исчезает дописанная строка с версией iconv-lite.
Это нормально. Вы же уже установили модуль. Данные dependencies в package.json нужны только для установки новых пакетов.
Еще смысл такой, что функцию вывода данных на OLED пришлось наворотить таймерами…таймер для очистки первой строки дисплея, для вывода новой первой строки, для вывода значения параметра... иначе все не читабельно и с кучей артефактов:(
Была мысль добавить в pluginCommand время - интервал для запуска. Здесь это как раз востребовано.
Добавим в новом году
-
Подскажите (только начал осваивать систему), а можно ли в сценариях выполнить произвольный запрос? Имеется TFT wi-fi дисплей. Вывод текста на дисплей выполняется запросом [ip адрес]/lcdmsg?st=X&txt=text. Где X - номер строки, text - текст, который надо вывести. Необходимо сформировать строку текста (text) со значением температуры, полученной от устройства и вывести эту строку на дисплей запросом. Подскажите как это сделать?
-
@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), который воспринимает дисплей.
Спасибо за помощь.