Сценарии пользователей



  • Пользователь @dre12007 написал в Сценарии пользователей:

    Пользователь @Alex_Jet написал в Сценарии пользователей:

    @dre12007, ну если MegaD. То тут есть два более легких варианта:

    1. Открываем свойства канала, переходим на вкладку "Обработка" и в поле "Формула расчета входного значения" вписываем
    100 - (Number(value) - 20)*100/85
    
    1. То же, но на вкладке "Канал" включаем чек-боксом "Использовать функцию обработки при получении данных", а в ней вписываем:
    function (val)
    {  var result = ( 100 - (val - 20) *100/85 ).toFixed(2);
       
       return result; //Возвращаем значение
    }
    

    Таким образом, входные данные с датчика сразу "скорректируются" и у устройства будет отображаться нужное значение.

    А этот способ если сделать то не нужен actor получается?
    Просто рулет в виджет добавляю и он рисует нужный процент ?

    Понаблюдал, все работает но, если удалить эту строку 100 - (Number(value) - 20)*100/85
    С ней какие то неправильные цифры показывает
    В отладчике 3 значения
    1 Размер до обработки
    2 Обработанный правильный
    3 И какая то херь, которая выводится на экран
    Без этой строки все норм
    Спасибо за помощь



  • @dre12007, надеюсь вы сделали один из двух вариантов? Либо обработка входного значения, либо функция обработки! В конце-концов - покажите что отладчик лпагина показывает!



  • 29.07 14:50:19.735 megad2: localhost => 192.168.0.241 HTTP GET /drept=30&dev=sr04 echo=31 29.07 14:50:19.754 megad2: localhost <= 192.168.0.241 response: statusCode=200 contentType = text/html
    
    29.07 14:50:19.755 megad2: body: 52.83
    
    29.07 14:50:19.759 IH: get [ { id: 3031', value: '61.38' } ]
    
    set { roulette: { aval: 61.38, err: 0 } }
    


  • Пользователь @dre12007 написал в Сценарии пользователей:

    29.07 14:50:19.735 megad2: localhost => 192.168.0.241 HTTP GET /drept=30&dev=sr04 echo=31
    29.07 14:50:19.754 megad2: localhost <= 192.168.0.241 response: statusCode=200 contentType = text/html
    29.07 14:50:19.755 megad2: body: 52.83
    29.07 14:50:19.759 IH: get [ { id: 3031', value: '61.38' } ]
    set { roulette: { aval: 61.38, err: 0 } }
    

    А почему у Вас в отладчике запрос на MegaD выглядит так "/drept=30&dev=sr04 echo=31", а не так "/sec/?pt=30&dev=sr04&echo=31"???
    А если в принципе, то конечное значение получается правильным. Так какой вариант использовали - 1 ("Формула расчета входного значения") или 2 ("Функция обработки...")???



  • Функция обработки при получении данных



  • /dre/?pt=30 на самом деле выглядит так
    Просто гугл объектив так скопировал криво



  • Всем привет. Подскажите строки кода которые нужно добавить в сценарий, чтобы свет включался по датчика движения в заданное время. Кот ночью тоскается и включает свет! Сценарий из примеров на сайте. Спасибо.



  • @Sergeus, вставьте в конец сценария функцию:

      //Функция возвращает цифровое значение периода дня
      GetPeriodDay() {
        let date = new Date();
        let hour = date.getHours();
        let period = 0;
        
        if(hour > 6 && hour < 10)       period = 0; // Период 7-9
        else if(hour > 9 && hour < 20)  period = 1; // Период 10-19
        else if(hour > 19 && hour < 23) period = 2; // Период 20-22
        else                            period = 3; // Период 23-6
        
        return period;
      },
    

    А в start обращайтесь к ней так:

    if(this.GetPeriodDay() != 3) {
       //Тут выполняем то что нужно выполнять с утра и до самого вечера
    };
    

    Или еще проще просто в start:

    let date = new Date();
    
    if(date.getHours() > 7 || date.getHours() < 23) {
       //Тут выполняем то что нужно выполнять с утра и до самого вечера
    }
    


  • @Alex_Jet Первый вариант будет поинтересней. Спасибо!



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


  • Вам лучше чем нибудь гуманитарным заниматься. Катастрофами, например. 🙂

    Добрый день
    Подскажите пожалуйста?
    Когда рулет присылает значения 105 это значит 0%
    А когда больше 105 то ничего не присылает так как в устройстве стоит ограничение по минимальным и максимальным значениям 20 и 105
    Проблема в том что датчик не всегда присылает точные данные и бывают редко глюки и из за этого получается такая херь
    Воды 0% и даже меньше, датчик присылает один раз глючные данные, ну например что воды 5%
    А потом присылает нормальные данные, но так как воды уже меньше чем 105, эти данные не учитываются и всегда висит 5%
    Можно сделать так что бы 0% было когда датчик присылает 105 и больше? Ну и когда 20 и меньше это 100%

    Просто когда воды в баке остаётся меньше 2% у меня выключается насос повышающий давления, что бы он в холостую не работал и когда случается такой глюк он постоянно работает а воды нету



  • Пользователь @dre12007 написал в Сценарии пользователей:

    Можно сделать так что бы 0% было когда датчик присылает 105 и больше? Ну и когда 20 и меньше это 100%

    Добрый день. Да, можно:

    (value>=20 && value<= 105) ? Math.round(100 - (Number(value) - 20)*100/85) : (value <20 ? 100 : 0)
    

    Это тернарный оператор: условие ? значение_если_да : значение_если_нет

    • первая скобка - проверяем, что значение в диапазоне от 20 до 105 включительно
    • если да - выполняется расчет и округляется до целых (0-100 %)
    • если нет - сработает часть после двоеточия - второй тернарный оператор

    Если у вас прописана формула в канале, просто скопируйте ее
    Если в сценарии - нужно присвоить



  • @intrapro
    Спасибо огромнейшее



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



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

    Добрый день.
    В сценарии можно использовать метки и операторы перехода типа break и т.п. для перехода в нужную часть кода ?

    Добрый день, break и continue в цикле конечно работает, label в принципе должно работать, система использует стандартный движок JS.
    Мы не используем label, такой стиль не считается хорошей практикой: https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Statements/label

    mdn_label.png

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



  • У меня проблемка: в сценарии IH срабатівает 2 действия одновременно. Помогите разобратся:

    /** 
    * @name Виключення насоса тепла підлога 
    * @desc  
    * @version 4 
    */
    const water_pump = Device("water_pump_for_hot_water");
    const radiator8 = Device("RADIATOR8");
    const radiator9 = Device("RADIATOR9");
    const radiator10 = Device("RADIATOR10");
    
    startOnChange([radiator8,radiator9,radiator10]); 
    
    script({
        start() {
          // if(radiator10.isOn()){
          //   this.log('radiator10 is On');
          // }else{
          //   this.log('radiator10 is Off');
          // }
          if(radiator8.isOff()||radiator9.isOff()||radiator10.isOff()){
            this.log('start timer water_pump');
            this.startTimer("T1",300,"onTimerT1");
          }
          if(radiator8.isOn()&&radiator9.isOn()&&radiator10.isOn()){
            this.log('off water_pump');
            water_pump.turnOffSaveAuto();
          }
        },
        onTimerT1(){
          water_pump.turnOnSaveAuto();
        } 
    });
    
    

    alt text
    При открытии заслонки теплого пола в плашине MegaD продалает статус устройства, пришет "-". В сценарии у меня on это закрыто а off это открыто. 1 принимает коректно а 0 пишет "-"



  • @amgstone
    По логике вашего сценария у вас получается, что когда хотяб один клапан открыт, то включается таймер, а когда все клапаны закрыты, то насос выключается. Когда выключается насос, вам нужно добавить еще выключение таймера, иначе у вас насос включиться когда все клапаны уже закрыты. Команда на выключение this.stopTimer(‘T1’). Добавьте ее после this.log('off water_pump');



  • Пользователь @goodspeed1986 написал в Сценарии пользователей:

    this.stopTimer(‘T1’)

    /** 
    * @name Виключення насоса тепла підлога 
    * @desc  
    * @version 4 
    */
    const water_pump = Device("water_pump_for_hot_water");
    const radiator8 = Device("RADIATOR8");
    const radiator9 = Device("RADIATOR9");
    const radiator10 = Device("RADIATOR10");
    
    startOnChange([radiator8,radiator9,radiator10]); 
    
    script({
        start() {
          // if(radiator10.isOn()){
          //   this.log('radiator10 is On');
          // }else{
          //   this.log('radiator10 is Off');
          // }
          if(radiator8.isOff()||radiator9.isOff()||radiator10.isOff()){
            this.log('start timer water_pump');
            this.startTimer("T1",300,"onTimerT1");
          }
          if(radiator8.isOn()&&radiator9.isOn()&&radiator10.isOn()){
            this.log('off water_pump');
            this.stopTimer(‘T1’);
            water_pump.turnOffSaveAuto();
          }
        },
        onTimerT1(){
          water_pump.turnOnSaveAuto();
        } 
    });
    

    Выдает ошибку: http://joxi.ru/82Q4bdkuwknbKm



  • @amgstone а то что значение с канала выдает "-" сможете поправить баг. На другом объекте у меня такая же проблема.
    Поправил: this.stopTimer("T1"); ошибка ушла но насос дальше не выключает после етого как все сервопривода закрыты (On).


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