Navigation

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

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Трех-кратное выполнение кода скрипта

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

      Добрый день.

      Есть код:

      ! ````
      on({id: "megad.3.p9_G0_Boiler_Control2"/G0_Boiler_Control2 - Размыкатель ТТ котла/, change: 'any'}, function (obj) {
      if (getState("megad.3.p9_G0_Boiler_Control2").val === false) { // если котел запущен
      setState("den.0.Отопление.ТТ_Котел.Время_до_запуска",0);
      time_start_stamp = new Date(getState("megad.3.p9_G0_Boiler_Control2").ts);
      var time_start = ('0' + time_start_stamp.getHours()).slice(-2) + ':' + ('0' + time_start_stamp.getMinutes()).slice(-2);
      setState("den.0.Отопление.ТТ_Котел.Время_последнего_запуска",time_start);
      log ('ТТ Котел запущен в ' + getState("den.0.Отопление.ТТ_Котел.Время_последнего_запуска").val);
      sendTo("telegram.0", "send", {
      text: 'ТТ Котел запущен в '+ time_start
      })
      }
      else { // иначе если котел остановлен
      setState("den.0.Отопление.ТТ_Котел.Время_до_останова",0);
      time_stop_stamp = new Date(getState("megad.3.p9_G0_Boiler_Control2").ts);
      var time_stop = ('0' + time_stop_stamp.getHours()).slice(-2) + ':' + ('0' + time_stop_stamp.getMinutes()).slice(-2);
      setState("den.0.Отопление.ТТ_Котел.Время_последнего_останова",time_stop);
      log ('ТТ Котел остановлен в ' + getState("den.0.Отопление.ТТ_Котел.Время_последнего_останова").val);
      sendTo("telegram.0", "send", {
      text: 'ТТ Котел остановлен в '+ time_stop
      })
      }
      });

      
      Он рабочий, НО не понимаю почему драйвер Telegram присылает по три сообщения о включении или выключении котла.
      
      В остальных скриптах, сообщения приходят по одному, без повторения. А здесь…
      
      При этом не важно изменяется статус переменной megad.3.p9_G0_Boiler_Control2 (вручную нажатием кнопки в VIS или из скрипта по условию).
      
      Подскажите в какую сторону посмотреть?
      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        А так? Два срабатывания я могу объяснить. А вот три

        on({id: "megad.3.p9_G0_Boiler_Control2"/*G0_Boiler_Control2 - Размыкатель ТТ котла*/, change: 'any', ack: false}, function (obj) {    
            if (obj.state.val === false) { // если котел запущен
                setState("den.0.Отопление.ТТ_Котел.Время_до_запуска",0);
                time_start_stamp = new Date(getState("megad.3.p9_G0_Boiler_Control2").ts);
                var time_start = ('0' + time_start_stamp.getHours()).slice(-2) + ':' + ('0' + time_start_stamp.getMinutes()).slice(-2);
                setState("den.0.Отопление.ТТ_Котел.Время_последнего_запуска",time_start);
                log ('ТТ Котел запущен в ' + getState("den.0.Отопление.ТТ_Котел.Время_последнего_запуска").val);
                sendTo("telegram.0", "send", {
                    text: 'ТТ Котел запущен в  '+ time_start
                })
            }
            else {                                                          // иначе если котел остановлен
                setState("den.0.Отопление.ТТ_Котел.Время_до_останова",0);
                time_stop_stamp = new Date(getState("megad.3.p9_G0_Boiler_Control2").ts);
                var time_stop = ('0' + time_stop_stamp.getHours()).slice(-2) + ':' + ('0' + time_stop_stamp.getMinutes()).slice(-2);
                setState("den.0.Отопление.ТТ_Котел.Время_последнего_останова",time_stop);
                log ('ТТ Котел остановлен в ' + getState("den.0.Отопление.ТТ_Котел.Время_последнего_останова").val);
                sendTo("telegram.0", "send", {
                    text: 'ТТ Котел остановлен в  '+ time_stop
                }) 
            }
        });
        
        
        1 Reply Last reply Reply Quote 0
        • I
          instalator last edited by

          @evgeny_nd:

          Добрый день.

          Есть код:

          ! ````
          on({id: "megad.3.p9_G0_Boiler_Control2"/G0_Boiler_Control2 - Размыкатель ТТ котла/, change: 'any'}, function (obj) {
          if (getState("megad.3.p9_G0_Boiler_Control2").val === false) { // если котел запущен
          setState("den.0.Отопление.ТТ_Котел.Время_до_запуска",0);
          time_start_stamp = new Date(getState("megad.3.p9_G0_Boiler_Control2").ts);
          var time_start = ('0' + time_start_stamp.getHours()).slice(-2) + ':' + ('0' + time_start_stamp.getMinutes()).slice(-2);
          setState("den.0.Отопление.ТТ_Котел.Время_последнего_запуска",time_start);
          log ('ТТ Котел запущен в ' + getState("den.0.Отопление.ТТ_Котел.Время_последнего_запуска").val);
          sendTo("telegram.0", "send", {
          text: 'ТТ Котел запущен в '+ time_start
          })
          }
          else { // иначе если котел остановлен
          setState("den.0.Отопление.ТТ_Котел.Время_до_останова",0);
          time_stop_stamp = new Date(getState("megad.3.p9_G0_Boiler_Control2").ts);
          var time_stop = ('0' + time_stop_stamp.getHours()).slice(-2) + ':' + ('0' + time_stop_stamp.getMinutes()).slice(-2);
          setState("den.0.Отопление.ТТ_Котел.Время_последнего_останова",time_stop);
          log ('ТТ Котел остановлен в ' + getState("den.0.Отопление.ТТ_Котел.Время_последнего_останова").val);
          sendTo("telegram.0", "send", {
          text: 'ТТ Котел остановлен в '+ time_stop
          })
          }
          });

          
          Он рабочий, НО не понимаю почему драйвер Telegram присылает по три сообщения о включении или выключении котла.
          
          В остальных скриптах, сообщения приходят по одному, без повторения. А здесь…
          
          При этом не важно изменяется статус переменной megad.3.p9_G0_Boiler_Control2 (вручную нажатием кнопки в VIS или из скрипта по условию).
          
          Подскажите в какую сторону посмотреть? `  
          

          На будущее оформляйте код на форуме в тег CODE и под спойлер.

          Вот так что выдает в логе?

          ! ````
          on({id: "megad.3.p9_G0_Boiler_Control2"/G0_Boiler_Control2 - Размыкатель ТТ котла/, change: 'any'}, function (obj) {
          log ('megad.3.p9_G0_Boiler_Control2 = ' + obj.state.val);
          if (obj.state.val === false) { // если котел запущен
          setState("den.0.Отопление.ТТ_Котел.Время_до_запуска", 0);
          var time_start_stamp = new Date(obj.state.ts);
          var time_start = ('0' + time_start_stamp.getHours()).slice(-2) + ':' + ('0' + time_start_stamp.getMinutes()).slice(-2);
          setState("den.0.Отопление.ТТ_Котел.Время_последнего_запуска",time_start);
          log ('ТТ Котел запущен в ' + getState("den.0.Отопление.ТТ_Котел.Время_последнего_запуска").val);
          sendTo("telegram.0", "send", {
          text: 'ТТ Котел запущен в '+ time_start
          });
          }
          else { // иначе если котел остановлен
          setState("den.0.Отопление.ТТ_Котел.Время_до_останова",0);
          var time_stop_stamp = new Date(obj.state.ts);
          var time_stop = ('0' + time_stop_stamp.getHours()).slice(-2) + ':' + ('0' + time_stop_stamp.getMinutes()).slice(-2);
          setState("den.0.Отопление.ТТ_Котел.Время_последнего_останова", time_stop);
          log ('ТТ Котел остановлен в ' + getState("den.0.Отопление.ТТ_Котел.Время_последнего_останова").val);
          sendTo("telegram.0", "send", {
          text: 'ТТ Котел остановлен в '+ time_stop
          });
          }
          });

          1 Reply Last reply Reply Quote 0
          • E
            evgeny_nd last edited by

            @Bluefox:

            А так? Два срабатывания я могу объяснить. А вот три

            on({id: "megad.3.p9_G0_Boiler_Control2"/*G0_Boiler_Control2 - Размыкатель ТТ котла*/, change: 'any', ack: false}, function (obj) {    
            
            ```` `  
            

            Bluefox, спасибо, добавление ", ack: false" помогло. Сообщение приходят по одному. А можете объяснить назначение этого флага, либо дать ссылку где вообще подробнее почитать описание используемого языка. Потому что сейчас весь процесс обучения происходит по аналогии с увиденным, а хотелось бы так чтобы понимать основы и все возможности :).

            To Instalator, в части написания сообщений с кодом, учту.

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

              @evgeny_nd:

              Bluefox, спасибо, добавление ", ack: false" помогло. Сообщение приходят по одному. А можете объяснить назначение этого флага, либо дать ссылку где вообще подробнее почитать описание используемого языка. Потому что сейчас весь процесс обучения происходит по аналогии с увиденным, а хотелось бы так чтобы понимать основы и все возможности :).

              To Instalator, в части написания сообщений с кодом, учту. ` аск это подтверждение. Если проверишь и проанализируешь оба предложенных варианта то скорее всего поймёшь в чём проблема

              1 Reply Last reply Reply Quote 0
              • E
                evgeny_nd last edited by

                @instalator:

                @evgeny_nd:

                Bluefox, спасибо, добавление ", ack: false" помогло. Сообщение приходят по одному. А можете объяснить назначение этого флага, либо дать ссылку где вообще подробнее почитать описание используемого языка. Потому что сейчас весь процесс обучения происходит по аналогии с увиденным, а хотелось бы так чтобы понимать основы и все возможности :).

                To Instalator, в части написания сообщений с кодом, учту. аск это подтверждение. Если проверишь и проанализируешь оба предложенных варианта то скорее всего поймёшь в чём проблема

                Подтверждение в смысле дополнительное условие, т.е. подтверждение того что подписка срабатывает только тогда когда ее изменение переходят в значение которое указано после "ack"?

                А второй вопрос, как правильнее должен быть устроен код? Мой или ваш, в котором проверяется не сама переменная внутри подписки, а статус ответа, который отдает подписка?

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

                  @evgeny_nd:

                  @instalator:

                  @evgeny_nd:

                  Bluefox, спасибо, добавление ", ack: false" помогло. Сообщение приходят по одному. А можете объяснить назначение этого флага, либо дать ссылку где вообще подробнее почитать описание используемого языка. Потому что сейчас весь процесс обучения происходит по аналогии с увиденным, а хотелось бы так чтобы понимать основы и все возможности :).

                  To Instalator, в части написания сообщений с кодом, учту. аск это подтверждение. Если проверишь и проанализируешь оба предложенных варианта то скорее всего поймёшь в чём проблема

                  Подтверждение в смысле дополнительное условие, т.е. подтверждение того что подписка срабатывает только тогда когда ее изменение переходят в значение которое указано после "ack"?

                  А второй вопрос, как правильнее должен быть устроен код? Мой или ваш, в котором проверяется не сама переменная внутри подписки, а статус ответа, который отдает подписка? ` когда ты меняешь объект руками то аск будет фолс, а если в этот объект прилетит статус из драйвера то аск будет тру.

                  Мой. По подписке ты уже получаешь все данные в объекте obj. И не нужно получать их другими функциями например getState

                  1 Reply Last reply Reply Quote 0
                  • E
                    evgeny_nd last edited by

                    @instalator:

                    @evgeny_nd:

                    @instalator:

                    аск это подтверждение. Если проверишь и проанализируешь оба предложенных варианта то скорее всего поймёшь в чём проблема `

                    Подтверждение в смысле дополнительное условие, т.е. подтверждение того что подписка срабатывает только тогда когда ее изменение переходят в значение которое указано после "ack"?

                    А второй вопрос, как правильнее должен быть устроен код? Мой или ваш, в котором проверяется не сама переменная внутри подписки, а статус ответа, который отдает подписка? ` когда ты меняешь объект руками то аск будет фолс, а если в этот объект прилетит статус из драйвера то аск будет тру.

                    Мой. По подписке ты уже получаешь все данные в объекте obj. И не нужно получать их другими функциями например getState `

                    Теперь все понял. Спасибо.

                    Кстати сейчас с вариантом Bluefox, сообщение приходят по одному разу. И в случае ручного включения, и в случае изменения по условию из другого скрипта.

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

                    Support us

                    ioBroker
                    Community Adapters
                    Donate

                    926
                    Online

                    31.6k
                    Users

                    79.6k
                    Topics

                    1.3m
                    Posts

                    3
                    8
                    2309
                    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