Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. Скрипты
    5. ioBroker скрипты
    6. Видимость переменных. И еще пара вопросов.

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Видимость переменных. И еще пара вопросов.

    This topic has been deleted. Only users with topic management privileges can see it.
    • I
      instalator last edited by

      > Выясняется что внутри exec переменная i видна. Но если её изменить то изменения будут только внутри exec. снаружи она останется без изменений она видна и там и там, в не exec выводится быстрее просто
      ` > 1. В общем столкнулся с неожиданным.

      Пишу скрипт:

      Код:

      var i = 1;

      exec('какая нибудь команда', function(err,stdout,stderr){

      log(i);

      i = stdout;

      })

      log (i);

      Выясняется что внутри exec переменная i видна. Но если её изменить то изменения будут только внутри exec. снаружи она останется без изменений.

      Это правильно? Вроде в чистом js все должно меняться если я отдельно внутри exec не объявил переменную с аналогичным именем.

      2. Логика работы со скриптами

      Написал я некий скрипт.

      Есть он у меня в дереве скриптов. и есть у него состояние - запущен или остановлен.

      Вопрос - что это состояние означает? ` кнопка означает выполнять скрипт или нет. Если отключено то код в скрипте не будет работать

      1 Reply Last reply Reply Quote 0
      • X
        XAPuTOH last edited by

        Т.е. exec выполняется асинхронно. Соответственно нельзя строить скрипт таким образом как я сперва задумал, а нужно строить на колбэках.

        Сперва exec. внутри него основной скрипт. а если exec несколько. то каждый последующий нужно запускать в колбэке предидущего?

        1 Reply Last reply Reply Quote 0
        • X
          XAPuTOH last edited by

          @instalator:

          кнопка означает выполнять скрипт или нет. Если отключено то код в скрипте не будет работать `

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

          1 Reply Last reply Reply Quote 0
          • I
            instalator last edited by

            @XAPuTOH:

            @instalator:

            кнопка означает выполнять скрипт или нет. Если отключено то код в скрипте не будет работать `

            Т.е. я должен сделать скрипт запущенным. Соответственно он один раз в момент запуска отработает. А потом из другого скрипта я смогу его запускать? ` зачем его запускать если он уже запущен? Опиши алгоритм что хочешь сделать, буду дома отпишуст

            1 Reply Last reply Reply Quote 0
            • I
              instalator last edited by

              @XAPuTOH:

              Т.е. exec выполняется асинхронно. Соответственно нельзя строить скрипт таким образом как я сперва задумал, а нужно строить на колбэках.

              Сперва exec. внутри него основной скрипт. а если exec несколько. то каждый последующий нужно запускать в колбэке предидущего? `
              Не только exec, все асинхронно. Мысли в правильную сторону, через колбеки

              1 Reply Last reply Reply Quote 0
              • X
                XAPuTOH last edited by

                @XAPuTOH:

                Хотя может я не правильно понял идиологию?

                У меня есть некий набор действий который нужно выполнить в двух случаях:

                1. По расписанию

                2. По запросу пользователя.

                Я предположил что можно написать скрипт "Набор действий" выполнения этих действий. далее пишу ещё два скрипта:

                1. По расписанию раз в 20 минут выполнять "Набор действий"

                2. В случае нажатия на кнопку выполнить "Набор действий"

                Вроде как запуск скрипта возможен - runScript/startScript

                Я использовал startScript. и он почемуто не сработал т.е. сперва я неправильно вводил название скрипта и были ошибки. но когда ввел правильно ничего не произошло.

                Как такую задачу выполнять?

                Есть вариант подписать скрипт на какуюнибудь переменную а других скриптах менять её. Но как то нелогично мне это. `

                Ну вот. Т.е. хочется использовать скрипт как функцию. Т.е. это заданный набор действий который нужно производить при возникновении разных условий(запрос пользователя/расписание и т.п.). Скрипт этот анализирует несколько состояний и делает вывод о том какие набор действий ему произвести.

                Конкретно мой случай:

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

                Скрипт в зависимости от этих данных управляет котлом.

                Режимы работы отопление:

                1. Выключено. тут все понятно

                2. Включено. Тут просто включается котел и жарит на все пироги.

                3. Поддержка минимальной температуры. Тут вводится зависимость от температуры и времени. Система отопления на основе теплого пола. соответственно инертна. Настройки такие. с 7 утра до 23 вечера включать котел если температура упала ниже 5 градусов. с 23 до 7 утра включать если температура меньше 10. Сейчас этот режим. как правило за день температура падает на 2-3 градуса и становится равной 8. в 23 котел включается и прогревает помещение до 10 градусов и отключается. Т.е. работает ночью по ночному дешевому тарифу. Задача чтоб дом не замерз пока в нем никого нету

                4. Поддержка нормальной температуры. Тоже что и пункт 3 только уставки 15 днем и 25 ночью соответственно. При желании приехать в дом - заранее включаю этот режим и дом к приезду должен прогреться.

                Все это описано в скрипте. Режим работы - объект enum с соответствующими состояниями

                Сейчас скрипт работает по расписанию. каждые 15 минут проверяет состояния и делает выводы включить или отключить котел. Можно было бы повесить на изменение температуры. но как то котел не включился из за того что скрипт почемуто пропустил запуск по расписанию. И у меня возникла мысль что лучше он переодически будет проверять состояние системы и делать выводы. чем пропустит какоето событе и не выполнит их.

                Так как у меня пока сложности с доступом к админке из инета я настроил управление режимами через телеграм. посылаю команду на изменение режима. Т.е. решил я в выхи приехать в теплый дом - посылаю команду включить нормальный режим отопления.

                И хочу видет реакцию на эту команду сразу а не через 15 минут после команды. соответственно помимо выполнения по расписанию нужно еще и по событию запускать этот скрипт.

                Как то так. 🙂

                1 Reply Last reply Reply Quote 0
                • I
                  instalator last edited by

                  @XAPuTOH:

                  @XAPuTOH:

                  Хотя может я не правильно понял идиологию?

                  У меня есть некий набор действий который нужно выполнить в двух случаях:

                  1. По расписанию

                  2. По запросу пользователя.

                  Я предположил что можно написать скрипт "Набор действий" выполнения этих действий. далее пишу ещё два скрипта:

                  1. По расписанию раз в 20 минут выполнять "Набор действий"

                  2. В случае нажатия на кнопку выполнить "Набор действий"

                  Вроде как запуск скрипта возможен - runScript/startScript

                  Я использовал startScript. и он почемуто не сработал т.е. сперва я неправильно вводил название скрипта и были ошибки. но когда ввел правильно ничего не произошло.

                  Как такую задачу выполнять?

                  Есть вариант подписать скрипт на какуюнибудь переменную а других скриптах менять её. Но как то нелогично мне это. `

                  Ну вот. Т.е. хочется использовать скрипт как функцию. Т.е. это заданный набор действий который нужно производить при возникновении разных условий(запрос пользователя/расписание и т.п.). Скрипт этот анализирует несколько состояний и делает вывод о том какие набор действий ему произвести.

                  Конкретно мой случай:

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

                  Скрипт в зависимости от этих данных управляет котлом.

                  Режимы работы отопление:

                  1. Выключено. тут все понятно

                  2. Включено. Тут просто включается котел и жарит на все пироги.

                  3. Поддержка минимальной температуры. Тут вводится зависимость от температуры и времени. Система отопления на основе теплого пола. соответственно инертна. Настройки такие. с 7 утра до 23 вечера включать котел если температура упала ниже 5 градусов. с 23 до 7 утра включать если температура меньше 10. Сейчас этот режим. как правило за день температура падает на 2-3 градуса и становится равной 8. в 23 котел включается и прогревает помещение до 10 градусов и отключается. Т.е. работает ночью по ночному дешевому тарифу. Задача чтоб дом не замерз пока в нем никого нету

                  4. Поддержка нормальной температуры. Тоже что и пункт 3 только уставки 15 днем и 25 ночью соответственно. При желании приехать в дом - заранее включаю этот режим и дом к приезду должен прогреться.

                  Все это описано в скрипте. Режим работы - объект enum с соответствующими состояниями

                  Сейчас скрипт работает по расписанию. каждые 15 минут проверяет состояния и делает выводы включить или отключить котел. Можно было бы повесить на изменение температуры. но как то котел не включился из за того что скрипт почемуто пропустил запуск по расписанию. И у меня возникла мысль что лучше он переодически будет проверять состояние системы и делать выводы. чем пропустит какоето событе и не выполнит их.

                  Так как у меня пока сложности с доступом к админке из инета я настроил управление режимами через телеграм. посылаю команду на изменение режима. Т.е. решил я в выхи приехать в теплый дом - посылаю команду включить нормальный режим отопления.

                  И хочу видет реакцию на эту команду сразу а не через 15 минут после команды. соответственно помимо выполнения по расписанию нужно еще и по событию запускать этот скрипт.

                  Как то так. 🙂 `
                  Я бы сделал что то подобное, это не рабочий вариант это как один из вариантов

                  createState('Climat.mode', '');
                  
                  on({id: 'температура', change: 'ne'}, function (obj) {
                      Otoplenie();
                  });
                  on({id: 'Climat.mode', change: 'any'}, function (obj) {
                      if (obj.newState.val){
                         Otoplenie();
                      }
                  });
                  
                  function Otoplenie(){
                      var RealTemp = parseFloat(getState('RealTemp').val).toFixed(2);
                      var SetTemp = parseFloat(getState('SetTemp').val).toFixed(2);
                      var Mode = getState('Climat.mode').val;
                  
                      var newDate = (new Date()).getTime();
                      var date = new Date();
                      var day = date.getDay(); // 0-воскр. 6-суббота
                      var hour = date.getHours();
                      var min = (date.getMinutes()<10?'0':'') + date.getMinutes();
                  
                      if(Mode === 'OFF'){
                         log('отопление отключено');
                      } else if (Mode === 'ON'){
                              log('включаем котел');
                      } else if (Mode === 'NORM'){
                              if (hour >= 8 && hour <= 18){
                                  SetTemp = 15;
                              } else {
                                  SetTemp = 25;
                              }
                              if (RealTemp > SetTemp){
                                  log('выключаем котел');
                              }
                              if (RealTemp < SetTemp){
                                  log('включаем котел');
                              }
                        } else if (Mode === 'AUTO'){
                              if (hour > 7 && hour < 23 && RealTemp < 5){
                                  log('включаем котел');
                              } else if (hour > 23 && hour < 7 && RealTemp < 10){
                                  log('включаем котел');
                              } else {
                                  log('выключаем котел');
                              }
                      }
                  }
                  
                  1 Reply Last reply Reply Quote 0
                  • X
                    XAPuTOH last edited by

                    Вот что значит отсутствие опыта!

                    Не думал что в одном скрипте можно несколько подписок сделать!

                    А функция у меня примерно такая же. ))

                    Все таки идеология следующая - скрипты используются для выполнения набора действий по подписке?

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

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

                    1 Reply Last reply Reply Quote 0
                    • I
                      instalator last edited by

                      @XAPuTOH:

                      Все таки идеология следующая - скрипты используются для выполнения набора действий по подписке? `
                      Не только, можно сделать по крону

                      1 Reply Last reply Reply Quote 0
                      • H
                        Haba last edited by

                        У меня пока так реализована обратная связь через телеграм
                        1160_______1.jpg

                        1 Reply Last reply Reply Quote 0
                        • A
                          adelec12 last edited by

                          @XAPuTOH:

                          Т.е. exec выполняется асинхронно. Соответственно нельзя строить скрипт таким образом как я сперва задумал, а нужно строить на колбэках.

                          Сперва exec. внутри него основной скрипт. а если exec несколько http://www.comparateur-dependance-senior.com. то каждый последующий нужно запускать в колбэке предидущего? `
                          Довольно сложно это понятие, но для лучшего понимания требуется небольшое упражнение.

                          1 Reply Last reply Reply Quote 0
                          • First post
                            Last post

                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          899
                          Online

                          31.8k
                          Users

                          80.0k
                          Topics

                          1.3m
                          Posts

                          4
                          12
                          2867
                          Loading More Posts
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes
                          Reply
                          • Reply as topic
                          Log in to reply
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                          The ioBroker Community 2014-2023
                          logo