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



  • @intrapro, для комплиментарности синтаксиса надо сделать actor.setError(0)/actor.setError(1)!



  • Таймер - суть локальная для сценария?
    Т.е можно ли из одного сценария сбросить таймер запущеный в другом сценарии?



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

    Таймер - суть локальная для сценария?

    Да, верно. Сценарии друг от друга изолированы, таймеры существуют только внутри конкретного сценария

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

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

    Вариант 1. Вместе с основным таймером запустить короткий таймер (1 сек, 0.5 сек), который проверяет какое-то условие, и если нужно - сбрасывает основной таймер (или завершает сценарий)

       start() {
              // что-то делаем   
              // взводим основной таймер на минуту 
              this.startTimer("T1", 60, "onT1");   
             
             // взводим доп таймер на секунду 
             this.startTimer("T2", 1, "onT2");      
      },
    
      onT2() {
           // Что-то проверяем - например общую (глобальную) переменную, которую взведет другой сценарий
          if (global.myFlag)  {
            this.exit();  // Выходим, при этом все таймеры этого сценария сбрасываются
          } else {     
             this.startTimer("T2", 1, "onT2"); // иначе взводим доп таймер заново 
          }      
      },
      onT1() {
             // Основной таймер продержался - что-то делаем....
            this.exit(); // завершаем сценарий
       }      
    }
    

    Вариант 2. Через дополнительное виртуальное устройство, которое является флагом. В этом случае нужно добавить слушателя для устройства-флага и по его событию сбрасывать таймер

    Вариант 3. Если доп. устройство добавлять не хочется, можно добавить дополнительный параметр существующему устройству, слушать события этого устройства, в слушателе проверять, что изменился именно этот параметр:

    if (this.isChanged(dev1, 'myflag', 1)  {
        this.stopTimer("T1");
        //  Не забывать завершать сценарий, так как при наличии слушателя сам он не завершится
        this.exit();
    }
    


  • Добрый день, подскажите: какое устройство нужно создать что бы появилась кнопка на мнемосхеме, нужно что бы эта кнопка активировала сценарий и была видима в мобильном приложении.



  • @amgstone, на мнемосхеме можно просто создать элемент "Кнопка" (Button) и в свойствах у нее выбрать - запуск сценария. Однако этот элемент будет отображаться только на мнемосхеме, поскольку в нативном мобильном приложении сейчас отображаются только устройства. Поэтому вам лучше создать устройство на основе "Актуатор универсальный дискретный", вынести его на мнемосхему, в свойствах переключения выбрать Toggle, а в сценарии прописать startOnChange(константа актуатора), чтобы он запускался по каждому изменению состояния актуатора.



  • @Alex_Jet первый вариант сам пробовал но не подошол, кнопка не устройство, а от Toggle то что надо)))). Спасибо!!!



  • В одном из сценариев не могу избавиться от варнинга:
    2554c8a4-7f9e-472c-842a-7dcd38992c69-image.png
    причем если строку закомментировать, то варнинг перейдет на следующую, а если вставить кусок кода выше, то, соответственно поднимется вверх))) При всем этом сценарий работает правильно. Что с этим можно сделать?



  • @homa
    Я ничего не делал. У меня также есть сценарии, где выдает такую же ошибку. Работает и работает, видимо есть ограничение по длине кода.



  • создал сценарий на блок схеме, но в плагине voicecontrol он не видим alt text



  • @amgstone, чтобы он был видим из плагина в нем не должно быть триггера.



  • @Alex_Jet так и сделал, но не удобно делать 2 сценария на одно действие, с тригером и без тригера.



  • @amgstone, это ограничения блок-схем на данный момент. Выше представители intraHouse писали, что их технологии не успевают за детьми)))



  • Подскажите в сценарии как то можна вернуть в предыдущее состояние устройство?



  • У меня проблема, которую я не могу осознать.

    Мультисценарий

    script({
        start(step) {
          step = Number(step);
           let newvalue = step;
           ActUst.setValue(newvalue);
        } 
    });
    

    И кнопка с дополнительным параметром, запускающим суенарий.
    Если дополнительный параметр положительный - все работает.
    Если отрицательный - нет.
    Отладчик скрипта пишет, что значение актуатору присвоено, а в устройствах оно не меняется.

    Актуатор по модбасу присоединен к параметру контроллера "температура антизамерзания". Этот параметр содержит значение температуры на улице, ниже которой насос в контуре станет постоянно включенным. Если выше включается/выключается по необходимости, если ниже - всегда гоняет жижу, чтобы не замерзла. Такая функция.
    Соответственно, значение может быть от -25 до +5.
    Но на 0 и выше скриптом назначается, а на любое отрицательное - нет.

    Решил сделать другой мультисценарий.
    Просто строку

    ActUst.setValue(-25)
    

    Ошибок нет. Но этот сценарий не отображается в меню "параметры" у кнопки. Перезагрузка IH не помогла.

    Если назначаю отрицательное значение напрямую на контроллере - они считываются по модбас, и отображаются в IH. Наоборот - только положительные.

    Что за магия?



  • Если управлять этим же скриптом актуатором, не подключенным к модбас, все работает.



  • @Erik, добрый день
    Возможно, назначается не тот тип переменной при записи по modbus отрицательных чисел. Посмотрите в отладчике плагина в момент передачи команды на запись. Там должны быть сообщения:

    Command ..... received. Data: ....
    // Потом
    WRITE: unitId =..., FC = 6, address =....
    


  • вот успешное

    29.02 13:49:06.536 IH: command [ { dn: 'ACTORA84', prop: 'set', val: 5 } ]
    29.02 13:49:06.538 IH: send { type: 'act',
      data: 
       [ { chan: 'T.Antizam.Ku',
           id: 'T.Antizam.Ku',
           vartype: 'int16',
           usek: false,
           ks: 100,
           ks0: 0,
           gr: false,
           pollp: true,
           value: 50,
           desc: 'AO',
           kh0: 0,
           address: '1321',
           fcr: '3',
           useactions: false,
           kh: 100,
           nofb: false,
           unitid: 1,
           calc_outfn: [Function: anonymous],
           command: 'set' } ] }
    29.02 13:49:06.542 modbus1: Command to send: [ { chan: 'T.Antizam.Ku',
        id: 'T.Antizam.Ku',
        vartype: 'int16be',
        usek: false,
        ks: 100,
        ks0: 0,
        gr: false,
        pollp: true,
        value: 50,
        desc: 'AO',
        kh0: 0,
        address: 1321,
        fcr: '3',
        useactions: false,
        kh: 100,
        nofb: false,
        unitid: 1,
        command: 'set' },
      53,
      54,
      55,
      56,
      57,
      58,
      59,
      60,
      61,
      62,
      63,
      64,
      65,
      66,
      67,
      68,
      69,
      70,
      71 ]
    29.02 13:49:06.557 modbus1: WRITE: unitId = 1, FC = 6, address = 1321 (0x529), value = 50
    29.02 13:49:06.558 modbus1: writeSingleRegister: address = 1321 (0x529), value = 50
    29.02 13:49:06.559 modbus1: Write result: { address: 1321, value: 50 }
    

    а вот ошибки

    29.02 13:49:08.683 IH: command [ { dn: 'ACTORA84', prop: 'set', val: -20 } ]
    29.02 13:49:08.684 IH: send { type: 'act',
      data: 
       [ { chan: 'T.Antizam.Ku',
           id: 'T.Antizam.Ku',
           vartype: 'int16',
           usek: false,
           ks: 100,
           ks0: 0,
           gr: false,
           pollp: true,
           value: -200,
           desc: 'AO',
           kh0: 0,
           address: '1321',
           fcr: '3',
           useactions: false,
           kh: 100,
           nofb: false,
           unitid: 1,
           calc_outfn: [Function: anonymous],
           command: 'set' } ] }
    29.02 13:49:08.687 modbus1: Command to send: [ { chan: 'T.Antizam.Ku',
        id: 'T.Antizam.Ku',
        vartype: 'int16be',
        usek: false,
        ks: 100,
        ks0: 0,
        gr: false,
        pollp: true,
        value: -200,
        desc: 'AO',
        kh0: 0,
        address: 1321,
        fcr: '3',
        useactions: false,
        kh: 100,
        nofb: false,
        unitid: 1,
        command: 'set' },
      64,
      65,
      66,
      67,
      68,
      69,
      70,
      71 ]
    29.02 13:49:08.839 modbus1: WRITE: unitId = 1, FC = 6, address = 1321 (0x529), value = -200
    29.02 13:49:08.839 modbus1: writeSingleRegister: address = 1321 (0x529), value = -200
    29.02 13:49:08.841 modbus1: ERROR: TypeError: "value" argument is out of bounds
        at checkInt (buffer.js:1176:11)
        at Buffer.writeUInt16BE (buffer.js:1245:5)
        at ModbusRTU.writeFC6 (/var/lib/intrahouse-c/plugins/modbus/node_modules/modbus-serial/index.js:607:9)
        at /var/lib/intrahouse-c/plugins/modbus/node_modules/modbus-serial/apis/promise.js:48:31
        at new Promise (<anonymous>)
        at ModbusRTU.converted [as writeRegister] (/var/lib/intrahouse-c/plugins/modbus/node_modules/modbus-serial/apis/promise.js:39:27)
        at Object.modbusWriteCommand (/var/lib/intrahouse-c/plugins/modbus/app.js:345:36)
        at Object.write (/var/lib/intrahouse-c/plugins/modbus/app.js:302:28)
        at Object.sendNext (/var/lib/intrahouse-c/plugins/modbus/app.js:379:18)
        at Object.read (/var/lib/intrahouse-c/plugins/modbus/app.js:248:18)
    29.02 13:49:08.842 modbus1: Write result: undefined
    


  • @Erik
    Спасибо за тестирование, действительно, есть проблема с записью отрицательных целых значений в библиотеке modbus-serial.
    В новой версии библиотеки эта проблема исправлена. Проверим у себя и на следующей неделе выпустим новый релиз плагина



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


  • Есть ли возможность сделать сценарий, стартующий при загрузке IH ( некий аналог RunOnce) ? Иногда бывает нужно "привести в порядок" контролируемые устройства после внезапной перезагрузки сервера.


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