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



  • @amgstone создал сценарий:

    /** 
    * @name Заміна фільтра води 
    * @desc  
    * @version 4 
    */
    const meter = Device("Meter","час заміни фільтра"); 
    
    script({
        start() {
        meter.setParam("aval",meter.getParam("aval")+1);
        if(meter.getParam("aval")===90){
        this.info('telegram', 'OWNER', 'Заміна фільтра води');
        this.info('pushnotification', 'OWNER', 'Заміна фільтра води'); 
        
        }
        } 
    });
    
    

    но в IH не смог создать дату, чтобы визуализировало дату когда надо заменить фильтр, возможно добавите устройство?



  • Готовлюсь к новому году) в проем гаражных ворот смонтировал RGB-ленту на базе WS2818. Хочется реализовать эффект бегущего огня с плавно изменяемой яркостью (вот пример - смотреть на 2:52-3:02). Я конечно понимаю, что iH - это не RGB-контроллер, но все же есть ли какая-то возможность сделать подобный эффект?? Сам сделал "длинный" бегущий огонь, но код очень топорный...

        TronEffect() {
          this.addListener(sw, "ChangeStateSw");
          
          let blue = 'FF00FF';
          let dark = '000000';
          let color = [blue+blue+blue+dark+dark+dark,dark+blue+blue+blue+dark+dark, dark+dark+blue+blue+blue+dark, dark+dark+dark+blue+blue+blue, blue+dark+dark+dark+blue+blue, blue+blue+dark+dark+dark+blue];
          
          if(++this.i > color.length-1) this.i = 0;
          this.cmd = color[this.i];
          
          this.SendDataToWS2818(this.plugin, this.channel, this.cmd, this.chip);
          
          this.startTimer("T1", this.period, "TronEffect");
        },
    

    Причем это просто бегущий огонь из 6 "пикселей". Как сделать уменьшающийся по яркости хвост огня и увеличить его скорость - это большой вопрос!!



  • @Alex_Jet Добрый день, судя по коду, огонь у вас бегает в переделах 6-ти пикселей ? какая длина ленты у вас ? есть фризы ?



  • @dev, огонь смещается по 6 пикселям. Но поскольку megad повторяет всю эту посылку N-количество раз (ключ "chip" - тут описание), то выглядит это вот так:
    видео. Лента состоит из двух логических запараллеленых кусков длиной 39 чипов)). Ну а вообще длина - 2,4+3+2,4 м. Что такое фризы?



  • Пользователь @intrapro написал в Сценарии - новая версия API:

    @homa, пока такой возможности нет 😞

    Подскажите, появилась возможность запуска сценария из сценария ?
    И есть ли возможность после перезагрузки системы возобновлять работу активных сценариев ?



  • Пользователь @fanagor написал в Сценарии - новая версия API:

    И есть ли возможность после перезагрузки системы возобновлять работу активных сценариев ?

    А так не получается - функция boot()?
    @intrahouse, @dev, я бы всякие такие возможности (startOnChange, check, boot и прочее) добавил бы на страницу "Система команд".



  • Пользователь @Alex_Jet написал в Сценарии - новая версия API:

    А так не получается - функция boot()?

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



  • Пользователь @fanagor написал в Сценарии - новая версия API:

    boot() инициирует новый запуск, вопрос как возобновить исполнение с нужной точки.

    Может быть запоминать состояние в переменной сценария или вообще в глобальной переменной?



  • Пользователь @Alex_Jet написал в Сценарии - новая версия API:

    Может быть запоминать состояние в переменной сценария или вообще в глобальной переменной?

    Да, видимо так и сделаю.
    Есть сценарии которые выполняются циклически через заданный промежуток времени, если он выполнил перезагрузку системы, то нужно ждать пока он не запустится заново.
    Видимо перед перезагрузкой нужно присвоить значение нужной переменной, продублировать сценарий но уже с функцией boot() и проверкой этой переменной.
    Думал обойтись без дублирования сценария, может есть механизм ? Было бы удобно.



  • Коллеги, старую версию сценариев уже забыл...как в сценарии проверить включен ли RGB-светильник? По isChanged в отладчике вижу вот это:

    isChanged(RGBLAMP4_01,aval)=true Changed: {"RGBLAMP4_01":{"aval":[255,255,255],"dval":1,"stval":1}}
    


  • Добрый день.
    this.isChanged(device1) проверяет свойство Error устройства device1 ?
    В сценарии есть команда
    if(this.isChanged(TERMOREG_1)) {
    //
    }

    Сценарий запускается по изменению, но при этом результат проверки условия false.
    02.12 16:10:27.687 Check(TERMOREG_1) => true
    02.12 16:10:27.688 Started
    02.12 16:10:27.689 isChanged(TERMOREG_1,aval)=false Changed: {"TERMOREG_1":{"err":"Device timeout error!"}}
    02.12 16:10:27.689 isChanged(LAMP_32,dval)=false Changed: {"TERMOREG_1":{"err":"Device timeout error!"}}
    02.12 16:10:27.689 isChanged(TERMOREG_3_1,aval)=false Changed: {"TERMOREG_1":{"err":"Device timeout error!"}}
    02.12 16:10:27.689 Stopped

    Тип устройства: аналоговый датчик.



  • @fanagor, добрый день.

    Метод this.isChanged позволяет узнать, какое событие стало причиной запуска сценария:
    this.isChanged(device, 'setpoint') - изменили уставку
    this.isChanged(device, 'auto') - изменился флаг auto
    this.isChanged(device, 'value') - изменилось основное значение

    this.isChanged(device) сокращенная форма для this.isChanged(device, 'value'), то есть =true, если сценарий запущен при изменении основного свойства устройства (aval для аналогового, dval для дискретного устройства)

    isChanged(TERMOREG_1,aval)=false Changed: {"TERMOREG_1":{"err":"Device timeout error!"}} означает:
    Сценарий запустился при изменении основного значения TERMOREG_1?
    Нет, изменился флаг ошибки "err", так как сработал таймаут
    Истинным в данном случае будет
    this.isChanged(TERMOREG_1, 'error') или this.isChanged(TERMOREG_1, 'err')



  • Это сообщение удалено!


  • Добрый день!
    При использовании функции boot() сценарий запускается при старте сервера и остается постоянно активным хотя в нем никаких таймеров и слушателей нет. Так и должно быть?



  • @Lost, добрый день!
    Нет, так быть не должно.
    Функция boot должна проверить условие, и если истина, запускается функция start(). Дальше работает как обычно. Этот же сценарий может запускаться дальше по startOnChange() или интерактивно

    script({
      boot() { 
         return lamp.isOn();  // Запустит на старте функцию  start, если выполнено условие
        // return true; // Будет всегда запускать на старте  функцию start
      },
      start() { 
      	.....
      },
    

    В самой boot никаких действий делать не надо!



  • Я и не делал. Сделано пока вот так для пробы:
    script({
    boot() {
    return true;
    },
    start() {
    global.set(‘Armed’, 1);
    },
    Скрипт после перезагрузки сервера запускается и висит активным в рабочих сценариях (есть зеленая галочка). Вручную останавливается. Если вручную запустить то он после отработки останавливается (увеличивается счетчик количества запусков). Что не так?



  • @Lost, Вы правы, это баг 😞
    Сценарий с boot, не имеющий асинхронных механизмов, остается в состоянии активный (зеленая галочка)
    Исправим в версии 4.7.7, выйдет на следующей неделе



  • Здравствуйте, уважаемые разработчики и форумчане! Поздравляю всех с наступившим Новым 2021 годом!
    Желаю всем творческих успехов.
    А теперь о проблеме. Пишу сценарий для управления новогодней гирляндой. У нее есть http API. При управлении используются данные из предыдущих ответов на запрос. Проблема в том, что не получается распарсить ответ и присвоить его разным переменным. Вот, собственно, сценарий

    /** 
    * @name twinkly_http 
    * @desc  
    * @version 4  
    */
    
    script({
        host: '192.168.144.68',
        port: 80,
        method: '',
        path: '',
        myObj: '',
    
        start() {
          // login
          this.path = '/xled/v1/login';
          this.method = 'POST';
          this.send_http();
    
          // verify
          
          // Действие
          
        },  
        
        send_http() {
          const http = require('http');
          const querystring = require('querystring');
          const postData = JSON.stringify({
            challenge: 'AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8='
          });
          this.log('postData: '+postData);
          
          var options = {
            hostname: this.host,
    	      port: this.port,
    	      path: this.path,
    	      method: this.method,
    	      headers: {
    	        'Host': '192.168.144.68',
    		      'Content-Type': 'application/json',
    		      'Content-Length': postData.length //Buffer.byteLength(postData)
    	      }
          };
    
          var req = http.request(options, (res) => {
    	      this.log('STATUS: '+res.statusCode);
    	      this.log('HEADERS:' +JSON.stringify(res.headers));
    	      res.setEncoding('utf8');
    	      res.on('data', (chunk) => this.myObj += chunk);
    
    	      res.on('end', () => {
    		      this.log('Data:' +this.myObj);
    		      const data = JSON.parse(this.myObj);
    		      this.log('Code:' +data);
    		      this.log(typeof this.myObj === 'string');
    		      this.log('No more data in response.');
    	      });
          });
    
          req.on('error', (e) => {
    	      this.log('problem with request: ' +e.message);
          });
    
          // write data to request body
          req.write(postData);
          req.end();
        }
    });
    

    А вот сообщение в отладчике

    03.01 13:15:08.970 Started
    03.01 13:15:08.971 log: postData: {"challenge":"AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8="}
    03.01 13:15:08.994 Stopped
    03.01 13:15:09.013 log: STATUS: 200
    03.01 13:15:09.017 log: HEADERS:{"connection":"close","content-length":"155","content-type":"application/json"}
    03.01 13:15:09.021 log: Data:{"authentication_token":"4Be8Ix3sQBQ=","authentication_token_expires_in":14400,"challenge-response":"7ef99322220ff8a9c45aa1efa26ba01d2320aecc","code":1000}
    03.01 13:15:09.024 log: Code:[object Object]
    03.01 13:15:09.026 log: true
    03.01 13:15:09.028 log: No more data in response.

    Данные из строки Data не могу получить по отдельности. Перечитал разные доки, форумы. Ничего не получается. Что я делаю не так?



  • @int144, добрый день! Удачи в Новом году!!!

    Данные из строки Data не могу получить по отдельности.

    Если только в этом проблема, то здесь у вас уже все есть, нужно брать свойства data через точку:

    const data = JSON.parse(this.myObj); // из строки получился прекрасный объект, дальше присваиваете свойствам сценария или локально:

    this.authentication_token = data.authentication_token;
    const challenge-response = data.challenge-response;



  • @intrapro, спасибо за быстрый ответ.
    Заработало, хотя вроде пробовал так, но может не совсем так. Но!
    Значения выводятся в лог, только если я их присвоил в разделе res.on('end'..., а если я пытаюсь вывести в лог присвоенные значения из start после вызова this.send_http, то получаю пустые значения


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