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



  • @intrahouse:

    @sergeyygr:

    Добрый день!

    Может я просто не до конца разобрался в инструкциях. У меня освещением на кухне управляет мультисценарий включения света по датчику движения с учетом аналогового датчика освещенности. Очень хочется сделать так, что бы начиная с 23.00 и до утра основной свет не включался, а включалась подсветка. Т.е. один сценарий прекратил работу, а с 23.00 начал работу другой. Подскажите пожалуйста как это сделать. Сценарий скачан отсюда https://ih-systems.com/ru/scenes-examples/.

    Можно сделать так.

    Сценарии освещения по датчику движения оставить как есть. Только они должны учитывать режим Auto.

    Плюс добавить два сценария включения/выключения режима Auto для этих двух светильников.

    Первый сценарий будет запускаться по расписанию в 23.00 Устанавливать "auto" для одного светильника и снимать "auto" для другого

    Второй наоборот, и запускается в 7.00

    Так как эти сценарии запускаются по расписанию, триггер в них не нужен

    В виде блок-схемы сценарий выглядит так:

    scen201.jpg

    Если есть желание, можно немного усовершенствовать. Если в момент переключения режима авто первый светильник был включен, можно его выключить и включить второй светильник:

    scen301.jpg

    Спасибо! Работает! В сценарии добавил автоматический режим (в шаблоне небыло).



  • @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 и его "параллельной работе".

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

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

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