Сценарии - новая версия API



  • Всех с Новым Годом!! Удачи и интересных задач в Новом Году!!
    @Alex_Jet:

    Я немного поторопился с выводами о работе iconv…сценарий при запуске не ругался и в отладчике что-то подобное cp866 выводилось. Однако на практике оказалось не все так радужно - на OLED ничего нет. Связываю это с большой скорострельностью node.js и его "параллельной работе".

    То есть русские буквы не выводятся, а другие символы выводятся? Тогда дело не в скорости. Нужно попробовать вывести просто текст. И разбираться с перекодировкой.

    @Alex_Jet:

    Да, кстати, при обновлении системы из dependencies исчезает дописанная строка с версией iconv-lite.

    Это нормально. Вы же уже установили модуль. Данные dependencies в package.json нужны только для установки новых пакетов.

    @Alex_Jet:

    Еще смысл такой, что функцию вывода данных на 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()}℃`);
      }
    });
    
    
    


  • @intrapro:

    То есть русские буквы не выводятся, а другие символы выводятся? Тогда дело не в скорости. Нужно попробовать вывести просто текст. И разбираться с перекодировкой.

    Текст на латинице конечно выводится, а вот русские буквы - никак. Хотя на PHP с этим вообще никаких проблем нет (см.код выше).



  • @Alex_Jet:

    @intrapro:

    То есть русские буквы не выводятся, а другие символы выводятся? Тогда дело не в скорости. Нужно попробовать вывести просто текст. И разбираться с перекодировкой.

    Текст на латинице конечно выводится, а вот русские буквы - никак. Хотя на 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}` );
        } 
    });
    
    
    


  • @Alex_Jet:

    Текст на латинице конечно выводится, а вот русские буквы - никак. Хотя на PHP с этим вообще никаких проблем нет (см.код выше).

    iconv-lite преобразует из utf8 верно, проблема скорее всего в преобразовании буфера в строку для размещения в url

    let text = buf.toString("hex" или "latin1" или ??)

    Хотелось бы действительно увидеть строку запроса с русскими буквами в кодировке cp866, которую формирует php.

    Например, для символов АБВГ



  • @intrapro:

    @Alex_Jet:

    Текст на латинице конечно выводится, а вот русские буквы - никак. Хотя на PHP с этим вообще никаких проблем нет (см.код выше).

    iconv-lite преобразует из utf8 верно, проблема скорее всего в преобразовании буфера в строку для размещения в url

    let text = buf.toString("hex" или "latin1" или ??)

    Хотелось бы действительно увидеть строку запроса с русскими буквами в кодировке cp866, которую формирует php.

    Например, для символов АБВГ

    
    Nodejs проверить не могу, все онлайн инструменты глючат  :(
    


  • @intrapro:

    Попробуйте так:

    > 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:

    @intrapro:

    Попробуйте так:

    > > 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/



  • @intrapro:

    iconv-lite преобразует из utf8 верно, проблема скорее всего в преобразовании буфера в строку для размещения в url

    let text = buf.toString("hex" или "latin1" или ??)

    C "latin1" на OLED, подключенный к MegaD по I2C, стали выводится русские буквы. Плагин megad зависает (после принудительных остановки и пуска все начинает работать) если в тексте есть пробел… Для MegaD пробел кодируется символами "_" и "s".



  • Большая просьба добавить в расписания возможность запуска сценария:

    1. циклически, в определенный промежуток времени в каждого часа.

    2. циклически в определенное время в течении каждого часа.

    3. циклически в течении дня, через заданный промежуток времени.

    Очень не хватает!



  • @gis:

    @intrapro:

    Попробуйте так:

    > > 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);
    
    
    


  • @Alex_Jet:

    @gis:

    Рано радовался - тоже есть проблема с отображением русских букв. Если отослать запрос с русскими буквами из браузера (хрома) то все нормально. Если отослать из сценария, то отображаются кракозябры. Подскажите, пожалуйста как перекодировать русский текст в сценарии в другую кодировку?

    Почитайте выше комментарии. Нужно установить пакет iconv-lite и написать в сценарии 3 не хитрых строчки, которые также есть в комментарии от меня. Главное подобрать формат данных (в функции toString), который воспринимает дисплей.

    Спасибо за помощь.



  • @intrapro:

    @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);

    }

    });__


Авторизуйтесь, чтобы ответить