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

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    18
    1
    784

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    18
    1
    6.2k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.5k

Скрипт многотарифного подсчёта эл.энергии

Scheduled Pinned Locked Moved ioBroker скрипты
10 Posts 5 Posters 3.3k 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.
  • S Offline
    S Offline
    Sergey777
    wrote on last edited by
    #1

    Сейчас у многих установлены многотарифные счётчики. Их суть в том, что они считают кроме общего потребления электроэнергии ещё и отдельно потребление за определённые часы в сутки. Например с 00:00 до 07:00 электроэнергия стоит, образно, 3р. С 07:00 до 10:00 7р, и т.д… Это сделано чтобы ̶э̶н̶е̶р̶г̶о̶с̶б̶ы̶т̶о̶в̶ы̶е̶ ̶м̶о̶н̶о̶п̶о̶л̶и̶с̶т̶ы̶ ̶м̶о̶г̶л̶и̶ ̶з̶а̶р̶а̶б̶а̶т̶ы̶в̶а̶т̶ь̶ ̶б̶о̶л̶ь̶ш̶е̶ ̶б̶а̶б̶л̶а̶ люди потребляли электричество тогда, когда дёшево. В свою очередь дешевле когда спрос меньше. Но я не об этом..

    Для учёта эл.энергии можно снимать данные с коммерческого прибора учёта, который уже есть. Но нельзя. Потому что не разрешают. Можно купить точно такой же, поставить после, и извращаться с ним как хочешь, но это не удобно, и вот почему:

    1. Такие счётчики стоят дорого, а если мы хотим отслеживать потребление нескольких групп, то их нужно несколько.

    2. Такие счётчики крупные. Я не нашёл ни одного маленького многотарифного счётчика, чтоб на одно din место, например как SDM120. А значит для установки многотарифных счётчиков нужно много места и огромные щиты.

    Выходом вижу использование SDM120 + скрипты.

    А теперь к сути поста:

    Нужен скрипт, который мог бы снимать показания из счётчика в строго заданное время, и потом делать пересчёты по временным интервалам. Например в 00:00 скрипт снимает показание текущего суммарного потребления, пусть это будет 2222кВтч. Затем снимает строго в 07:00, пусть это будет 2242. И тут скрипт делает подсчёт, что по тарифу №1 с 00:00 по 07:00 потрачено 20кВтч энергии, и так как мы знаем стоимость энергии в этот промежуток времени, скрипт высчитывает сумму в рублях. Далее по остальным тарифам.

    Как итог должна отображаться таблица по суточно, по месячно и по годам с потребленной энергией по тарифам и с суммой в деньгах.

    P.S. Сам не осилю такую хотелку. Может у кого тоже есть интерес, или уже готовые наработки. Или может оно и так есть в функционале, просто я не увидел? Готов сотрудничать, возможно могу заплатить умеренную сумму, но об этом только в личку.

    1 Reply Last reply
    0
    • P Offline
      P Offline
      Pooh
      wrote on last edited by
      #2

      @Sergey777:

      Для учёта эл.энергии можно снимать данные с коммерческого прибора учёта, который уже есть. Но нельзя. Потому что не разрешают.. `
      Можно фотодиодом считать моргания на счетчике (мой моргает 2000 раз за 1 квт, powerPulseFactor):

      createState('Power.Count_SUMM',0);
      createState('Power.Count_DAY',0);
      createState('Power.Count_NIGHT',0);
      createState('Power.WATT_Current',0);
      createState('Power.KWH_SUMM',0);
      createState('Power.KWH_DAY',0);
      createState('Power.KWH_NIGHT',0);
      
      createState('Power.KWH_DAY_Old',0);
      createState('Power.KWH_NIGHT_Old',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;
      //var date = new Date();
      
      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("javascript.0.Power.Count_DAY", getState("javascript.0.Power.Count_DAY").val + obj.state.val, true);
              } else if (obj.state.val != lastValue) {
                  setState("javascript.0.Power.Count_DAY", getState("javascript.0.Power.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);
                  setState("javascript.0.Power.Count_NIGHT", getState("javascript.0.Power.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);
                  setState("javascript.0.Power.Count_NIGHT", getState("javascript.0.Power.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);
              setState("javascript.0.Power.Count_SUMM", ((getState("javascript.0.Power.Count_DAY").val) + (getState("javascript.0.Power.Count_NIGHT").val)), true);
          }, 30);   //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
      
          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);
      
          setState("javascript.0.Power.KWH_SUMM", (getState("javascript.0.Power.Count_SUMM").val / powerPulseFactor), true);
          setState("javascript.0.Power.KWH_DAY", (getState("javascript.0.Power.Count_DAY").val / powerPulseFactor), true);
          setState("javascript.0.Power.KWH_NIGHT", (getState("javascript.0.Power.Count_NIGHT").val / powerPulseFactor), true);
      
          newBlink = (new Date().getTime());
          //log(newBlink);
          interval = newBlink - lastBlink;
          //log(interval);
      
          watt = (3600000 / interval) / ppwh;
      
          //setTimeout(function() {
          //setState('PowerMeter_WATT_current', Math.round((3600000 / interval) / ppwh), true);
          //}, 50); 
          //setState('PowerMeter_WATT_current', Math.round(watt), true);
          setState("javascript.0.Power.WATT_Current", Math.round(watt), true);
      
          lastBlink = newBlink;
      
      });
      
      

      https://play.google.com/store/apps/details?id=com.roy.royclub - код: UMI201155
      https://play.google.com/store/apps/details?id=com.blockchainvault - код приглашения: Freepooh
      https://play.google.com/store/apps/details?id=games.bee.app - код приглашения: freepooh
      https://www.timestope.com/freepooh - witness code: freepooh

      1 Reply Last reply
      0
      • S Offline
        S Offline
        Sergey777
        wrote on last edited by
        #3

        @Pooh:

        Можно фотодиодом считать моргания на счетчике (мой моргает 2000 раз за 1 квт, powerPulseFactor): `
        Можно. Но так мы из счётчика получим только Активную энегрию. Мой же счётчик отслеживает 11 параметров. Все, конечно не нужны, но только одним параметром не ограничиться. Ваш скрипт учитывает время. Этот скрипт куда нужно добавить, в скрипты? Или это от чего код?

        1 Reply Last reply
        0
        • P Offline
          P Offline
          Pooh
          wrote on last edited by
          #4

          Просто создаете новый скрипт и запускаете

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

          https://play.google.com/store/apps/details?id=com.roy.royclub - код: UMI201155
          https://play.google.com/store/apps/details?id=com.blockchainvault - код приглашения: Freepooh
          https://play.google.com/store/apps/details?id=games.bee.app - код приглашения: freepooh
          https://www.timestope.com/freepooh - witness code: freepooh

          1 Reply Last reply
          0
          • A Offline
            A Offline
            Adav
            wrote on last edited by
            #5

            Возникла такая же задача. Написал скрипт, который выдает в реальном времени тарифные значения. Без проблем отрабатывает сбои внутри тарифного интервала. В случае сбоя на границе тарифа - сделана аппроксимация с распределением потребленной за время сбоя энергии между соседними тарифами пропорционально времени сбоя до/после времени переключения тарифа. По возможности оттестировано, но возможны ньюансы… время тарификации у меня свое - особенности настройки счетчика энергосбыта.

            createState("javascript.0.Values.Energy_total", 0,{name: "Потребление электроэнергии", unit: "кВт⋅ч", type: "number"});
            
            createState("javascript.0.Energy.Night", 0,{name: "Потребление электроэнергии тариф ночь", unit: "кВт⋅ч", type: "number"});
            createState("javascript.0.Energy.Peak", 0,{name: "Потребление электроэнергии тариф пик", unit: "кВт⋅ч", type: "number"});
            createState("javascript.0.Energy.Half_peak", 0,{name: "Потребление электроэнергии тариф полупик", unit: "кВт⋅ч", type: "number"});
            
            var kt;
            var total = "javascript.0.Values.Energy_total";
            var night = "javascript.0.Energy.Night";
            var peak = "javascript.0.Energy.Peak";
            var h_peak = "javascript.0.Energy.Half_peak";
            
            on({id: "modbus.3.inputRegisters.11.342_total_active_energy", change: "ne"}, function (obj) {
                if(getState(total).val === 0){
                   setState(total, obj.state.val, true); 
                }  
                if(compareTime("6:00", "9:00", "between")){                                 //сдвиг на час назад от принятого
                   if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "6:00") && obj.state.val - getState(total).val > 0.011){ 
                      kt = (new Date().setHours(6,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                      setState(night, Math.round(100 * (getState(night).val + kt * (obj.state.val - getState(total).val)))/100, true); 
                      setState(peak, Math.round(100 * (getState(peak).val + (1 - kt) * (obj.state.val - getState(total).val)))/100, true); 
                      sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения ночного и пикового тарифов.');
                   } else {
                      setState(peak, Math.round(100 * (getState(peak).val + obj.state.val - getState(total).val))/100, true); 
                   }    
                }   
                if(compareTime("9:00", "16:00", "between")){ 
                   if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "9:00") && obj.state.val - getState(total).val > 0.011){ 
                      kt = (new Date().setHours(9,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                      setState(peak, Math.round(100 * (getState(peak).val + kt * (obj.state.val - getState(total).val)))/100, true); 
                      setState(h_peak, Math.round(100 * (getState(h_peak).val + (1 - kt) * (obj.state.val - getState(total).val)))/100, true); 
                      sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения пикового и полупикового тарифов.');
                   } else {
                      setState(h_peak, Math.round(100 * (getState(h_peak).val + obj.state.val - getState(total).val))/100, true); 
                   }
                }    
                if(compareTime("16:00", "20:00", "between")){ 
                   if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "16:00") && obj.state.val - getState(total).val > 0.011){ 
                      kt = (new Date().setHours(16,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                      setState(h_peak, Math.round(100 * (getState(h_peak).val + kt * (obj.state.val - getState(total).val)))/100, true); 
                      setState(peak, Math.round(100 * (getState(peak).val + (1 - kt) * (obj.state.val - getState(total).val)))/100, true); 
                      sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения полупикового и пикового тарифов.');
                   } else {
                      setState(peak, Math.round(100 * (getState(peak).val + obj.state.val - getState(total).val))/100, true); 
                   }
                }   
                if(compareTime("20:00", "22:00", "between")){ 
                   if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "20:00") && obj.state.val - getState(total).val > 0.011){ 
                      kt = (new Date().setHours(20,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                      setState(peak, Math.round(100 * (getState(peak).val + kt * (obj.state.val - getState(total).val)))/100, true); 
                      setState(h_peak, Math.round(100 * (getState(h_peak).val + (1 - kt) * (obj.state.val - getState(total).val)))/100, true); 
                      sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения пикового и полупикового тарифов.');
                   } else {
                      setState(h_peak, Math.round(100 * (getState(h_peak).val + obj.state.val - getState(total).val))/100, true); 
                   }
                }   
                if(compareTime("22:00", "6:00", "between")){ 
                   if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "22:00") && obj.state.val - getState(total).val > 0.011){ 
                      kt = (new Date().setHours(22,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                      setState(h_peak, Math.round(100 * (getState(h_peak).val + kt * (obj.state.val - getState(total).val)))/100, true); 
                      setState(night, Math.round(100 * (getState(night).val + (1 - kt) * (obj.state.val - getState(total).val)))/100, true); 
                      sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения полупикового и ночного тарифов.');
                   } else {
                      setState(night, Math.round(100 * (getState(night).val + obj.state.val - getState(total).val))/100, true); 
                   }
                }   
            
                setState(total, obj.state.val, true);
            });
            
            
            1 Reply Last reply
            0
            • V Offline
              V Offline
              v965
              wrote on last edited by
              #6

              @Adav:

              Возникла такая же задача. Написал скрипт, который выдает в реальном времени тарифные значения. Без проблем отрабатывает сбои внутри тарифного интервала. В случае сбоя на границе тарифа - сделана аппроксимация с распределением потребленной за время сбоя энергии между соседними тарифами пропорционально времени сбоя до/после времени переключения тарифа. По возможности оттестировано, но возможны ньюансы… время тарификации у меня свое - особенности настройки счетчика энергосбыта.

              createState("javascript.0.Values.Energy_total", 0,{name: "Потребление электроэнергии", unit: "кВт⋅ч", type: "number"});
              
              createState("javascript.0.Energy.Night", 0,{name: "Потребление электроэнергии тариф ночь", unit: "кВт⋅ч", type: "number"});
              createState("javascript.0.Energy.Peak", 0,{name: "Потребление электроэнергии тариф пик", unit: "кВт⋅ч", type: "number"});
              createState("javascript.0.Energy.Half_peak", 0,{name: "Потребление электроэнергии тариф полупик", unit: "кВт⋅ч", type: "number"});
              
              var kt;
              var total = "javascript.0.Values.Energy_total";
              var night = "javascript.0.Energy.Night";
              var peak = "javascript.0.Energy.Peak";
              var h_peak = "javascript.0.Energy.Half_peak";
              
              on({id: "modbus.3.inputRegisters.11.342_total_active_energy", change: "ne"}, function (obj) {
                  if(getState(total).val === 0){
                     setState(total, obj.state.val, true); 
                  }  
                  if(compareTime("6:00", "9:00", "between")){                                 //сдвиг на час назад от принятого
                     if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "6:00") && obj.state.val - getState(total).val > 0.011){ 
                        kt = (new Date().setHours(6,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                        setState(night, Math.round(100 * (getState(night).val + kt * (obj.state.val - getState(total).val)))/100, true); 
                        setState(peak, Math.round(100 * (getState(peak).val + (1 - kt) * (obj.state.val - getState(total).val)))/100, true); 
                        sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения ночного и пикового тарифов.');
                     } else {
                        setState(peak, Math.round(100 * (getState(peak).val + obj.state.val - getState(total).val))/100, true); 
                     }    
                  }   
                  if(compareTime("9:00", "16:00", "between")){ 
                     if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "9:00") && obj.state.val - getState(total).val > 0.011){ 
                        kt = (new Date().setHours(9,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                        setState(peak, Math.round(100 * (getState(peak).val + kt * (obj.state.val - getState(total).val)))/100, true); 
                        setState(h_peak, Math.round(100 * (getState(h_peak).val + (1 - kt) * (obj.state.val - getState(total).val)))/100, true); 
                        sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения пикового и полупикового тарифов.');
                     } else {
                        setState(h_peak, Math.round(100 * (getState(h_peak).val + obj.state.val - getState(total).val))/100, true); 
                     }
                  }    
                  if(compareTime("16:00", "20:00", "between")){ 
                     if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "16:00") && obj.state.val - getState(total).val > 0.011){ 
                        kt = (new Date().setHours(16,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                        setState(h_peak, Math.round(100 * (getState(h_peak).val + kt * (obj.state.val - getState(total).val)))/100, true); 
                        setState(peak, Math.round(100 * (getState(peak).val + (1 - kt) * (obj.state.val - getState(total).val)))/100, true); 
                        sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения полупикового и пикового тарифов.');
                     } else {
                        setState(peak, Math.round(100 * (getState(peak).val + obj.state.val - getState(total).val))/100, true); 
                     }
                  }   
                  if(compareTime("20:00", "22:00", "between")){ 
                     if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "20:00") && obj.state.val - getState(total).val > 0.011){ 
                        kt = (new Date().setHours(20,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                        setState(peak, Math.round(100 * (getState(peak).val + kt * (obj.state.val - getState(total).val)))/100, true); 
                        setState(h_peak, Math.round(100 * (getState(h_peak).val + (1 - kt) * (obj.state.val - getState(total).val)))/100, true); 
                        sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения пикового и полупикового тарифов.');
                     } else {
                        setState(h_peak, Math.round(100 * (getState(h_peak).val + obj.state.val - getState(total).val))/100, true); 
                     }
                  }   
                  if(compareTime("22:00", "6:00", "between")){ 
                     if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "22:00") && obj.state.val - getState(total).val > 0.011){ 
                        kt = (new Date().setHours(22,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                        setState(h_peak, Math.round(100 * (getState(h_peak).val + kt * (obj.state.val - getState(total).val)))/100, true); 
                        setState(night, Math.round(100 * (getState(night).val + (1 - kt) * (obj.state.val - getState(total).val)))/100, true); 
                        sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения полупикового и ночного тарифов.');
                     } else {
                        setState(night, Math.round(100 * (getState(night).val + obj.state.val - getState(total).val))/100, true); 
                     }
                  }   
              
                  setState(total, obj.state.val, true);
              });
              
              ```` `  
              

              Как получить общее число киловатт за месяц из этого скрипта?

              В принципе пока двухтарифный счётчик не нужен но пусть будет на будущее.

              Очень нужно вывести информацию о потреблении общем за месяц например с 28 по 28 число.

              1 Reply Last reply
              0
              • O Offline
                O Offline
                OlegJktu
                wrote on last edited by
                #7

                если я правильно понмаю, то в скипт делает объект

                createState("javascript.0.Values.Energy_total", 0,{name: "Потребление электроэнергии", unit: "кВт⋅ч", type: "number"})

                Нужно настроить в iob сохранение состояние этого обьекта (history).

                И сделать скрипт на вычитание между месяцами.

                1 Reply Last reply
                0
                • V Offline
                  V Offline
                  v965
                  wrote on last edited by
                  #8

                  Сохранение этого параметра я сделал.

                  Нужен скрипт который сможет сделать остальное

                  1 Reply Last reply
                  0
                  • A Offline
                    A Offline
                    Adav
                    wrote on last edited by
                    #9

                    > Как получить общее число киловатт за месяц из этого скрипта?
                    Зачем? Счетчик как раз и дает общее число киловатт - сохраняйте его показание в базе и обрабатывайте. Я это делаю через grafana - вижу график общего потребления по месяцам. Скрипт же заточен под распределение этого показателя по тарифам. Возможно Вы хотите что-то иное…

                    Я скрипт немного расширил, посмотрите, может что-то полезное будет.

                    //---------------------------------Счетчик-----------------------------
                    createState("javascript.0.Values.Energy_total", 0,{name: "Потребление электроэнергии", unit: "кВт⋅ч", type: "number"});
                    createState("javascript.0.Energy.Night", 0,{name: "Потребление электроэнергии тариф ночь", unit: "кВт⋅ч", type: "number"});
                    createState("javascript.0.Energy.Peak", 0,{name: "Потребление электроэнергии тариф пик", unit: "кВт⋅ч", type: "number"});
                    createState("javascript.0.Energy.Half_peak", 0,{name: "Потребление электроэнергии тариф полупик", unit: "кВт⋅ч", type: "number"});
                    
                    createState("javascript.0.Energy.M_night", 0,{name: "Тариф ночь в текущем месяце", unit: "кВт⋅ч", type: "number"});
                    createState("javascript.0.Energy.M_рeak", 0,{name: "Тариф пик в текущем месяце", unit: "кВт⋅ч", type: "number"});
                    createState("javascript.0.Energy.M_half_peak", 0,{name: "Тариф полупик в текущем месяце", unit: "кВт⋅ч", type: "number"});
                    createState("javascript.0.Energy.M_money", 0,{name: "Стоимость в текущем месяце", unit: "руб", type: "number"});
                    createState("javascript.0.Energy.Mlast_money", 0,{name: "Стоимость в предыдущем месяце", unit: "руб", type: "number"});
                    
                    var total = "javascript.0.Values.Energy_total";
                    var night = "javascript.0.Energy.Night";
                    var peak = "javascript.0.Energy.Peak";
                    var h_peak = "javascript.0.Energy.Half_peak";
                    var delta;
                    var kt;
                    var money;
                    
                    on({id: "modbus.3.inputRegisters.11.342_total_active_energy", change: "ne"}, function (obj) {
                        if(getState(total).val === 0){
                           setState(total, obj.state.val, true); 
                        }  
                        delta = obj.state.val - getState(total).val;                                //разница двух показаний счетчика
                        if(compareTime("6:00", "9:00", "between")){                                 //сдвиг на час назад от принятого
                           if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "6:00") && delta > 0.011){ 
                              kt = (new Date().setHours(6,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                              setState(night, Math.round(100 * (getState(night).val + kt * delta))/100, true); 
                              setState(peak, Math.round(100 * (getState(peak).val + (1 - kt) * delta))/100, true); 
                              sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения ночного и пикового тарифов.');
                           } else {
                              setState(peak, Math.round(100 * (getState(peak).val + delta))/100, true); 
                           }    
                        }   
                        if(compareTime("9:00", "16:00", "between")){ 
                           if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "9:00") && delta > 0.011){ 
                              kt = (new Date().setHours(9,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                              setState(peak, Math.round(100 * (getState(peak).val + kt * delta))/100, true); 
                              setState(h_peak, Math.round(100 * (getState(h_peak).val + (1 - kt) * delta))/100, true); 
                              sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения пикового и полупикового тарифов.');
                           } else {
                              setState(h_peak, Math.round(100 * (getState(h_peak).val + delta))/100, true); 
                           }
                        }    
                        if(compareTime("16:00", "20:00", "between")){ 
                           if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "16:00") && delta > 0.011){ 
                              kt = (new Date().setHours(16,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                              setState(h_peak, Math.round(100 * (getState(h_peak).val + kt * delta))/100, true); 
                              setState(peak, Math.round(100 * (getState(peak).val + (1 - kt) * delta))/100, true); 
                              sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения полупикового и пикового тарифов.');
                           } else {
                              setState(peak, Math.round(100 * (getState(peak).val + delta))/100, true); 
                           }
                        }   
                        if(compareTime("20:00", "22:00", "between")){ 
                           if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "20:00") && delta > 0.011){ 
                              kt = (new Date().setHours(20,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                              setState(peak, Math.round(100 * (getState(peak).val + kt * delta))/100, true); 
                              setState(h_peak, Math.round(100 * (getState(h_peak).val + (1 - kt) * delta))/100, true); 
                              sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения пикового и полупикового тарифов.');
                           } else {
                              setState(h_peak, Math.round(100 * (getState(h_peak).val + delta))/100, true); 
                           }
                        }   
                        if(compareTime("22:00", "6:00", "between")){ 
                           if(compareTime(new Date(getState(total).lc).toLocaleTimeString(), new Date().toLocaleTimeString(), "between", "22:00") && delta > 0.011){ 
                              kt = (new Date().setHours(22,0,0,0) - getState(total).lc)/(Date.parse(new Date()) - getState(total).lc);
                              setState(h_peak, Math.round(100 * (getState(h_peak).val + kt * delta))/100, true); 
                              setState(night, Math.round(100 * (getState(night).val + (1 - kt) * delta))/100, true); 
                              sendTo('telegram.0', 'Произошел сбой счетчика ЭЭ. Желательно скорректировать значения полупикового и ночного тарифов.');
                           } else {
                              setState(night, Math.round(100 * (getState(night).val + delta))/100, true); 
                           }
                        }   
                    
                        setState(total, obj.state.val, true);
                    //------------------
                        if(getState("javascript.0.Energy.M_night").val === 0){
                           setState("javascript.0.Energy.M_night", getState(night).val, true); 
                        } 
                        if(getState("javascript.0.Energy.M_рeak").val === 0){
                           setState("javascript.0.Energy.M_рeak", getState(peak).val, true); 
                        }      
                        if(getState("javascript.0.Energy.M_half_peak").val === 0){
                           setState("javascript.0.Energy.M_half_peak", getState(h_peak).val, true);     
                        }      
                    
                        money = 1.92*(getState(night).val - getState("javascript.0.Energy.M_night").val) + 6.46*(getState(peak).val - getState("javascript.0.Energy.M_рeak").val) + 5.38*(getState(h_peak).val - getState("javascript.0.Energy.M_half_peak").val);
                        setState("javascript.0.Energy.M_money", Math.round(money), true);    
                    });
                    
                    schedule({date : 1, hour: 0, minute: 0}, function () {
                        setState("javascript.0.Energy.Mlast_money", getState("javascript.0.Energy.M_money").val, true);
                        setState("javascript.0.Energy.M_night", getState(night).val, true); 
                        setState("javascript.0.Energy.M_рeak", getState(peak).val, true);
                        setState("javascript.0.Energy.M_half_peak", getState(h_peak).val, true);
                    });    
                    
                    
                    1 Reply Last reply
                    0
                    • V Offline
                      V Offline
                      v965
                      wrote on last edited by
                      #10

                      @Adav:

                      > Как получить общее число киловатт за месяц из этого скрипта?
                      Зачем? Счетчик как раз и дает общее число киловатт - сохраняйте его показание в базе и обрабатывайте. Я это делаю через grafana - вижу график общего потребления по месяцам. Скрипт же заточен под распределение этого показателя по тарифам. Возможно Вы хотите что-то иное…

                      Я скрипт немного расширил, посмотрите, может что-то полезное будет.

                      Спасибо. `

                      1 Reply Last reply
                      0

                      Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                      Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                      With your input, this post could be even better 💗

                      Register Login
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      390

                      Online

                      32.8k

                      Users

                      82.7k

                      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