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



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

    }

    });__



  • Еще просьба подсказать, почему не работает привязка сценариев к устройствам?? В списке только Скрипт и отладчик. Не пункта Запуск для устройств, как это описано документации.



  • @gis:

    Спасибо! Теперь все заработало как надо. Но почему-то не могу сделать сценарий активным в рабочих сценариях. Он запускается и сразу останавливается. Ошибок не выдает.

    Все правильно. У вас нет ни таймеров, ни внутренних слушателей.

    Есть только триггер (датчик температуры), по событиям которого сценарий будет срабатывать.

    Если внутри сценария просто последовательность действий, он отработает и сразу завершится (станет не активным)

    При следующем запуске он опять начнется со start(). Большая часть сценариев работает именно так и 99,9% времени находятся в неактивном состоянии.

    Но если сценарий взводит таймеры и/или устанавливает слушателя событий устройства, то он остается активным, следит за своими таймерами и устройствами «изнутри», выполняет действия как реакцию на отслеживаемые события.

    Более подробно про сценарии, в конце есть примеры: https://ih-systems.com/ru/about-scenes/

    В Рабочих сценариях можно увидеть время последнего запуска/останова. Там же сценарий можно заблокировать, тогда он выполняться не будет.



  • @Alex_Jet:

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

    Не очень понятно 😞

    Хотелось бы получить строку запроса, на которой плагин виснет.



  • @intrapro:

    Более подробно про сценарии, в конце есть примеры: https://ih-systems.com/ru/about-scenes/

    В Рабочих сценариях можно увидеть время последнего запуска/останова. Там же сценарий можно заблокировать, тогда он выполняться не будет.

    В окне рабочего сценария в столбце "Ошибка" появилась ошибка um is not defined. Появилась иконка "стоп

    Прочитал все про сценарии, но так и не понял, что такое рабочие сценарии? Как созданные сценарии попадают в рабочие? Почему у меня нельзя привязать сценарий к устройству (нет вкладки устройства)? Почему не один сценарий не виден в расписании?? Создавал сценарии из примеров. Делал так как в описании, но половина вкладок недоступна. Может надо что-то переустановить в системе?



  • @intrapro:

    @Alex_Jet:

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

    Не очень понятно 😞

    Хотелось бы получить строку запроса, на которой плагин виснет.

    Подробный ответ тут - https://frm.intrahouse.ru/viewtopic.php?f=18&t=5312&p=8437#p8437



  • @gis:

    В окне рабочего сценария в столбце "Ошибка" появилась ошибка um is not defined. Появилась иконка "стоп

    Скорее всего, опечатка в скрипте.

    @gis:

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

    Сценарий может быть создан для конкретного устройства - как в вашем примере:

    const tmp = Device("STEMP_M1_P36");
    
    

    Ему никакая привязка не нужна - устройство указано в скрипте. И вкладки "Запуск для устройств" нет

    Но можно указать не название устройства, а его класс:

    SensorD - дискретный датчик, SensorA - аналоговый, ActorD - дискретный актуатор, ActorA - аналоговый, Meter - счетчик

    В нашем случае:

    const tmp = Device("SensorA");
    
    

    В этом случае получается т. н. мультисценарий или шаблонный сценарий.

    В списке сценариев простые и мультисценарии имеют разные иконки. У мультисценариев стоит прочерк в графах Устройства и Триггеры.

    Но зато они имеют вкладку "Запуск для устройств", на которой можно создать наборы реальных устройств, для которых этот сценарий будет работать.

    Так написаны все сценарии, которые предлагаются в качестве шаблонных: https://ih-systems.com/ru/scenes-examples/

    Например, lightOn2Gerkons - свет по двум датчикам открытия с учетом дискретного датчика освещенности

    const lamp = Device("ActorD", "Светильник", [{"name":"timeOff", "note":"Светильник горит без движения, сек", "type":"number", "val":5}]); 
    const sensor1 = Device("SensorD", "Датчик открытия 1");  
    const sensor2 = Device("SensorD", "Датчик открытия 2");  
    const darkness = Device("SensorD", "Датчик освещенности (дискретный)"); 
    
    

    Чтобы начать использовать такой сценарий, нужно на вкладке "Запуск для устройств" привязать его к четырем реальным устройствам проекта.

    Таких наборов может быть несколько - будут созданы экземпляры сценария для каждого набора устройств. То есть для одного сценария lightOn2Gerkons будет например 3 рабочих сценария.

    Если же в сценарии устройство прописано жестко, то и строка в рабочих будет одна. И разница только в том, что таблица рабочих сценариев показывает рабочие характеристики (когда и сколько раз запущен сценарий, был ли заблокирован).

    @gis:

    Почему не один сценарий не виден в расписании?? Создавал сценарии из примеров. Делал так как в описании, но половина вкладок недоступна.

    Сценарии могут запускаться по событиям устройств.

    В этом случае скрипт имеет строку, описывающую триггеры - те самые устройства, которые приводят к запуску сценариев: startOnChange([temp, motion, lamp])

    или для старой версии check() и/или DeviceT()

    Если сценарий имеет триггеры - он по ним и запускается.

    А вот если триггера нет - такой сценарий можно запустить с кнопки, по расписанию, по команде смс и т д - т е по желанию пользователя.

    Посмотрите в списке сценариев - те сценарии, которые вы хотите увидеть в расписании, должны иметь прочерк в столбце Триггеры.



  • Небольшой баг в сценариях - в окне "Запуск для устройств" при нажатии на любую строку набора устройств все строки пропадают, хотя кнопки добавить/скопировать/удалить становятся активными.
    Пропадают_строки_Наборов_устройств.png



  • Коллеги, а подскажите почему из "Сценарии" нельзя заблокировать мультисценарий? Иначе приходиться блокировать все, например, 14 шт. вручную из "Рабочие сценарии". Сегодня столкнулся с тем, что сценарии, которые принудительно заблокировал самопроизвольно восстановились!!! Это не есть гуд…

    А еще можно в "Рабочие сценарии" сделать правильную сортировку по числовому значению ID? Чтобы шло не 2, 20-29, 3, 30-39, а 1,2,3,4 и т.д.



  • Подскажите, как из расписания переключать switch, имеющий 3 и больше состояний? Не делать же для этого сценарии!

    И еще по поводу расписания:

    1. Почему не рассчитывается время в которое должно включиться/выключиться устройствой на рассвете/закате +-временная поправка? Update - время рассчитывается, оказывается для этого есть отдельный столбец:), но задания в расписании не сортируются также удобно как было в Berry 😞

    2. В Berry в расписаниях очень удобна была вкладка if - включить устройство, если дом под охраной, например.



  • @Alex_Jet:

    Подскажите, как из расписания переключать switch, имеющий 3 и больше состояний? Не делать же для этого сценарии!

    Почему нет? На сегодня напрямую из расписания можно выполнить только простые и групповые команды on-off-toggle. Все остальное через сценарий.

    @Alex_Jet:

    1. Почему не рассчитывается время в которое должно включиться/выключиться устройствой на рассвете/закате +-временная поправка?

    Должно рассчитываться.

    1. Возможно не установлены Широта-Долгота в Настройки - Локация

    2. Формат временного смещения должен быть +hh:mm или -hh:mm

    @Alex_Jet:

    2. В Berry в расписаниях очень удобна была вкладка if - включить устройство, если дом под охраной, например.

    В планах у нас создать пользовательский виджет расписания, (как это было в Berry, но более современно).

    В PM, чтобы не загромождать настройку, сделали по минимуму.

    Все ведь можно сделать через сценарии, немножно громоздко, но универсально 🙂



  • @Alex_Jet:

    но задания в расписании не сортируются также удобно как было в Berry 😞

    Здесь это обычная таблица PM, сортировать можно по любому столбцу 🙂



  • @intrapro:

    Почему нет? На сегодня напрямую из расписания можно выполнить только простые и групповые команды on-off-toggle. Все остальное через сценарий.

    Да как-то сложно это - ради переключения switch в нужное положение надо делать 3-5 сценариев, а потом еще кучу заданий по расписанию.

    Ок, в Berry у меня в расписании было 2 записи - в 7.00 включить "День", если был включен "Ночь" и в 17.00 включить "Ночь", если был включен "День". Сделано было для того, что если вручную включен "Эконом", то по расписанию День/Ночь не включать. Как теперь это сделать, предложите варианты?!
    @intrapro:

    Все ведь можно сделать через сценарии, немножно громоздко, но универсально 🙂

    Если честно, то я уже путаюсь в своих сценариях… ранее в предложения писал, что нужно разделение сценариев по системам, например. Как в устройствах - выбрал нужную систему и отобразились устройство только этой системы. И да, нужен поиск устройств - иногда надо найти быстренько, подправить что-нибудь, но не тут-то было если устройств далеко за 200 шт.
    @intrapro:

    Здесь это обычная таблица PM, сортировать можно по любому столбцу 🙂

    Да я понимаю, хочется чтобы зашел и сразу понял что в какой очередности включится. Может я сильно привык к Berry, но там это было удобно!

    PS: прокомментируйте, пожалуйста, в этой ветке еще один мой пост за вчерашний день.



  • Пробую сделать сценарий переключения режимов работы отопления. Хочу делать запись в пользовательский журнал типа "Режим отопления - День", но как мне получить "Название состояния" переключателя (в данном случае - День)?

    И еще - как правильно сравнивать с нулем: this.sumWorkPumps() === 0 или так this.sumWorkPumps() == 0. Во втором случае система ругается на синтаксис.


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