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.
    • S
      Sergey777 last edited by

      Сейчас у многих установлены многотарифные счётчики. Их суть в том, что они считают кроме общего потребления электроэнергии ещё и отдельно потребление за определённые часы в сутки. Например с 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 Reply Quote 0
      • P
        Pooh last edited by

        @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;
        
        });
        
        
        1 Reply Last reply Reply Quote 0
        • S
          Sergey777 last edited by

          @Pooh:

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

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

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

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

            1 Reply Last reply Reply Quote 0
            • A
              Adav last edited by

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

              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 Reply Quote 0
              • V
                v965 last edited by

                @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 Reply Quote 0
                • O
                  OlegJktu last edited by

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

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

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

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

                  1 Reply Last reply Reply Quote 0
                  • V
                    v965 last edited by

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

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

                    1 Reply Last reply Reply Quote 0
                    • A
                      Adav last edited by

                      > Как получить общее число киловатт за месяц из этого скрипта?
                      Зачем? Счетчик как раз и дает общее число киловатт - сохраняйте его показание в базе и обрабатывайте. Я это делаю через 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 Reply Quote 0
                      • V
                        v965 last edited by

                        @Adav:

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

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

                        Спасибо. `

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        740
                        Online

                        31.7k
                        Users

                        79.6k
                        Topics

                        1.3m
                        Posts

                        5
                        10
                        2896
                        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