Скрипт счетчика

Вопросы и информация о скриптах для ioBroker
Antworten
Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

Скрипт счетчика

Beitrag von Pooh » 27.06.2017, 20:09

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

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

Code: Alles auswählen

createState('PowerMeter_count_summ',0);
createState('PowerMeter_count_day',0);
createState('PowerMeter_count_night',0);
createState('PowerMeter_KWH_summ',0);
createState('PowerMeter_KWH_DAY',0);
createState('PowerMeter_KWH_NIGHT',0);
createState('PowerMeter_WATT_current',0);

var watt = null;
var lastValue = null;
var newBlink = null;
var lastBlink = (new Date().getTime());
var interval = null;
var powerPulseFactor = 2000;
var ppwh = powerPulseFactor / 1000;

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

    lastBlink = newBlink;
    
});

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

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von Pooh » 28.06.2017, 14:36

Мой код настолько ужасен, что не хочется его комментировать?
Или он настолько хорош, что нечего добавить?
Меня смущает введение задержки, вот этот кусок:

Code: Alles auswählen

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

Code: Alles auswählen

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

Benutzeravatar
instalator
guru
Beiträge: 1258
Registriert: 09.11.2014, 16:50
Wohnort: Барнаул
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von instalator » 28.06.2017, 15:05

Pooh hat geschrieben:Мой код настолько ужасен, что не хочется его комментировать?
Или он настолько хорош, что нечего добавить?
Меня смущает введение задержки, вот этот кусок:

Code: Alles auswählen

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

Code: Alles auswählen

    newBlink = (new Date().getTime());
    interval = newBlink - lastBlink;
    watt = (3600000 / interval) / ppwh;
    setState('PowerMeter_WATT_current', Math.round(watt), true);
    lastBlink = newBlink;
Это игрушки
Высокий уровень Децибел вреден для здоровья!
Мой блог

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von Pooh » 28.06.2017, 15:35

instalator hat geschrieben:..Это игрушки
Вся наша жизнь - игра...
но хотелось бы услышать конкретную критику и советы по скрипту (железо определено, дополнительную ардуину чисто на счетчики ставить не планирую)

Benutzeravatar
instalator
guru
Beiträge: 1258
Registriert: 09.11.2014, 16:50
Wohnort: Барнаул
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von instalator » 28.06.2017, 18:12

Pooh hat geschrieben:Мой код настолько ужасен, что не хочется его комментировать?
Или он настолько хорош, что нечего добавить?
Меня смущает введение задержки, вот этот кусок:

Code: Alles auswählen

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

Code: Alles auswählen

    newBlink = (new Date().getTime());
    interval = newBlink - lastBlink;
    watt = (3600000 / interval) / ppwh;
    setState('PowerMeter_WATT_current', Math.round(watt), true);
    lastBlink = newBlink;
можно изящнее, вместо задержки подписаться на изменение
PowerMeter_count_day и PowerMeter_count_night. А чем интервал не нравится?
Высокий уровень Децибел вреден для здоровья!
Мой блог

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von Pooh » 29.06.2017, 08:51

instalator hat geschrieben:можно изящнее, вместо задержки подписаться на изменение
PowerMeter_count_day и PowerMeter_count_night.
спасибо, попробую
instalator hat geschrieben:А чем интервал не нравится?
для электросчетчика пойдет ибо он всегда тикает, для водяных счетчиков надо что-то другое, т.к. в основном они "молчат" и "мгновенное" потребление превращается в "последнее измеренное"

Benutzeravatar
instalator
guru
Beiträge: 1258
Registriert: 09.11.2014, 16:50
Wohnort: Барнаул
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von instalator » 29.06.2017, 09:01

Pooh hat geschrieben:
instalator hat geschrieben:можно изящнее, вместо задержки подписаться на изменение
PowerMeter_count_day и PowerMeter_count_night.
спасибо, попробую
instalator hat geschrieben:А чем интервал не нравится?
для электросчетчика пойдет ибо он всегда тикает, для водяных счетчиков надо что-то другое, т.к. в основном они "молчат" и "мгновенное" потребление превращается в "последнее измеренное"
так а как для воды рассчитать мгновенное если один импульс это 10 литров в среднем? Да и нужно ли оно для воды.
Высокий уровень Децибел вреден для здоровья!
Мой блог

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von Pooh » 29.06.2017, 09:05

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

Benutzeravatar
instalator
guru
Beiträge: 1258
Registriert: 09.11.2014, 16:50
Wohnort: Барнаул
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von instalator » 29.06.2017, 09:21

Pooh hat geschrieben:первое что приходит - просто по расписанию запускать тот кусок с интервалом и проверять счетчик, если не изменился - обнулять "мгновенное потребление"
А проще по-моему просто ловить изменение счётчика (импульс) это и будет означать что вот вот утек стакан воды
Высокий уровень Децибел вреден для здоровья!
Мой блог

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von Pooh » 29.06.2017, 10:44

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

Benutzeravatar
instalator
guru
Beiträge: 1258
Registriert: 09.11.2014, 16:50
Wohnort: Барнаул
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von instalator » 29.06.2017, 10:49

Pooh hat geschrieben:а как зафиксировать, что кран закрыли и импульсов в ближайшее время не предвидится?
Рассчитать максимальное время между импульсами при минимальном потоке воды и через это время обнулять значение якобы мгновенного расхода. Либо делить его на это время
Высокий уровень Децибел вреден для здоровья!
Мой блог

radon
starter
Beiträge: 22
Registriert: 21.11.2016, 14:58

Re: Скрипт счетчика

Beitrag von radon » 26.07.2017, 21:10

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

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

Pooh
professional
Beiträge: 125
Registriert: 11.05.2017, 05:15
Wohnort: Самара
Kontaktdaten:

Re: Скрипт счетчика

Beitrag von Pooh » 27.07.2017, 09:44

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

Antworten