High amp dc power meter
Moderators: grovkillen, Stuntteam, TD-er
High amp dc power meter
Hi!
I have an INA219 with 350A shunt to meassure my total Ah consumption on my boat. I send the meassured value to domoticz each 10 seconds which is the minimum duration for sensor values being sent to domoticz. Domoticz then calculates the total Ah consumption from these readings. This works quite well but when I have high loads on for a very short time, like thrusters, it's not accurate enough.
Is there some way to meassure each second and somehow acumulate the values and then send them to domoticz each 10 seconds?
How else can I use the INA219 as an energy monitor?
I have an INA219 with 350A shunt to meassure my total Ah consumption on my boat. I send the meassured value to domoticz each 10 seconds which is the minimum duration for sensor values being sent to domoticz. Domoticz then calculates the total Ah consumption from these readings. This works quite well but when I have high loads on for a very short time, like thrusters, it's not accurate enough.
Is there some way to meassure each second and somehow acumulate the values and then send them to domoticz each 10 seconds?
How else can I use the INA219 as an energy monitor?
Re: High amp dc power meter
What is this 10 sec interval based on?
The INA219 can perform multiple measurements per sec.
If the limit is determined by the communication to Domoticz, then you could perform multiple measurements via rules and add them to a variable, store it in a dummy variable and then flush that from rules.
For example you could create a loop timer and call taskrun from the rules to read the sensor more often with a very regular interval.
If the task reads a new value, this will then result in an event which you can accumulate in a variable.
After N reads flush the variable to a dummy (and divide it by the number of samples) and call taskrun of that dummy to send the value to Domoticz.
The INA219 can perform multiple measurements per sec.
If the limit is determined by the communication to Domoticz, then you could perform multiple measurements via rules and add them to a variable, store it in a dummy variable and then flush that from rules.
For example you could create a loop timer and call taskrun from the rules to read the sensor more often with a very regular interval.
If the task reads a new value, this will then result in an event which you can accumulate in a variable.
After N reads flush the variable to a dummy (and divide it by the number of samples) and call taskrun of that dummy to send the value to Domoticz.
Re: High amp dc power meter
Thankyou, I can always rely on you to get an answer:) however this is quite a leap for me me who isn't familiar with scripting or programming. Could you please direct me to the relevant documentation for this? I can't seem to find the answers just by looking att rules in the wiki.TD-er wrote: ↑18 May 2021, 22:08 What is this 10 sec interval based on?
The INA219 can perform multiple measurements per sec.
If the limit is determined by the communication to Domoticz, then you could perform multiple measurements via rules and add them to a variable, store it in a dummy variable and then flush that from rules.
For example you could create a loop timer and call taskrun from the rules to read the sensor more often with a very regular interval.
If the task reads a new value, this will then result in an event which you can accumulate in a variable.
After N reads flush the variable to a dummy (and divide it by the number of samples) and call taskrun of that dummy to send the value to Domoticz.
Feel free to give me an example of working code if you've got the time:)
10 seconds comes from domoticz. It's the minimum time between sensor updates. With your solution which is exactly what I'm looking for I could increase the time to 30 seconds or even 60.
Re: High amp dc power meter
I think you actually did point me in the right direction. Could you please comment on my code below, am I on the right track?
Code: Select all
On System#Boot do //When the ESP boots, do
timerSet,1,1 //Set Timer 1 for the next event in 1 seconds
timerSet,2,10 //Set Timer 2 for the next event in 10 seconds
endon
On Rules#Timer=1 do //When Timer1 expires, do
TaskRun, 5
timerSet,1,1 //Set Timer 1 for the next event in 1 second
endon
On Rules#Timer=2 do //When Timer2 expires, do
timerSet,2,10 //Set Timer 2 for the next event in 10 seconds
TaskValueSet 6,1,0
endon
on INA#Current do
TaskValueSet 6,1,[Test#Dummy]+%eventvalue%/3600 //Add 1 seconds worth of Ah the dummy value. 1 hour = 60*60=3600
endon
Last edited by olleman on 21 May 2021, 09:04, edited 1 time in total.
Re: High amp dc power meter
Right now I don't have time to write down the whole script, but the least I can do is give already some links to the documentation parts:
To set a loop timer:
https://espeasy.readthedocs.io/en/lates ... oop-timers
for storing the value, you could either use a dummy task, or store it in a variable.
If I'm not mistaken, Domoticz also supports energy logging via ever increasing counters. (e.g. a Wh meter)
It then takes the previous value and the time passed since to perform some computations to convert the measured values into some Wh unit of measure.
Using a dummy can also be useful to send directly to a controller without having to know how the other and needs the data to be formatted.
For interacting with a dummy task, you may need taskvalueset to set a value in a dummy task and taskrun to "flush" the values to a connected controller.
See here some example of counting values in a dummy task and send them to Domoticz via HTTP: https://espeasy.readthedocs.io/en/lates ... onsumption
Or you do the calculations yourself on ESPEasy and just push what you've computed.
This requires the "let" command to store a value in a variable.
In either case you need the "taskrun" to trigger a run of the INA219 sensor and you will get some event as soon as it is done processing the sensor measurement.
For example if your INA219 task is called "ina" and the value you need is "Amp" you will get an event named "ina#Amp" on which you act in the rules like this:
N.B. when referring to the value of "ina#Amp" you need to use [] => [ina#Amp]
When acting on its event, you should not use the [] as shown in my code.
To set a loop timer:
https://espeasy.readthedocs.io/en/lates ... oop-timers
for storing the value, you could either use a dummy task, or store it in a variable.
If I'm not mistaken, Domoticz also supports energy logging via ever increasing counters. (e.g. a Wh meter)
It then takes the previous value and the time passed since to perform some computations to convert the measured values into some Wh unit of measure.
Using a dummy can also be useful to send directly to a controller without having to know how the other and needs the data to be formatted.
For interacting with a dummy task, you may need taskvalueset to set a value in a dummy task and taskrun to "flush" the values to a connected controller.
See here some example of counting values in a dummy task and send them to Domoticz via HTTP: https://espeasy.readthedocs.io/en/lates ... onsumption
Or you do the calculations yourself on ESPEasy and just push what you've computed.
This requires the "let" command to store a value in a variable.
In either case you need the "taskrun" to trigger a run of the INA219 sensor and you will get some event as soon as it is done processing the sensor measurement.
For example if your INA219 task is called "ina" and the value you need is "Amp" you will get an event named "ina#Amp" on which you act in the rules like this:
Code: Select all
on ina#Amp do
// value is stored in %eventvalue1%
let,1,[var#1]+%eventvalue1% // Add new value to the existing one in variable #1
let,2,[int#2]+1 // Count the number of samples stored in variable #2
endon
When acting on its event, you should not use the [] as shown in my code.
Re: High amp dc power meter
Better to use the looptimer, as that will schedule its new run on the old one.olleman wrote: ↑21 May 2021, 09:02 I think you actually did point me in the right direction. Could you please comment on my code below, am I on the right track?
Code: Select all
On System#Boot do //When the ESP boots, do timerSet,1,1 //Set Timer 1 for the next event in 1 seconds timerSet,2,10 //Set Timer 2 for the next event in 10 seconds endon On Rules#Timer=1 do //When Timer1 expires, do TaskRun, 5 timerSet,1,1 //Set Timer 1 for the next event in 1 second endon On Rules#Timer=2 do //When Timer2 expires, do timerSet,2,10 //Set Timer 2 for the next event in 10 seconds TaskValueSet 6,1,0 endon on INA#Current do TaskValueSet 6,1,[Test#Dummy]+%eventvalue%/3600 //Add 1 seconds worth of Ah the dummy value. 1 hour = 60*60=3600 endon
Setting a new timer in the rules may cause some drift, as it may take some time to process the rules.
Also you can better use a variable to count the number of samples instead of hoping the timers will be in phase.
Otherwise you may one time only have processed 9 samples and the next can be 11 samples.
Re: High amp dc power meter
Ok, I will look at your code and see if I can understand how it all worksTD-er wrote: ↑21 May 2021, 09:06Better to use the looptimer, as that will schedule its new run on the old one.olleman wrote: ↑21 May 2021, 09:02 I think you actually did point me in the right direction. Could you please comment on my code below, am I on the right track?
Code: Select all
On System#Boot do //When the ESP boots, do timerSet,1,1 //Set Timer 1 for the next event in 1 seconds timerSet,2,10 //Set Timer 2 for the next event in 10 seconds endon On Rules#Timer=1 do //When Timer1 expires, do TaskRun, 5 timerSet,1,1 //Set Timer 1 for the next event in 1 second endon On Rules#Timer=2 do //When Timer2 expires, do timerSet,2,10 //Set Timer 2 for the next event in 10 seconds TaskValueSet 6,1,0 endon on INA#Current do TaskValueSet 6,1,[Test#Dummy]+%eventvalue%/3600 //Add 1 seconds worth of Ah the dummy value. 1 hour = 60*60=3600 endon
Setting a new timer in the rules may cause some drift, as it may take some time to process the rules.
Also you can better use a variable to count the number of samples instead of hoping the timers will be in phase.
Otherwise you may one time only have processed 9 samples and the next can be 11 samples.
Re: High amp dc power meter
This is what I have used before but since domoticz seems to have a minimum of 10 seconds between each sensor update the resolution becomes to low. For example, if I use the bow trhuster for 6 seconds @ 400A it might not "see" it at all or it might count it as 10 seconds.If I'm not mistaken, Domoticz also supports energy logging via ever increasing counters. (e.g. a Wh meter)
It then takes the previous value and the time passed since to perform some computations to convert the measured values into some Wh unit of measure.
Please correct me if I'm wrong but to get better resolution it seems that I will have to use the ESP for the computations and then send the Ah to domoticz.
Re: High amp dc power meter
I am convinced you need to sample more often, just to see those peaks in consumption.
I don't know how Domoticz does internally process the values, so maybe sending more frequently may not improve things.
But by just adding sample readings to a counter at a regular interval you do create some incremental Wh like value which may later need to be corrected for the actual measurement interval.
So then you might just collect samples every second and push the total count every 10 minutes (maybe already divide the counter when adding it)
I don't know how Domoticz does internally process the values, so maybe sending more frequently may not improve things.
But by just adding sample readings to a counter at a regular interval you do create some incremental Wh like value which may later need to be corrected for the actual measurement interval.
So then you might just collect samples every second and push the total count every 10 minutes (maybe already divide the counter when adding it)
Re: High amp dc power meter
So I got it nailed down to this now, does this seem better to you?
One thing I'm concerned about is the loop timer. I'm now counting samples and relying on the fact that 60 samples = 60 seconds (Since I divide each sample by 3600). If the timer were to drift for whatever reason, the Ah
won't be correctly computed.
I can't reset the consumption since domoticz wants the accumulated value sent for the sensor device I'd like to use.
One thing I'm concerned about is the loop timer. I'm now counting samples and relying on the fact that 60 samples = 60 seconds (Since I divide each sample by 3600). If the timer were to drift for whatever reason, the Ah
won't be correctly computed.
Code: Select all
On System#Boot do //When the ESP boots, do
looptimerset_ms,1,1000 // Start loop timer 1, 1000 msec interval
endon
On Rules#Timer=1 do
taskrun,11
if [var#2] >= 60 //if 60 samples have been collected (60 seconds passed) send Ah to domoticz and reset counter
let,2,0
SendToHTTP 192.168.50.10,8080,/json.htm?type=command¶m=udevice&idx=49&nvalue=0&svalue=[batteri_total#Amps];[var#1]
endon
on batteri_total#Amps do
// value is stored in %eventvalue1%
let,1,[var#1]+%eventvalue1%/3600 // Add new value to the existing one in variable #1 as Ah (1 sample taken each second so each sample is 60*60=3600th of and Ah)
let,2,[int#2]+1 // Count the number of samples stored in variable #2
endon
Re: High amp dc power meter
You're missing an endif
What you can do, along with clearing variable 2, is storing the last time you sent values.
Since very recent commits you now can use the %uptime_ms% flag, so you can correct for the actual time spent collecting values.
Code: Select all
On System#Boot do //When the ESP boots, do
looptimerset_ms,1,1000 // Start loop timer 1, 1000 msec interval
endon
On Rules#Timer=1 do
taskrun,11
if [var#2] >= 60 //if 60 samples have been collected (60 seconds passed) send Ah to domoticz and reset counter
let,2,0
SendToHTTP 192.168.50.10,8080,/json.htm?type=command¶m=udevice&idx=49&nvalue=0&svalue=[batteri_total#Amps];[var#1]
endif // <<<< This one was missing
endon
on batteri_total#Amps do
// value is stored in %eventvalue1%
let,1,[var#1]+%eventvalue1%/3600 // Add new value to the existing one in variable #1 as Ah (1 sample taken each second so each sample is 60*60=3600th of and Ah)
let,2,[int#2]+1 // Count the number of samples stored in variable #2
endon
Since very recent commits you now can use the %uptime_ms% flag, so you can correct for the actual time spent collecting values.
Re: High amp dc power meter
Thanks for your feedback. One thing I noticed is that every time I hit "submit" on the rules (like now when I added "endif") the variable where the Ah are stored gets reset. Can I do anything aboout this? Even if i'm not editing the rules all the time it would be nice to have it stored a bit more permanently if possible.
Initially I got values to domoticz a bit faster then expected. Turned out that I had the task set for 10 seconds interval which caused an extra sensor reading each 10th second. Now I have set the interval for 3600 and for the passed 10 minutes I'm getting new updates each 10th seconds with no drift at all. What is the highest setting for the interval or can I disable it totally for this task? Hopefully the error caused by collecting samples will be so minor that it doesn't affect the outcome in practice. I don't have the correct build on the ESP in my boat and it's a pain to change
I'm so thankful for your help, I'm almost there now and this is something that has buggered me for the last 2 years
Initially I got values to domoticz a bit faster then expected. Turned out that I had the task set for 10 seconds interval which caused an extra sensor reading each 10th second. Now I have set the interval for 3600 and for the passed 10 minutes I'm getting new updates each 10th seconds with no drift at all. What is the highest setting for the interval or can I disable it totally for this task? Hopefully the error caused by collecting samples will be so minor that it doesn't affect the outcome in practice. I don't have the correct build on the ESP in my boat and it's a pain to change
I'm so thankful for your help, I'm almost there now and this is something that has buggered me for the last 2 years
Re: High amp dc power meter
You no longer need the task interval itself as you're calling taskrun yourself.
So set it as high as possible.
About the variable being cleared when submitting the rules.
Can you check to see if the unit may be rebooting?
The variables are cleared at boot.
If you need to survive a reboot, you should store them in a dummy task instead of using a variable (taskvalueset is the command you're looking for)
N.B. storing in a dummy task will only survive "warm reboots" like a crash or an intended reboot, not a power cycle.
So set it as high as possible.
About the variable being cleared when submitting the rules.
Can you check to see if the unit may be rebooting?
The variables are cleared at boot.
If you need to survive a reboot, you should store them in a dummy task instead of using a variable (taskvalueset is the command you're looking for)
N.B. storing in a dummy task will only survive "warm reboots" like a crash or an intended reboot, not a power cycle.
Re: High amp dc power meter
Ok, will look for this. I want to have a couple of hours of meassuring data to domoticz before anymore rebooting.
I think I read somehwere that using the internal variable instead of a dummy was less resource hungry for the ESP. Is this true? Maybee I can learn to live with this if that's the case.
I think I read somehwere that using the internal variable instead of a dummy was less resource hungry for the ESP. Is this true? Maybee I can learn to live with this if that's the case.
Re: High amp dc power meter
Depends on where your focus is on resources.
For example on ESP8266 you only have 12 tasks, so adding a dummy task is taking over 8% of those resources
In the end it doesn't really matter I guess, unless you need a lot of variables.
One thing that does matter is that the accuracy of floating point values in a variable is higher as it is stored as a double.
But for your use case that's also not an issue, as a float can store upto 6 - 7 decimal digits.
If you need more precision (e.g. to store a unix timestamp) you will see a difference in accuracy.
For example on ESP8266 you only have 12 tasks, so adding a dummy task is taking over 8% of those resources
In the end it doesn't really matter I guess, unless you need a lot of variables.
One thing that does matter is that the accuracy of floating point values in a variable is higher as it is stored as a double.
But for your use case that's also not an issue, as a float can store upto 6 - 7 decimal digits.
If you need more precision (e.g. to store a unix timestamp) you will see a difference in accuracy.
Re: High amp dc power meter
hehe this ESP is more or less overloaded allready with 9 real devices. 1 more dummy device might not make that much of a difference
1 temp sensor HD1080
1 BME280
2 Ds18b20
1 Flow meter
1 Weight sensor
2 INA219 devices
1 relay
Thanks again, I'll evaluate and see how this compares to my old way of meassuring. In the end I sense that the difference is more or less negligable
1 temp sensor HD1080
1 BME280
2 Ds18b20
1 Flow meter
1 Weight sensor
2 INA219 devices
1 relay
Thanks again, I'll evaluate and see how this compares to my old way of meassuring. In the end I sense that the difference is more or less negligable
Re: High amp dc power meter
Yes, it does indeed reboot when this problem happens. For now I have changed to dummy tasks and the value is now stored between these reboots. I wonder if you could give me advice on something related to this. I now have this codeTD-er wrote: ↑21 May 2021, 13:13 You no longer need the task interval itself as you're calling taskrun yourself.
So set it as high as possible.
About the variable being cleared when submitting the rules.
Can you check to see if the unit may be rebooting?
The variables are cleared at boot.
If you need to survive a reboot, you should store them in a dummy task instead of using a variable (taskvalueset is the command you're looking for)
N.B. storing in a dummy task will only survive "warm reboots" like a crash or an intended reboot, not a power cycle.
Code: Select all
On System#Boot do //When the ESP boots, do
looptimerset_ms,1,1000 // Start loop timer 1, 1000 msec interval
endon
On Rules#Timer=1 do
taskrun,11
if [var#2] >= 10
let,2,0
let,3,[var#3]/10
SendToHTTP 192.168.50.10,8080,/json.htm?type=command¶m=udevice&idx=49&nvalue=0&svalue=[var#3];[Current_Ah#Ah]
let,3,0
endif
endon
on batteri_total#Amps do
// value is stored in %eventvalue1%
TaskValueSet 12,1,[Current_Ah#Ah]+%eventvalue1%/3600 // Add new value to the existing one in variable #1
let,2,[int#2]+1 // Count the number of samples stored in variable #2
let,3,[var#3]+%eventvalue1% // Add new value to the existing one in variable #3 for average power
endon
The energy output file attached to this post shows the data I'm getting to domoticz with above rules. There's something funny going on with the energy readings (yellow) at the marked places. The spikes in consumption is my fridge turning on and off. And I can see from the temperature in the fridge that it does in fact run during these periods when the energy never exceeds ~1000 (red markings). The consumed energy (blue) during one hour seems to be correct but the energy is wrong. This can be a problem with domoticz also but do you see anything in my code that could cause this seamingly random beahavior?
- Attachments
-
- energy output.JPG (49.78 KiB) Viewed 8171 times
Re: High amp dc power meter
Not really sure if I get the problem you try to describe.
And maybe I do need some more info.
For example, do you still have a set interval in the task running the INA219?
Maybe that one interferes with the rules script?
Second, I am wondering if this line does what you intend to do:
Why not just add the value and when you try to send it divide its total by 3600.
The rules calculate should do the calculations correct for the "let" command, but I'm not sure if it also works correct on the TaskValueSet call.
So maybe store it first in a new variable and then store this variable using TaskValueSet.
Not sure if the INA219 plugin can return a "NaN" value and if so, what the rules calculation will do with it.
And maybe I do need some more info.
For example, do you still have a set interval in the task running the INA219?
Maybe that one interferes with the rules script?
Second, I am wondering if this line does what you intend to do:
Code: Select all
TaskValueSet 12,1,[Current_Ah#Ah]+%eventvalue1%/3600
The rules calculate should do the calculations correct for the "let" command, but I'm not sure if it also works correct on the TaskValueSet call.
So maybe store it first in a new variable and then store this variable using TaskValueSet.
Not sure if the INA219 plugin can return a "NaN" value and if so, what the rules calculation will do with it.
Who is online
Users browsing this forum: Ahrefs [Bot] and 1 guest