NEWS
Скрипт многотарифного подсчёта эл.энергии
-
Сейчас у многих установлены многотарифные счётчики. Их суть в том, что они считают кроме общего потребления электроэнергии ещё и отдельно потребление за определённые часы в сутки. Например с 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. Сам не осилю такую хотелку. Может у кого тоже есть интерес, или уже готовые наработки. Или может оно и так есть в функционале, просто я не увидел? Готов сотрудничать, возможно могу заплатить умеренную сумму, но об этом только в личку.
-
Для учёта эл.энергии можно снимать данные с коммерческого прибора учёта, который уже есть. Но нельзя. Потому что не разрешают.. `
Можно фотодиодом считать моргания на счетчике (мой моргает 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; });
-
Можно фотодиодом считать моргания на счетчике (мой моргает 2000 раз за 1 квт, powerPulseFactor): `
Можно. Но так мы из счётчика получим только Активную энегрию. Мой же счётчик отслеживает 11 параметров. Все, конечно не нужны, но только одним параметром не ограничиться. Ваш скрипт учитывает время. Этот скрипт куда нужно добавить, в скрипты? Или это от чего код? -
Просто создаете новый скрипт и запускаете
считает мгновенное потребление, дневное, ночное и общее. потом другой скрипт раз в месяц отправляет почтой показания всех счетчиков в управляющуюкомпанию
-
Возникла такая же задача. Написал скрипт, который выдает в реальном времени тарифные значения. Без проблем отрабатывает сбои внутри тарифного интервала. В случае сбоя на границе тарифа - сделана аппроксимация с распределением потребленной за время сбоя энергии между соседними тарифами пропорционально времени сбоя до/после времени переключения тарифа. По возможности оттестировано, но возможны ньюансы… время тарификации у меня свое - особенности настройки счетчика энергосбыта.
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); });
-
Возникла такая же задача. Написал скрипт, который выдает в реальном времени тарифные значения. Без проблем отрабатывает сбои внутри тарифного интервала. В случае сбоя на границе тарифа - сделана аппроксимация с распределением потребленной за время сбоя энергии между соседними тарифами пропорционально времени сбоя до/после времени переключения тарифа. По возможности оттестировано, но возможны ньюансы… время тарификации у меня свое - особенности настройки счетчика энергосбыта.
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 число.
-
если я правильно понмаю, то в скипт делает объект
createState("javascript.0.Values.Energy_total", 0,{name: "Потребление электроэнергии", unit: "кВт⋅ч", type: "number"})
Нужно настроить в iob сохранение состояние этого обьекта (history).
И сделать скрипт на вычитание между месяцами.
-
Сохранение этого параметра я сделал.
Нужен скрипт который сможет сделать остальное
-
> Как получить общее число киловатт за месяц из этого скрипта?
Зачем? Счетчик как раз и дает общее число киловатт - сохраняйте его показание в базе и обрабатывайте. Я это делаю через 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); });
-
> Как получить общее число киловатт за месяц из этого скрипта?
Зачем? Счетчик как раз и дает общее число киловатт - сохраняйте его показание в базе и обрабатывайте. Я это делаю через grafana - вижу график общего потребления по месяцам. Скрипт же заточен под распределение этого показателя по тарифам. Возможно Вы хотите что-то иное…Я скрипт немного расширил, посмотрите, может что-то полезное будет.
Спасибо. `