Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. Скрипты
  5. ioBroker скрипты
  6. Видимость переменных. И еще пара вопросов.

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.9k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.3k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.5k

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

Scheduled Pinned Locked Moved ioBroker скрипты
12 Posts 4 Posters 3.1k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • X Offline
    X Offline
    XAPuTOH
    wrote on last edited by
    #1

    1. В общем столкнулся с неожиданным.

    Пишу скрипт:

    var i = 1;
    
    exec('какая нибудь команда', function(err,stdout,stderr){
    	log(i);
    	i = stdout;
    })
    
    log (i);
    
    

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

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

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

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

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

    Вопрос - что это состояние означает?

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

    А если скрипт просто выполняет некий набор действий. без подписки. Какое у него должно быть состояние? Просто когда я делаю его запущеным он выполняется как минимум один раз чего мне совершенно не надо.

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

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

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

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

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

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

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

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

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

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

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

    3. вопрос можно ли запустить скрипт из другого скрипта и получить от него ответ? т.е. использовать другой скрипт как функцию?

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

    Пока все ))))

    1 Reply Last reply
    0
    • I Offline
      I Offline
      instalator
      wrote on last edited by
      #2

      > Выясняется что внутри 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. Логика работы со скриптами

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

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

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

      Высокий уровень Децибел вреден для здоровья!

      http://blog.instalator.ru/

      1 Reply Last reply
      0
      • X Offline
        X Offline
        XAPuTOH
        wrote on last edited by
        #3

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

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

        1 Reply Last reply
        0
        • X Offline
          X Offline
          XAPuTOH
          wrote on last edited by
          #4

          @instalator:

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

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

          1 Reply Last reply
          0
          • I Offline
            I Offline
            instalator
            wrote on last edited by
            #5

            @XAPuTOH:

            @instalator:

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

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

            Высокий уровень Децибел вреден для здоровья!

            http://blog.instalator.ru/

            1 Reply Last reply
            0
            • I Offline
              I Offline
              instalator
              wrote on last edited by
              #6

              @XAPuTOH:

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

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

              Высокий уровень Децибел вреден для здоровья!

              http://blog.instalator.ru/

              1 Reply Last reply
              0
              • X Offline
                X Offline
                XAPuTOH
                wrote on last edited by
                #7

                @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
                0
                • I Offline
                  I Offline
                  instalator
                  wrote on last edited by
                  #8

                  @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('выключаем котел');
                              }
                      }
                  }
                  

                  Высокий уровень Децибел вреден для здоровья!

                  http://blog.instalator.ru/

                  1 Reply Last reply
                  0
                  • X Offline
                    X Offline
                    XAPuTOH
                    wrote on last edited by
                    #9

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

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

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

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

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

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

                    1 Reply Last reply
                    0
                    • I Offline
                      I Offline
                      instalator
                      wrote on last edited by
                      #10

                      @XAPuTOH:

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

                      Высокий уровень Децибел вреден для здоровья!

                      http://blog.instalator.ru/

                      1 Reply Last reply
                      0
                      • H Offline
                        H Offline
                        Haba
                        wrote on last edited by
                        #11

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

                        1 Reply Last reply
                        0
                        • A Offline
                          A Offline
                          adelec12
                          wrote on last edited by
                          #12

                          @XAPuTOH:

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

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

                          1 Reply Last reply
                          0
                          Reply
                          • Reply as topic
                          Log in to reply
                          • Oldest to Newest
                          • Newest to Oldest
                          • Most Votes


                          Support us

                          ioBroker
                          Community Adapters
                          Donate

                          790

                          Online

                          32.5k

                          Users

                          81.6k

                          Topics

                          1.3m

                          Posts
                          Community
                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                          ioBroker Community 2014-2025
                          logo
                          • Login

                          • Don't have an account? Register

                          • Login or register to search.
                          • First post
                            Last post
                          0
                          • Home
                          • Recent
                          • Tags
                          • Unread 0
                          • Categories
                          • Unreplied
                          • Popular
                          • GitHub
                          • Docu
                          • Hilfe