Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Русский
  3. ioBroker
  4. Скрипты
  5. ioBroker скрипты
  6. Скрипт многотарифного подсчёта эл.энергии

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    23
    1
    1.3k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.5k

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

Geplant Angeheftet Gesperrt Verschoben ioBroker скрипты
10 Beiträge 5 Kommentatoren 3.3k Aufrufe
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • S Offline
    S Offline
    Sergey777
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    0
    • P Offline
      P Offline
      Pooh
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      0
      • S Offline
        S Offline
        Sergey777
        schrieb am zuletzt editiert von
        #3

        @Pooh:

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

        1 Antwort Letzte Antwort
        0
        • P Offline
          P Offline
          Pooh
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          0
          • A Offline
            A Offline
            Adav
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            0
            • V Offline
              V Offline
              v965
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              0
              • O Offline
                O Offline
                OlegJktu
                schrieb am zuletzt editiert von
                #7

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

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

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

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

                1 Antwort Letzte Antwort
                0
                • V Offline
                  V Offline
                  v965
                  schrieb am zuletzt editiert von
                  #8

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

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

                  1 Antwort Letzte Antwort
                  0
                  • A Offline
                    A Offline
                    Adav
                    schrieb am zuletzt editiert von
                    #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 Antwort Letzte Antwort
                    0
                    • V Offline
                      V Offline
                      v965
                      schrieb am zuletzt editiert von
                      #10

                      @Adav:

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

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

                      Спасибо. `

                      1 Antwort Letzte Antwort
                      0
                      Antworten
                      • In einem neuen Thema antworten
                      Anmelden zum Antworten
                      • Älteste zuerst
                      • Neuste zuerst
                      • Meiste Stimmen


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      696

                      Online

                      32.5k

                      Benutzer

                      81.7k

                      Themen

                      1.3m

                      Beiträge
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Anmelden

                      • Du hast noch kein Konto? Registrieren

                      • Anmelden oder registrieren, um zu suchen
                      • Erster Beitrag
                        Letzter Beitrag
                      0
                      • Home
                      • Aktuell
                      • Tags
                      • Ungelesen 0
                      • Kategorien
                      • Unreplied
                      • Beliebt
                      • GitHub
                      • Docu
                      • Hilfe