I personally push the data in influxdb, then using a rest sensor pull what I need from that data into HA. This has worked for me as I used influx to view long term data. Now HA is starting to dip it toe into long term data I might change that at some point an instead pull the data straight into HA which drops my need for influx.
Thanks. I am about to set up an influxdb server to trial it out. Can you post your rest sensor code?
As I was typing this reply I worked out we are probably having this conversation in the wrong place, this thread is dedicated to the custom component which I am not using. If you need follow up questions on doing integration through rest might be better moving elsewhere. That said I had already written my reply so here goes:
Below is my code for pulling the data from Influx, this pulls in data for all the circuts, so I then create individual sensors for each circut and finally convert from W to kwh.
############################################################################
## Pull IotaWatt details from Influx
############################################################################
- platform: rest
name: iotawatt
resource: 'http://192.168.1.166:8086/query?db=IoTaWatt&q=SELECT%20last(%22Watts%22)%20FROM%20%22IotaWatt%22.%22autogen%22.%22iotawatt%22%20WHERE%20time%20%3E%20NOW()-10m%20GROUP%20BY%20entity_id'
username: xxxx
password: xxxx
authentication: basic
value_template: 'OK'
json_attributes:
- results
############################################################################
## Create Sensors for each IoTaWatt Circut
############################################################################
- platform: template
sensors:
iotawatt_mains_realtime_power:
value_template: '{% for row in state_attr("sensor.iotawatt", "results")[0]["series"] -%}{% if row["tags"]["entity_id"] == "mains" -%}{{ row["values"][0][1] | float }}{% endif -%}{% endfor -%}'
unit_of_measurement: W
device_class: power
friendly_name_template: 'IoTaWatt mains'
iotawatt_solar_realtime_power:
value_template: '{% for row in state_attr("sensor.iotawatt", "results")[0]["series"] -%}{% if row["tags"]["entity_id"] == "solar" -%}{{ row["values"][0][1] | float }}{% endif -%}{% endfor -%}'
unit_of_measurement: W
device_class: power
friendly_name_template: 'IoTaWatt solar'
############################################################################
## Convert W to kwh
############################################################################
- platform: integration
source: sensor.iotawatt_mains_realtime_power
name: power_mains_kwh
method: left
unit_prefix: k
round: 2
- platform: integration
source: sensor.iotawatt_solar_realtime_power
name: power_solar_kwh
method: left
unit_prefix: k
round: 2
I’m thinking that we could probably use just the iotawatt and the “integration” platform
So rather than using the blah_wh sensor generated by the IoTaWatt integration, you use the sensor directly and create a new sensor based on the integration platform.
This will estimate the Wh, with probably sufficient accuracy for drawing nice graph.
I’m going to try that, and if I find that I have too much discrepancy I’ll write some code that calculates the energy value from the collected measurement (performed every 6s).
So using @Eoin template above, use the Convert W to kWh part bit.
Looking forward to hearing how it goes
So I created two outputs in the IotaWatt:
Import : Watt = (Phase1 + Phase2 + Phase3 + Tesla1 + Tesla2 + Tesla3 + Pool) + Solar1 + Solar2 + AC1 + AC2 + AC3 + HotWater max 0
and
Export: Watts = Phase1 + Phase2 + Phase3 + Tesla1 + Tesla2 + Tesla3 + Pool + Solar1 + Solar2 + AC1 + AC2 + AC3 + HotWater min 0
This gives negative value for imports, same for solar production sensors; and I want to keep it that way
So in HA I have template sensors that make them always positive:
- platform: template
sensors:
energy_solar1_wh:
friendly_name: "Solar1 Energy"
unit_of_measurement: Wh
device_class: energy
value_template: "{{ states('sensor.iotawatt_input_solar1_wh')|float|abs }}"
attribute_templates:
last_reset: "{{ state_attr('sensor.iotawatt_input_solar1_wh', 'last_reset') }}"
state_class: "{{ state_attr('sensor.iotawatt_input_solar1_wh', 'state_class') }}"
energy_solar2_wh:
friendly_name: "Solar2 Energy"
unit_of_measurement: Wh
device_class: energy
value_template: "{{ states('sensor.iotawatt_input_solar2_wh')|float|abs }}"
attribute_templates:
last_reset: "{{ state_attr('sensor.iotawatt_input_solar2_wh', 'last_reset') }}"
state_class: "{{ state_attr('sensor.iotawatt_input_solar2_wh', 'state_class') }}"
energy_solar_total_wh:
friendly_name: "Solar Total Energy Output"
unit_of_measurement: Wh
device_class: energy
value_template: "{{ states('sensor.iotawatt_output_total_solar_wh')|float|abs }}"
attribute_templates:
last_reset: "{{ state_attr('sensor.iotawatt_output_total_solar_wh', 'last_reset') }}"
state_class: "{{ state_attr('sensor.iotawatt_output_total_solar_wh', 'state_class') }}"
power_grid_import:
friendly_name: "Grid Power Import"
unit_of_measurement: W
device_class: power
value_template: "{{ states('sensor.iotawatt_output_import')|float|abs }}"
attribute_templates:
last_reset: "{{ state_attr('sensor.iotawatt_output_import', 'last_reset') }}"
state_class: "{{ state_attr('sensor.iotawatt_output_import', 'state_class') }}"
power_grid_export:
friendly_name: "Grid Power Export"
unit_of_measurement: W
device_class: power
value_template: "{{ states('sensor.iotawatt_output_export')|float|abs }}"
attribute_templates:
last_reset: "{{ state_attr('sensor.iotawatt_output_export', 'last_reset') }}"
state_class: "{{ state_attr('sensor.iotawatt_output_export', 'state_class') }}"
and two integrations sensors:
- platform: integration
source: sensor.power_grid_export
name: energy_export_wh
method: right
- platform: integration
source: sensor.power_grid_import
name: energy_import_wh
method: right
And I would configure HA energy with the relevant sensor:
sensor.energy_import_wh
for import
sensor.energy_export_wh
for export
energy_solar1_wh
for my first solar array
energy_solar2_wh
for the second.
(haven’t decided if I like have separate solar data rather than the total, will probably change as I’m not a fan of the current graph HA is drawing)
Not sure why @Eoin would want to use the left method over the default trapezoidal.
Edit: you need to use the right method for the integration component as we are adding values that have already been averaged.
Looking at your top two equations they are exactly the same except for the max
and min
at the end. Is that right? If so how?
Edit: I have thought about it some more and I get it. I was thrown by the brackets you had in the top equation and thought that something different should be going on.
Is this an issue because you’re using solar? I have a simple system without solar, and I find that Home Assistant matches exactly what my IoTaWatt reports for daily energy usage.
Yes.
Because how you calculate Export vs Import has to be done whenever a read is done by the IoTaWatt.
When you query it via the REST API it will do:
SUM(energy used)-SUM(energy_produced)
consider the following:
you have 2 inputs defined: main and solar.
It’s now August, you’ve consumed 3MWh since the beginning of the year, and your solar panels have generated 1MWh of energy
if you were to query the iota how much energy you’ve imported it will do:
3MHz - 1MHh = 2MWh
and you’ve exported 0,because your consumption is greater than your production under this scenario.
But that is not how export are calculated. You need to measure for each sample (e.g. about 30 times per second for the iota) if your usage is greater than solar and if so you’re exporting.
So say you’re appliances are running flat at 2kW, after a day you’ve used 48kWh.
But during that time, your solar produce energy between 8AM and 5PM, and during that time the power they produced was 3kW.
Between 8AM, you’ve exported (3kW-2kW)*1h = 1kWh
so you’ve exported that day 1kWh * (17:00 - 8:00) = 9kWh
In the example earlier you had produced 1MWh on a single hour, your import would have been 3MWh and your export about 1MWh!
As the author of iota watt explained Wrong values returned by REST API? - explained - #7 by overeasy - Support - IoTaWatt User Community
to calculate it properly, the iotawatt for each queries by HA would need to run thousands of calculations for every samples recorded for that year.
It just can’t, it doesn’t have the storage nor the processing power to do so.
If you don’t have solar, and never ever export, then it doesn’t matter how you calculate it, the sum of the averages is identical to the average of the sums
I hope this post explains properly on what is going on here.
Thank you for the detailed explanation. Makes sense to me now.
So if I understand it correctly the integration is retrieving the kWh values. Why doesn’t/can’t it just retrieve the current power value, say every second, and then HA could do the running calculation of energy used/exported?
This might be what your template is doing just want to check. If it is what you are doing why isn’t this accurate (enough)?
This is what the above with the “integration” integration is doing.
It’s not particularly accurate from what I’ve seen though, about 10% off. I have an idea on how we could retrieve the data from the iota that would better calculate export/import.
This won’t be using this iota watt integration however, will have to do a REST one manually
Ok that is quite an error. Do you have a feel for where the error creeps in?
A) Poll rate of Iotawatt? (Is it once a second?)
B) Accuracy of Iotawatt measurement since the last poll (a second ago?)?
C) Calculation of the Integration integration?
I read the accuracy of the Iotawatt is about 1%?
every 30s it polls the average of the last 30s
It should be more than enough for accuracy.
When I plot a graph
and over my mouse on the graph, the value you read there is spot-on. This graph was made at 11h so it uses minutes interval.
So the problem is obviously not a polling interval being too long.
I’m told that PVOutput uses 5 minutes interval and get very accurate result (I’ve always used one minute interval myself over the past 10 years and it’s been very accurate, not much different to what I’m billing for.
with a properly calibrated voltage sensor, the accuracy of the iota watt is extremely good, way better than 1% in my experience.
I used the default, I’ve just changed to “left” method will see if that’s any better.
Because right now it’s not very good, and the integration method being wrong is the only thing that makes sense here. All other values are correct.
Thanks that all makes sense. If we get a reading every minute then why can’t we just take that reading, lets say it is 600W, and divide that by 60 and then by 1000 to get that minutes worth of kWhs (0.01kWh in my example) and then add that to a running total? Wouldn’t that work instead of doing integration?
Reading again the Riesmann integration, with the left method this is exactly what it will do
We are adding averages already, so there’s no point to use the default integration method. It would over read.
good to know. Look forward to hearing your results. I have a few of these I have been playing with to keep track of total power of some lights. I will go and change these to the left method…
On second thought, and trying to remember math from a long time ago, I believe when we are summing the past averages, it’s the right
method that should be used.
Look at the test code for the Riesman integration
The values plotted were
(20, 10), (30, 30), (40, 5), (50, 0)]
So 10kW during the first 20 minutes, 30kW the following 10, 5kW the next 10
The calculation as such is 10/(6020)+30/(6010)+5/(60*10)=9.17kWh
Which is exactly what we want when the data we get from the iotawatt is the average power since it was last queried 30s prior
Another problem I’ve experienced is that when HA restarts, the iota sensors won’t exist yet or will return a value of 0.
This was problematic with the utility_meter integration to calculate daily values. Because if you restart the device during the day, for a small time the iota sensor will not be available. So if a template attempts to read the value, it will set it at 0. The next time it reads the Wh value, you will now have two the value:
to go around this you use the availability_template attribute, like so;
power_solar_total:
friendly_name: "Solar Total Power Output"
unit_of_measurement: W
device_class: power
value_template: "{{ states('sensor.iotawatt_output_total_solar')|float|abs }}"
availability_template: "{{ states('sensor.iotawatt_output_total_solar') not in ['unavailable', 'unknown', 'none' ] }}"
attribute_templates:
last_reset: "{{ state_attr('sensor.iotawatt_output_total_solar', 'last_reset') }}"
state_class: "{{ state_attr('sensor.iotawatt_output_total_solar', 'state_class') }}"
Thanks - this is all very helpful.
In your earlier example, for solar you are using the wh sensor, but for import/export you are using W… any reason for this?
Cheers