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.
    • X
      XAPuTOH last edited by

      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 Reply Quote 0
      • 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

                            814
                            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