# Total energy consumed in kWh day/week/mont/year

I am getting real-time information about energy consumption from 3 phases which i am persisting (everychange) and have nice chart in grafana :

Now i would like to calculate total consumed energy : today so far, yesterday, this week, this month, last month, this year, last year and put it in OH as number and as a bar chart in grafana.

Could someone please advise me how to do it ? Calculate in grafana or write some rule in OH ?
Any help would be appreciated

1 Like

Hi

Im looking for the same solution too. In next step i want to calculate money.

Is this possible?

1 Like

There are lots of threads here concerning rules around energy consumption:
https://community.openhab.org/search?q=energy%20consumption
or if you add daily: https://community.openhab.org/search?q=energy%20consumption%20daily

Please have a look first - of course, if your use case isnât there, you can ask for help on specific problems. But from the looks you should be covered in more than a few threads here!

I have read lots of thread about calculating energy but sadly most of them cannot help to solve my problem
Found only one Sum energy values stored in influxdb which seems to be similar but proposed solution was to made in grafana - maybe someone knows how to solve it in OH rules ?

ok, letâs go

1. does your powermeter only send the actual consumption? or does it have an total consumption counter?
2. if unsure: whatâs the type of powermeter youâre using? and which binding do you use?

Hello everybody! I use openhabian since 1 year, after a lot of work I made up an arduino power meter counter with openenergymonitor tx shield to monitor Watt istant power.

I read from 4 CT (total house watt, garden, 1floor, laundry) instant watt power, and every 5 seconds (to not overload the network) send data to openhabian with MQTT, that stores âeverychangeâ with InfluxDB+Grafana.
I have graph in grafana, but i donât know how to get Kwh from Kw to show in openhab the famous âtoday from midnight until nowâ âlast weekâ âlast monthâ âlast yearâ Kwh total comsuption.
my default.item file for total power is:

Number TotalPowerW âTotal Consumption: [%.0f W]â (gConsumption) {mqtt="<[MQTT:/ESPPOWER/homepwr/CT4:state:default]"}

What is the best approach to reach my needs?! I read out all the examples here but I cannot make it work! Help!

Same issue here with oh3.
My power meter sends total energy consumed from the installation of power meter and also the live consumption.
The device is tp-link with tp-link binding.
I would like to have simply a sum starting from midnight to the hour of when iâm looking at the chart. At every midnight is must be resetted to zero.
Any idea?

I receive live consumption from my meter every 2s, but my Arduino implementation only post to OH3 item upon change. Iâm using influxDB persistence and made this JSS rule. (Install from Marketplace)
Trigger is every 1s (I see I have mixed up kWh and Wh a bit, itâs all Wh)

``````var today = new Date
var instPower = parseInt(items.getItem("GTV7PowerConsumption").state, 10)
var kwMinute
var hasTickedMinutes

if (isNaN(kwMinute)) {
console.log("Rule starting");
kwMinute = 0;
kwHour = 0;
hasTickedMinutes = false
hourlyPrice = 0.0
}

function isMinuteTick () {
return (today.getSeconds() == 0)
}

function isHourTick () {
return ((today.getMinutes() == 0) && (today.getSeconds() == 4)) // delay a bit so that the last persisted value becomes part of the sum
}
if (isMinuteTick()) {
if (!hasTickedMinutes) { // sample a full interval
hasTickedMinutes = true
} else {
kwMinute /= 60
//console.log("kWmin= " + kwMinute);
items.getItem("kWHminuteConsumption").postUpdate(kwMinute)
}
kwMinute = 0
} else {
kwMinute += instPower
}

if (isHourTick()) {
var kwPeriod = items.getItem("kWHminuteConsumption").history.sumSince(new Date(new Date().setHours(new Date().getHours()-1))) / 60

console.log("kWh= " + kwPeriod);
calcHourlyConsumptionCost(kwPeriod)
items.getItem("kWHhourlyConsumption").postUpdate(kwPeriod)

var now = new Date();
var tday = new Date(now.getFullYear(), now.getMonth(), now.getDate());
var lastMonday = new Date(tday.setDate(tday.getDate()-(today.getDay() + 6) % 7));

var daySoFar = items.getItem("kWHminuteConsumption").history.sumSince(new Date(new Date().setHours(0, 0, 0))) / 60     // from midnight
var weekSoFar = items.getItem("kWHminuteConsumption").history.sumSince(lastMonday) / 60                                // from midnight monday
var monthSoFar = items.getItem("kWHminuteConsumption").history.sumSince(new Date(new Date().setDate(1))) / 60    // from the 1. of the month
var yearSoFar = items.getItem("kWHminuteConsumption").history.sumSince(new Date(new Date().setMonth(0, 1))) / 60 // from 1. january

items.getItem("kWHdaylyConsumptionSoFar").postUpdate(daySoFar)
items.getItem("kWHweeklyConsumptionSoFar").postUpdate(weekSoFar)
items.getItem("kWHmonthlyConsumptionSoFar").postUpdate(monthSoFar)
items.getItem("kWHyearlyConsumptionSoFar").postUpdate(yearSoFar)
}
``````

It seems to work fairly well, but I havenât verified it 100%

Iâm running oh3 and i would like to have daily consumption using default charts/rulesâŚ

1 Like

Sorry, my bad, Iâm also on OH3 so my example apply.
If by âdefaultâ you mean DSL rules, then not, but in latest OH3 release JSS is just a matter of installing from the Marketplace and it can co-exist with DSL.

Arenât you using influxdb?
So with your code i just need to install jss from marketplace and copy paste your code and adapt to my items?
Sorry but iâm not so good in rules that arenât dsl

What persistence service have you opted for?
You donât need influxDB, The âstandardâ RRD4j should work just fine without any further tweaking other than installing and selecting itâŚ

The item holding your instantaneous consumption, kan you obtain an Analysis graph for it?
Here is mine:

And yes, it is that simple. Just install this: (JSScripting under Automation)

Create a 1s ticker rule, and paste my code into `the execute a given script`:

Add the following Items in a .items file:

``````Group:Number kWhconsumptionStats
Number kWHminuteConsumption (kWhconsumptionStats)
Number kWHhourlyConsumption (kWhconsumptionStats)
Number kWHdaylyConsumption (kWhconsumptionStats)
Number kWHweeklyConsumption (kWhconsumptionStats)
Number kWHmonthlyConsumption (kWhconsumptionStats)
Number kWHyearlyConsumption (kWhconsumptionStats)

Number kWHdaylyConsumptionSoFar (kWhconsumptionStats)
Number kWHweeklyConsumptionSoFar (kWhconsumptionStats)
Number kWHmonthlyConsumptionSoFar (kWhconsumptionStats)
Number kWHyearlyConsumptionSoFar (kWhconsumptionStats)
``````

thanks a lot for your patience and help!
i have some questions:

the rule is ecma or dsl?

iâve added items you said:

``````Group:Number kWhconsumptionStats
Number kWHminuteConsumption (kWhconsumptionStats)
Number kWHhourlyConsumption (kWhconsumptionStats)
Number kWHdaylyConsumption (kWhconsumptionStats)
Number kWHweeklyConsumption (kWhconsumptionStats)
Number kWHmonthlyConsumption (kWhconsumptionStats)
Number kWHyearlyConsumption (kWhconsumptionStats)

Number kWHdaylyConsumptionSoFar (kWhconsumptionStats)
Number kWHweeklyConsumptionSoFar (kWhconsumptionStats)
Number kWHmonthlyConsumptionSoFar (kWhconsumptionStats)
Number kWHyearlyConsumptionSoFar (kWhconsumptionStats)
``````

but int he script:

``````var today = new Date
var instPower = parseInt(items.getItem("GTV7PowerConsumption").state, 10)
var kwMinute
var hasTickedMinutes

if (isNaN(kwMinute)) {
console.log("Rule starting");
kwMinute = 0;
kwHour = 0;
hasTickedMinutes = false
hourlyPrice = 0.0
}

function isMinuteTick () {
return (today.getSeconds() == 0)
}

function isHourTick () {
return ((today.getMinutes() == 0) && (today.getSeconds() == 4)) // delay a bit so that the last persisted value becomes part of the sum
}
if (isMinuteTick()) {
if (!hasTickedMinutes) { // sample a full interval
hasTickedMinutes = true
} else {
kwMinute /= 60
//console.log("kWmin= " + kwMinute);
items.getItem("kWHminuteConsumption").postUpdate(kwMinute)
}
kwMinute = 0
} else {
kwMinute += instPower
}

if (isHourTick()) {
var kwPeriod = items.getItem("kWHminuteConsumption").history.sumSince(new Date(new Date().setHours(new Date().getHours()-1))) / 60

console.log("kWh= " + kwPeriod);
calcHourlyConsumptionCost(kwPeriod)
items.getItem("kWHhourlyConsumption").postUpdate(kwPeriod)

var now = new Date();
var tday = new Date(now.getFullYear(), now.getMonth(), now.getDate());
var lastMonday = new Date(tday.setDate(tday.getDate()-(today.getDay() + 6) % 7));

var daySoFar = items.getItem("kWHminuteConsumption").history.sumSince(new Date(new Date().setHours(0, 0, 0))) / 60     // from midnight
var weekSoFar = items.getItem("kWHminuteConsumption").history.sumSince(lastMonday) / 60                                // from midnight monday
var monthSoFar = items.getItem("kWHminuteConsumption").history.sumSince(new Date(new Date().setDate(1))) / 60    // from the 1. of the month
var yearSoFar = items.getItem("kWHminuteConsumption").history.sumSince(new Date(new Date().setMonth(0, 1))) / 60 // from 1. january

items.getItem("kWHdaylyConsumptionSoFar").postUpdate(daySoFar)
items.getItem("kWHweeklyConsumptionSoFar").postUpdate(weekSoFar)
items.getItem("kWHmonthlyConsumptionSoFar").postUpdate(monthSoFar)
items.getItem("kWHyearlyConsumptionSoFar").postUpdate(yearSoFar)
}
``````

which objects do i need to replace to match my items provided by my energy meter?
actually i have these:

the item â_EnergyUsageâ is the total of energy consumed from when the device has been turned on, and item â_Powerâ is the live consuming.

thanks again!

forgot, jss scripting installed and yes i use RRD4j persistance.

Hmm, are you sure you are on OH 3.2.0 release or newer?
You must choose the latest ECMA as rule.

The only thing you should need to change is:

``````var instPower = parseInt(items.getItem("GTV7PowerConsumption").state, 10)
``````

to

``````var instPower = parseInt(items.getItem("TpLinkFrigorifero_Power").state, 10)
``````

It is also a big help to add log entries and watch:

``tail -F -n 2000 /var/log/openhab/openhab.log``

i get this error

``````failed: TypeError: items.getItem is not a function in <eval> at line number 2
``````

yes iâm only using openhabian and maybe is not updated much more than 2 weeksâŚ

and also this error:

``````2022-01-09 16:23:43.462 [ERROR] [ipt.internal.ScriptEngineManagerImpl] - Error while creating ScriptEngine
org.graalvm.polyglot.PolyglotException: Error: Invalid CommonJS root folder: /etc/openhab/automation/lib/javascript/personal
at org.graalvm.polyglot.Context.eval(Context.java:345) ~[?:?]
at com.oracle.truffle.js.scriptengine.GraalJSScriptEngine.evalInternal(GraalJSScriptEngine.java:319) ~[?:?]
at com.oracle.truffle.js.scriptengine.GraalJSBindings.initGlobal(GraalJSBindings.java:94) ~[?:?]
at com.oracle.truffle.js.scriptengine.GraalJSBindings.initContext(GraalJSBindings.java:90) ~[?:?]
at com.oracle.truffle.js.scriptengine.GraalJSBindings.requireContext(GraalJSBindings.java:84) ~[?:?]
at com.oracle.truffle.js.scriptengine.GraalJSBindings.put(GraalJSBindings.java:127) ~[?:?]
at javax.script.SimpleScriptContext.setAttribute(SimpleScriptContext.java:246) ~[java.scripting:?]
at org.openhab.core.automation.module.script.internal.ScriptEngineManagerImpl.createScriptEngine(ScriptEngineManagerImpl.java:139) [bundleFile:?]
at org.openhab.core.automation.module.script.internal.handler.AbstractScriptModuleHandler.createScriptEngine(AbstractScriptModuleHandler.java:92) [bundleFile:?]
at org.openhab.core.automation.module.script.internal.handler.AbstractScriptModuleHandler.getScriptEngine(AbstractScriptModuleHandler.java:88) [bundleFile:?]
at org.openhab.core.automation.module.script.internal.handler.ScriptActionHandler.execute(ScriptActionHandler.java:59) [bundleFile:?]
at org.openhab.core.automation.internal.RuleEngineImpl.executeActions(RuleEngineImpl.java:1183) [bundleFile:?]
at org.openhab.core.automation.internal.RuleEngineImpl.runRule(RuleEngineImpl.java:991) [bundleFile:?]
at org.openhab.core.automation.internal.TriggerHandlerCallbackImpl\$TriggerData.run(TriggerHandlerCallbackImpl.java:90) [bundleFile:?]
2022-01-09 16:23:43.495 [ERROR] [e.automation.internal.RuleEngineImpl] - Failed to execute rule 'e267a26149': Fail to execute action: 2
``````

Could you have been hit with this?

Also verify that you got the ECMA 2021 type:

nope, 3.1.1 and no description for ecma scripc versionâŚ

iâm trying to update to 3.2.0.

now iâm fully updated with OH3 3.2.0 and ECMA rules match with your.
the error still persistâŚ

after oversaving the rule it started to wor! thanks!

one other question: i get the minuteconsumption with value, but not hourly and so on. it will be compiled after hour change?

Glad you got it working. You are set for the future

Yes.

``````if (isHourTick()) {
``````

will trigger when Date (aka clock) is xx:00:00 ie min=0 & sec=0 aka every hour.

If, for some reason, your system fails to detect the xx:00:00 tick, make another rule triggering every hour, and move the appropriate code over.

Again thanks a lot for your help!!!
I had to comment âcostâ because make errors on execution of the rule.
Btw,i suppose you set a static cost for energy and could be multiplied for consumption?
And need to be created a monthly cost as item?

Thanks again!