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



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

    Не в эту ветку, но спрошу, по умолчанию IH действует от имени пользователя ROOT ?
    root@ih-server-big:/opt/intrahouse-c#
    Можно ли под другим пользователем "по умолчанию" ?

    Да, конечно, Вы можете создать своего пользователя и делать установку под ним. Но нужно дать ему достаточно прав для доступа:

    1. К папкам внутри /opt и /var/lib
    2. К периферии и портам, с которыми работает система
    3. Этот пользователь должен иметь права на sudo.
      Запуск из-под sudo используется при установке пакетов через npm, так как IH ставит пакеты при установке плагинов и их обновлении прозрачно для пользователя. Используемая версия npm требует такой доступ. Возможно, в 5 версии использование sudo получится избежать.


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


  • Добрый день. Как с помощью блок схем задать гистерезис включения отключения насоса ГВС? Прошу прощения если это уже обсуждалось.



  • Добрый день, коллеги. У меня сценарий получает данные от плагина через param и obj. При приходе запроса track=hello&artist=yellow&album=hits устройствам (актуатор аналоговый) присваиваются значения hello, yellow и hits соответственно. А при приходе запроса track=hello&artist=&album= устройствам присваивается hello, 0 (ноль) и 0 (ноль) соответственно. Как в сценарии определить отсутствие параметра и присвоить устройству вместо ноля символ пробела или пустую строку?



  • @int144, никак! Я пробовал по разному, но пробел, отсутствие символа и т.д. актуатору аналоговому присвоить нельзя. В своем "событийном" виджете при отсутствии событий просто отображаю "Нет событий".



  • @Alex_Jet, спасибо, понял. Жаль, конечно. А как выяснить, что пустой параметр - if(obj.artist === undefined)?



  • @int144, да, именно так.



  • @Alex_Jet, я так сделал, а в отладчике
    01.06 19:57:45.696 assign PIHALL_TRACK5_5.value= Радио 7
    01.06 19:57:45.696 assign PIHALL_ALBUM4_5.value=
    01.06 19:57:45.696 assign PIHALL_ARTIST3_5.value=
    undefined почему-то не срабатывает



  • @Alex_Jet, сработало только на if(obj.artist === "")



  • Добрый день! Поскажите, в чем может быть проблема:
    Команда включает порт 5 (pin=5) на 5 сек (click=5) на ESP 8266/

    http://192.168.0.41/gpio?st=1&pin=5&click=5
    

    Если посылать эту команду через Chrome, то все отрабытывает пормально (порт включается и выключается через 5 сек), но если вызывать из сценария

    require ("http").get(`http://192.168.0.41/gpio?st=1&pin=5&click=5 `);
    

    то порт остается включенным. Такое впечатление, что click=5 не отсылается. Как посмотреть в отлатчике, что там отсылается? У меня не видно отправляемую команду.



  • @gis Добрый день.
    Попробуйте убрать последний пробел

    require ("http").get(`http://192.168.0.41/gpio?st=1&pin=5&click=5 `); // После 5 есть пробел
    require ("http").get(`http://192.168.0.41/gpio?st=1&pin=5&click=5`); 
    


  • @intrapro спасибо, но я уже пробовал и сним и без него - разницы нет. Поставил пробел, думал последний символ не передается.



  • Подскажите пожалуйста как установить значение даты замены фильтра в рекуператоре. Нужно чтобы не забивать когда был поменян фильтр и когда следующий раз менять чтобы IH сам сообщал что нужно заменить фильтр. Актуально для фильтров рекуператора, фильтра воды.....



  • Коллеги, вероятно где-то туплю. Переписал работающий сценарий, вынеся гистерезис в дополнительные параметры устройства чтобы можно было из вебки изменять все уставки. Однако система жалуется (co2_guest Device params: Unexpected token / in JSON at position 4), что в сценарии есть ошибка. Не могу понять в чем дело!

    const valve1F   = Device("VALVE_AIR3");     //Клапан первого этажа
    const hum_guest = Device("SHUMIDITY1_01", [ //Датчик влажности гостевой
      {"name":"hst", "note":"Гистерезис, %", "type":"number", "val":5}
      ]);
    const co2_guest = Device("SENSORA1_01", [   //Датчик CO2 гостевой
      {"name":"hst", "note":"Гистерезис, ppm", "type":"number", "val":100}
      ]);
    
    script({
        check() {
          return(   (hum_guest.value > hum_guest.setpoint + hum_guest.getParam("hst") || co2_guest.value > co2_guest.setpoint + co2_guest.getParam("hst"))&&(valve1F.isOff()) ||
                    (hum_guest.value < hum_guest.setpoint - hum_guest.getParam("hst") && co2_guest.value < co2_guest.setpoint - co2_guest.getParam("hst"))&&(valve1F.isOn()) );
        },
        
        start() {
          if(valve1F.isOff()) valve1F.on();
          else valve1F.off();
        }
    });
    


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

    Коллеги, вероятно где-то туплю.

    Такое ощущение, что виновными оказались комментарии внутри []...

    Ну а что не так с этим???

    const sensor_hum  = Device("SensorA", "Датчик влажности", [
      {"name":"hst", "note":"Гистерезис (для управления), %", "type":"number", "val":"5"}
      ]);
    

    В ошибке - sensor_hum Device params: Unexpected end of JSON input



  • @Alex_Jet, да, Вы правы, проблема именно в комментариях.
    В декларативной части сценария (выше script) код не выполняется движком JS, а парсится системой.
    Массив дополнительных параметров рассматривается как единый JSON объект. А внутри JSON-а комментарии не разрешены 😞



  • @intrapro, а что не так тут:???

    const sensor_hum  = Device("SensorA", "Датчик влажности", [
      {"name":"hist", "note":"Гистерезис (для управления), %", "type":"number", "val":5}
      ]);
    

    В ошибке - Unexpected end of JSON input
    Я уже перепробовал кучу всего и не могу понять где есть загвоздка!!!
    Вот на такое же ведь не ругается!!!:

    const dt          = Device("SensorA", "Датчик температуры в зоне актюатора ТП", [
      {"name":"hist", "note":"Гистерезис включения/отключения актюатора, °C", "type":"number", "val":2}
      ]);
    


  • @Alex_Jet, скобочки в значениях ломают парсинг.
    Так будет работать:

     "note":"Гистерезис для управления, %"
    


  • @intrapro, вопрос на 100$))). Вопрос методом гугления отпал сам собой... Только если ответите по поводу оптимальности такого кода)
    В сценарий забил свойства своих камеры в виде литералов чтобы при постановке дома на охрану перебрать их в цикле и сформировать для каждой команду включения motion_detection. Получилось так:

      //Функция включения/выключения режима охраны у камер видеонаблюдения
          CamerasSecurity(md_state) {
            //Список IP камер
            const camera1 = {ip:"192.168.11.11", login:"admin", password:"admin"};
            const camera2 = {ip:"192.168.11.12", login:"admin", password:"admin"};
            let obj = Object.assign([], [camera1, camera2]);
            
            //Преобразование On/Off -> 0/1
            if(md_state == "On") md_state = 1;
            else if(md_state == "Off") md_state = 0;
            
            //Цикл для перебора всех камер
            for(var i = 0; i < obj.length; i++) {
              let command = "http://" +obj[i].login+ ":" +obj[i].password+ "@" +obj[i].ip;
              
              //enable = 0/1 (Disable/Enable Motion Detection of Zone 1: "name=1")
              command += "/web/cgi-bin/hi3510/param.cgi?cmd=setmdattr&-name=1&-enable=" +md_state;
              
              //Отправка команды плагину HTTP
              this.SendCommandToHTTP(command);
            }
          },
        }
    

    PS: А можно в сценарии каким-нибудь образом брать данные по камерам из плагина? И да - у плагина CCTV будет древовидная структура в 5-й версии iH?



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

    Только если ответите по поводу оптимальности такого кода)

    Код на мой взгляд хороший, с литералами работа происходит быстро.
    Это всегда дилемма - универсальность или скорость/простота.

    Если по синтаксису - массив можно заполнить проще:

       const obj = []; // Объявляем пустой массив obj. push добавляет элементы-объекты
       obj.push({ip:"192.168.11.11", login:"admin", password:"admin"});
       obj.push({ip:"192.168.11.12", login:"admin", password:"admin"});
    

    А можно в сценарии каким-нибудь образом брать данные по камерам из плагина?

    Нет, в Cherry такой возможности нет

    И да - у плагина CCTV будет древовидная структура в 5-й версии iH?

    Да, в V5 деревья будут почти везде 🙂


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