NEWS
Скрипт счетчика
-
Попытался вникнуть в настройки http://www.iobroker.net/docu/?page_id=3550&lang=de счетчика. Знаний немецкого явно не хватает, гугл преподносит чушь какую-то…
просьба владеющим немецким перевести этот (возможно я ошибся со скиптом, тогда другой универсальный) на русский
спасибо!
сейчас счетчик электричества аппаратно сделан так: импульсный выход счетчика заведен на Mega2561. скрипт набросал такой:
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; });
плз, покритикуйке мой говнокод, посоветуйте как его оптимизировать…
-
Мой код настолько ужасен, что не хочется его комментировать?
Или он настолько хорош, что нечего добавить?
Меня смущает введение задержки, вот этот кусок:
setTimeout(function() { setState('PowerMeter_count_summ', ((getState('PowerMeter_count_day').val) + (getState('PowerMeter_count_night').val)), true); }, 15); //без этой задержки берется предыдущее значение!
может быть можно изящнее сделать?
еще не нравится расчет временного интервала между импульсами и подсчет "мгновенного" потребления:
newBlink = (new Date().getTime()); interval = newBlink - lastBlink; watt = (3600000 / interval) / ppwh; setState('PowerMeter_WATT_current', Math.round(watt), true); lastBlink = newBlink;
-
Мой код настолько ужасен, что не хочется его комментировать?
Или он настолько хорош, что нечего добавить?
Меня смущает введение задержки, вот этот кусок:
setTimeout(function() { setState('PowerMeter_count_summ', ((getState('PowerMeter_count_day').val) + (getState('PowerMeter_count_night').val)), true); }, 15); //без этой задержки берется предыдущее значение!
может быть можно изящнее сделать?
еще не нравится расчет временного интервала между импульсами и подсчет "мгновенного" потребления:
newBlink = (new Date().getTime()); interval = newBlink - lastBlink; watt = (3600000 / interval) / ppwh; setState('PowerMeter_WATT_current', Math.round(watt), true); lastBlink = newBlink; ```` `
Это игрушки
-
..Это игрушки `
Вся наша жизнь - игра…но хотелось бы услышать конкретную критику и советы по скрипту (железо определено, дополнительную ардуину чисто на счетчики ставить не планирую)
-
Мой код настолько ужасен, что не хочется его комментировать?
Или он настолько хорош, что нечего добавить?
Меня смущает введение задержки, вот этот кусок:
setTimeout(function() { setState('PowerMeter_count_summ', ((getState('PowerMeter_count_day').val) + (getState('PowerMeter_count_night').val)), true); }, 15); //без этой задержки берется предыдущее значение!
может быть можно изящнее сделать?
еще не нравится расчет временного интервала между импульсами и подсчет "мгновенного" потребления:
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. А чем интервал не нравится?
-
можно изящнее, вместо задержки подписаться на изменение
PowerMeter_count_day и PowerMeter_count_night. `
спасибо, попробую
@instalator:А чем интервал не нравится? `
для электросчетчика пойдет ибо он всегда тикает, для водяных счетчиков надо что-то другое, т.к. в основном они "молчат" и "мгновенное" потребление превращается в "последнее измеренное" -
можно изящнее, вместо задержки подписаться на изменение
PowerMeter_count_day и PowerMeter_count_night. `
спасибо, попробую
@instalator:А чем интервал не нравится?
для электросчетчика пойдет ибо он всегда тикает, для водяных счетчиков надо что-то другое, т.к. в основном они "молчат" и "мгновенное" потребление превращается в "последнее измеренное"
так а как для воды рассчитать мгновенное если один импульс это 10 литров в среднем? Да и нужно ли оно для воды. -
первое что приходит - просто по расписанию запускать тот кусок с интервалом и проверять счетчик, если не изменился - обнулять "мгновенное потребление"
-
первое что приходит - просто по расписанию запускать тот кусок с интервалом и проверять счетчик, если не изменился - обнулять "мгновенное потребление" `
А проще по-моему просто ловить изменение счётчика (импульс) это и будет означать что вот вот утек стакан воды -
а как зафиксировать, что кран закрыли и импульсов в ближайшее время не предвидится?
-
а как зафиксировать, что кран закрыли и импульсов в ближайшее время не предвидится? `
Рассчитать максимальное время между импульсами при минимальном потоке воды и через это время обнулять значение якобы мгновенного расхода. Либо делить его на это время -
Счётчик воды работает конечно импульсно, но! У него контакт замыкается каждые 10 литров, при этом если вы в это время воду прекратили расходовать, он будет замкнут и постоянно включён!
Так как у меня контроллер Wago и, по сути, вся логика на нём, то счётчики воды реализованы через Функциональный блок 'инкрементный счетчик' (CTU), а уже от него передаются в ioBroker/
-
..он будет замкнут и постоянно включён!.. `
ну и что, я-то подписываюсь на изменение значения счетчика, на не состояние порта..