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.
    • P
      Pooh last edited by

      Попытался вникнуть в настройки http://www.iobroker.net/docu/?page_id=3550&lang=de счетчика. Знаний немецкого явно не хватает, гугл преподносит чушь какую-то…

      просьба владеющим немецким перевести этот (возможно я ошибся со скиптом, тогда другой универсальный) на русский

      спасибо!

      сейчас счетчик электричества аппаратно сделан так: импульсный выход счетчика заведен на Mega2561. скрипт набросал такой:

      createState('PowerMeter_count_summ',0);
      createState('PowerMeter_count_day',0);
      createState('PowerMeter_count_night',0);
      createState('PowerMeter_KWH_summ',0);
      createState('PowerMeter_KWH_DAY',0);
      createState('PowerMeter_KWH_NIGHT',0);
      createState('PowerMeter_WATT_current',0);
      
      var watt = null;
      var lastValue = null;
      var newBlink = null;
      var lastBlink = (new Date().getTime());
      var interval = null;
      var powerPulseFactor = 2000;
      var ppwh = powerPulseFactor / 1000;
      
      on("megadd.0.p35_P35_counter", function (obj) {
          if (compareTime("07:00", "23:00", "between")) {
              // initialisation
              if (lastValue === null) {
              lastValue = obj.state.val;
              return;
              }
      
              // Megadd have been restarted
              if (lastValue > obj.state.val) {
              setState('PowerMeter_count_day', getState('PowerMeter_count_day').val + obj.state.val, true);
              } else if (obj.state.val != lastValue) {
              setState('PowerMeter_count_day', getState('PowerMeter_count_day').val + (obj.state.val - lastValue), true);
              } else {
              return;
              }
      
          } else {
              // initialisation
              if (lastValue === null) {
              lastValue = obj.state.val;
              return;
              }
      
              // Megadd have been restarted
              if (lastValue > obj.state.val) {
              setState('PowerMeter_count_night', getState('PowerMeter_count_night').val + obj.state.val, true);
              } else if (obj.state.val != lastValue) {
              setState('PowerMeter_count_night', getState('PowerMeter_count_night').val + (obj.state.val - lastValue), true);
              } else {
              return;
              }
      
          }
      
          setTimeout(function() {
              setState('PowerMeter_count_summ', ((getState('PowerMeter_count_day').val) + (getState('PowerMeter_count_night').val)), true);
          }, 15);   //без этой задержки берется предыдущее значение!
          lastValue = obj.state.val;
      
          setState('PowerMeter_KWH_summ', (getState('PowerMeter_count_summ').val / powerPulseFactor), true);
          setState('PowerMeter_KWH_DAY', (getState('PowerMeter_count_day').val / powerPulseFactor), true);
          setState('PowerMeter_KWH_NIGHT', (getState('PowerMeter_count_night').val / powerPulseFactor), true);
      
          newBlink = (new Date().getTime());
          interval = newBlink - lastBlink;
      
          watt = (3600000 / interval) / ppwh;
          setState('PowerMeter_WATT_current', Math.round(watt), true);
      
          lastBlink = newBlink;
      
      });
      
      

      плз, покритикуйке мой говнокод, посоветуйте как его оптимизировать…

      1 Reply Last reply Reply Quote 0
      • P
        Pooh last edited by

        Мой код настолько ужасен, что не хочется его комментировать?

        Или он настолько хорош, что нечего добавить?

        Меня смущает введение задержки, вот этот кусок:

        setTimeout(function() {
                setState('PowerMeter_count_summ', ((getState('PowerMeter_count_day').val) + (getState('PowerMeter_count_night').val)), true);
        }, 15);   //без этой задержки берется предыдущее значение!
        
        

        может быть можно изящнее сделать?

        еще не нравится расчет временного интервала между импульсами и подсчет "мгновенного" потребления:

            newBlink = (new Date().getTime());
            interval = newBlink - lastBlink;
            watt = (3600000 / interval) / ppwh;
            setState('PowerMeter_WATT_current', Math.round(watt), true);
            lastBlink = newBlink;
        
        
        1 Reply Last reply Reply Quote 0
        • I
          instalator last edited by

          @Pooh:

          Мой код настолько ужасен, что не хочется его комментировать?

          Или он настолько хорош, что нечего добавить?

          Меня смущает введение задержки, вот этот кусок:

          setTimeout(function() {
                  setState('PowerMeter_count_summ', ((getState('PowerMeter_count_day').val) + (getState('PowerMeter_count_night').val)), true);
          }, 15);   //без этой задержки берется предыдущее значение!
           
          

          может быть можно изящнее сделать?

          еще не нравится расчет временного интервала между импульсами и подсчет "мгновенного" потребления:

              newBlink = (new Date().getTime());
              interval = newBlink - lastBlink;
              watt = (3600000 / interval) / ppwh;
              setState('PowerMeter_WATT_current', Math.round(watt), true);
              lastBlink = newBlink;
          
          ```` `  
          

          Это игрушки

          1 Reply Last reply Reply Quote 0
          • P
            Pooh last edited by

            @instalator:

            ..Это игрушки `
            Вся наша жизнь - игра…

            но хотелось бы услышать конкретную критику и советы по скрипту (железо определено, дополнительную ардуину чисто на счетчики ставить не планирую)

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

              @Pooh:

              Мой код настолько ужасен, что не хочется его комментировать?

              Или он настолько хорош, что нечего добавить?

              Меня смущает введение задержки, вот этот кусок:

              setTimeout(function() {
                      setState('PowerMeter_count_summ', ((getState('PowerMeter_count_day').val) + (getState('PowerMeter_count_night').val)), true);
              }, 15);   //без этой задержки берется предыдущее значение!
               
              

              может быть можно изящнее сделать?

              еще не нравится расчет временного интервала между импульсами и подсчет "мгновенного" потребления:

                  newBlink = (new Date().getTime());
                  interval = newBlink - lastBlink;
                  watt = (3600000 / interval) / ppwh;
                  setState('PowerMeter_WATT_current', Math.round(watt), true);
                  lastBlink = newBlink;
              
              ```` `  можно изящнее, вместо задержки подписаться на изменение
              

              PowerMeter_count_day и PowerMeter_count_night. А чем интервал не нравится?

              1 Reply Last reply Reply Quote 0
              • P
                Pooh last edited by

                @instalator:

                можно изящнее, вместо задержки подписаться на изменение

                PowerMeter_count_day и PowerMeter_count_night. `
                спасибо, попробую
                @instalator:

                А чем интервал не нравится? `
                для электросчетчика пойдет ибо он всегда тикает, для водяных счетчиков надо что-то другое, т.к. в основном они "молчат" и "мгновенное" потребление превращается в "последнее измеренное"

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

                  @Pooh:

                  @instalator:

                  можно изящнее, вместо задержки подписаться на изменение

                  PowerMeter_count_day и PowerMeter_count_night. `
                  спасибо, попробую
                  @instalator:

                  А чем интервал не нравится? для электросчетчика пойдет ибо он всегда тикает, для водяных счетчиков надо что-то другое, т.к. в основном они "молчат" и "мгновенное" потребление превращается в "последнее измеренное" так а как для воды рассчитать мгновенное если один импульс это 10 литров в среднем? Да и нужно ли оно для воды.

                  1 Reply Last reply Reply Quote 0
                  • P
                    Pooh last edited by

                    первое что приходит - просто по расписанию запускать тот кусок с интервалом и проверять счетчик, если не изменился - обнулять "мгновенное потребление"

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

                      @Pooh:

                      первое что приходит - просто по расписанию запускать тот кусок с интервалом и проверять счетчик, если не изменился - обнулять "мгновенное потребление" `
                      А проще по-моему просто ловить изменение счётчика (импульс) это и будет означать что вот вот утек стакан воды

                      1 Reply Last reply Reply Quote 0
                      • P
                        Pooh last edited by

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

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

                          @Pooh:

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

                          1 Reply Last reply Reply Quote 0
                          • R
                            radon last edited by

                            Счётчик воды работает конечно импульсно, но! У него контакт замыкается каждые 10 литров, при этом если вы в это время воду прекратили расходовать, он будет замкнут и постоянно включён!

                            Так как у меня контроллер Wago и, по сути, вся логика на нём, то счётчики воды реализованы через Функциональный блок 'инкрементный счетчик' (CTU), а уже от него передаются в ioBroker/

                            1 Reply Last reply Reply Quote 0
                            • P
                              Pooh last edited by

                              @radon:

                              ..он будет замкнут и постоянно включён!.. `
                              ну и что, я-то подписываюсь на изменение значения счетчика, на не состояние порта..

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

                              Support us

                              ioBroker
                              Community Adapters
                              Donate

                              597
                              Online

                              31.7k
                              Users

                              79.7k
                              Topics

                              1.3m
                              Posts

                              3
                              13
                              2794
                              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