You can see the method here in this post, you might need to modify it to suit your own system if you aren’t using a Powerwall.
I have a range of options, charge and discharge energy accumulation sensors and battery power:
Best would be to upload:
- Battery charge and discharge energy accumulation values (in kWh), either daily accumulation value or lifetime values (best). These could be uploaded at 5, 10 or 15 minute intervals.
Else I also have:
- Real time battery power, which is positive or negative and available in instant values, not so good for PVO use really
- Alternatively split registers for battery charge power and battery discharge power.
There is also state of charge data and a range of other metrics which are less important (average cell voltage data, module temperatures).
Is that in the Extended data?
I already use that so if I add a battery i wouldn’t be able to record it.
Currently penciling in -
- b1 - Battery charge W (+) / discharge (-)
- b2 - State of charge (%)
- b3 - Battery Size / Capacity (Wh)
- b4 - Lifetime Energy Charged (Wh)
- b5 - Lifetime Energy Discharged (Wh)
- b6 - Battery Status (0-4)
@bankstownbloke - any info on a timeline when this is likely to be implemented?
I’m trying to decide whether it is worth the effort to manually adjust the energy consumed figure to exclude energy from my battery before sending to PVO, so daily balance figures are calculated correctly.
No concrete timeline, but the backend work has been complete to accept battery data (b1-b6).
If you’re using extended data currently for the battery data, this calculation is now supported with Extended Data rules. This was the result of the recent battery functionality support changes -
e.g. v4 = v4 - v7
See https://forum.pvoutput.org/t/extended-data-rules-v1-v4/5345
This is great news.
I have a couple of questions.
Does that mean we could start sending this data now, but we just won’t see it in the charts and tables?
Is this new data taken into consideration when PVOutput auto-calculates consumption/exports/imports?
Is this the Watts over the interval, and will it be automatically calculated if only b4/b5 are provided (i.e. same as v2/v4 for generation/consumption)?
What do 0-4 represent?
Thanks.
The ‘Add Status’ API does accept b1-b6 and will record them, but there is currently no method to view the data.
Update - You can click on the ‘Download’ link below the graph to review the uploaded battery data.
It isn’t, there will be an option to add/subtract the battery power (b1) value from v4
Currently, b1 is mandatory, b2-b6 values are ignored if b1 is missing.
This maps to the [telemetries.power] value on the SolarEdge or [battery.power] on the Powerwall
This will be based on the SolarEdge battery statuses -
- 0 (Invalid)
- 1 (Standby
- 2 (Thermal Mgmt.)
- 3 (Enabled)
- 4 (Fault)
As an exercise I have modified a script to start uploading data to b1 and b2 for my friend’s AlphaESS in addition to v8 and v9.
SoC [ State of Charge ] and RoC [ Rate of Charge ]
Okay. Normally you would adjust exports/imports instead of consumption, but since “Add Status” doesn’t upload exports/imports, I can see why you might want such an option.
The Daily/Weekly/Monthly/Yearly charts seem to calculate exports/imports if consumption is uploaded (and conversely calculate consumption if exports/imports are uploaded with the “Add Output” API). Will the battery stats be taken into account when auto-calculating exports/imports on these charts, and/or will exports/imports be able to updated? (At the moment, it seems that if you upload consumption, then the calculated exports/imports cannot be updated.)
Thanks.
For testing purposes, do you mind posting the system id?
Net data (import/export) is calculated from gross generation and consumption, since adding/subtracting the battery power will adjust the consumption value it will ultimately affect the resulting net data.
5-minute consumption/generation data added/updated via ‘Add Status’ will automatically recalculate import/exports.
Hi @bankstownbloke,
sid=66069
v7 → Internal Inverter Temperature from Fronius Symo
v8 → SoC of AlphaESS SMILE G3 B5 INV
v9 → Rate of Charge of AlphaESS SMILE G3 B5 INV
So far so good uploading to ‘b1’ and ‘b2’. I haven’t figured out how to extract the other data from the Alpha ESS yet. b3 etc.
2025-10-13 17:35
Inverter Temperature: 48C
Max Count: 1
https://pvoutput.org/service/r2/addstatus.jsp?key=XXXXXXXX&sid=66069&d=20251013&t=17:35:12&v7=48&v8=100&v9=-596&b1=-596&b2=100
OK 200: Added Status
Grannos
Thanks @grannos - b1 and b2 are now displaying on the live system page.
Please refresh the page.
Default graph colours can be changed under account ‘Settings’ -

Hi @bankstownbloke. Working great. Thanks.
Now I guess that it’s time to start digging a bit deeper in to Alpha ESS API.
Grannos
I’m uploading B1-B5 on my system 28198, if its of any use for testing.
When taking advantage of time-based feed-in tariffs, the formula consumption + battery power could result in a negative consumption number. I have no data between 6pm-7:15pm because I was exporting more than I was using.
I am trying to upload data that gives an accurate export/import, so I am pre-adjusting consumption by battery power before uploading. Of course, this can now result in negative consumption, which causes the upload to fail.
Do you have any suggestions?
Thanks.
sid=93768
What are the raw numbers for v4, v2 and b1 under this scenario?
{'d': '20251019', 't': '18:00', 'v2': 0, 'v4': 0, 'v5': 23.8, 'v6': 213.4, 'v7': 39, 'v8': 26, 'b1': -360.0, 'b2': 98.7, 'b4': 3246290, 'b5': 3183100}"
{'d': '20251019', 't': '18:05', 'v2': 0, 'v4': -3000, 'v5': 23.7, 'v6': 214.8, 'v7': 40, 'v8': 26, 'b1': -5880.0, 'b2': 96.2, 'b3': 24180, 'b4': 3246290, 'b5': 3183590}"
{'d': '20251019', 't': '18:10', 'v2': 0, 'v4': -3960, 'v5': 23.7, 'v6': 214.4, 'v7': 42, 'v8': 27, 'b1': -6960.0, 'b2': 93.6, 'b4': 3246290, 'b5': 3184170}"
{'d': '20251019', 't': '18:15', 'v2': 120, 'v4': -4440, 'v5': 23.6, 'v6': 209.8, 'v7': 44, 'v8': 27, 'b1': -6960.0, 'b2': 90.9, 'b4': 3246290, 'b5': 3184750}"
{'d': '20251019', 't': '18:20', 'v2': 120, 'v4': -3360, 'v5': 23.5, 'v6': 212.1, 'v7': 46, 'v8': 27, 'b1': -6960.0, 'b2': 88.2, 'b3': 24180, 'b4': 3246290, 'b5': 3185330}"
{'d': '20251019', 't': '18:25', 'v2': 0, 'v4': -5040, 'v5': 23.4, 'v6': 214.2, 'v7': 48, 'v8': 27, 'b1': -6720.0, 'b2': 85.7, 'b4': 3246290, 'b5': 3185890}"
{'d': '20251019', 't': '18:30', 'v2': 0, 'v4': -4920, 'v5': 23.3, 'v6': 207.9, 'v7': 50, 'v8': 27, 'b1': -6000.0, 'b2': 83.5, 'b4': 3246290, 'b5': 3186390}"
{'d': '20251019', 't': '18:35', 'v2': 0, 'v4': -5040, 'v5': 23.2, 'v6': 216.1, 'v7': 51, 'v8': 28, 'b1': -6000.0, 'b2': 81.2, 'b4': 3246290, 'b5': 3186890}"
{'d': '20251019', 't': '18:40', 'v2': 120, 'v4': -4920, 'v5': 23.2, 'v6': 213.6, 'v7': 52, 'v8': 28, 'b1': -5640.0, 'b2': 79.1, 'b4': 3246290, 'b5': 3187360}"
{'d': '20251019', 't': '18:45', 'v2': 0, 'v4': -5040, 'v5': 23.1, 'v6': 213.9, 'v7': 52, 'v8': 28, 'b1': -5640.0, 'b2': 76.9, 'b4': 3246290, 'b5': 3187830}"
{'d': '20251019', 't': '18:50', 'v2': 0, 'v4': -4920, 'v5': 22.8, 'v6': 214.1, 'v7': 53, 'v8': 28, 'b1': -5640.0, 'b2': 74.8, 'b3': 24180, 'b4': 3246290, 'b5': 3188300}"
{'d': '20251019', 't': '18:55', 'v2': 0, 'v4': -4920, 'v5': 22.4, 'v6': 219.3, 'v7': 53, 'v8': 28, 'b1': -5640.0, 'b2': 72.7, 'b3': 24180, 'b4': 3246290, 'b5': 3188770}"
{'d': '20251019', 't': '19:00', 'v2': 120, 'v4': -5040, 'v5': 22.2, 'v6': 209.5, 'v7': 53, 'v8': 28, 'b1': -5640.0, 'b2': 70.5, 'b3': 24180, 'b4': 3246290, 'b5': 3189240}"
{'d': '20251019', 't': '19:05', 'v2': 0, 'v4': -4920, 'v5': 22.0, 'v6': 214.2, 'v7': 54, 'v8': 28, 'b1': -5640.0, 'b2': 68.4, 'b3': 24180, 'b4': 3246290, 'b5': 3189710}"
{'d': '20251019', 't': '19:10', 'v2': 0, 'v4': -4920, 'v5': 21.9, 'v6': 209.6, 'v7': 54, 'v8': 29, 'b1': -5640.0, 'b2': 66.3, 'b4': 3246290, 'b5': 3190180}"
{'d': '20251019', 't': '19:15', 'v2': 0, 'v4': -3240, 'v5': 21.9, 'v6': 203.2, 'v7': 54, 'v8': 29, 'b1': -3840.0, 'b2': 64.8, 'b4': 3246290, 'b5': 3190500}"
{'d': '20251019', 't': '19:20', 'v2': 0, 'v4': 0, 'v5': 21.9, 'v6': 214.6, 'v7': 53, 'v8': 29, 'b1': -480.0, 'b2': 64.7, 'b4': 3246290, 'b5': 3190540}"
{'d': '20251019', 't': '19:25', 'v2': 0, 'v4': 0, 'v5': 21.9, 'v6': 213.8, 'v7': 51, 'v8': 29, 'b1': -480.0, 'b2': 64.5, 'b4': 3246290, 'b5': 3190580}"
{'d': '20251019', 't': '19:30', 'v2': 0, 'v4': 0, 'v5': 21.8, 'v6': 210.9, 'v7': 50, 'v8': 29, 'b1': -478.4, 'b2': 64.3, 'b3': 24180, 'b4': 3246290, 'b5': 3190620}"
{'d': '20251019', 't': '19:35', 'v2': 0, 'v4': 0, 'v5': 21.8, 'v6': 210.8, 'v7': 49, 'v8': 29, 'b1': -478.4, 'b2': 64.2, 'b3': 24180, 'b4': 3246290, 'b5': 3190660}"
{'d': '20251019', 't': '19:40', 'v2': 0, 'v4': 0, 'v5': 21.7, 'v6': 200.7, 'v7': 47, 'v8': 29, 'b1': -360.0, 'b2': 64.0, 'b3': 24180, 'b4': 3246290, 'b5': 3190690}"
{'d': '20251019', 't': '19:45', 'v2': 0, 'v4': 0, 'v5': 21.6, 'v6': 191.2, 'v7': 46, 'v8': 29, 'b1': -480.0, 'b2': 63.8, 'b4': 3246290, 'b5': 3190730}"
{'d': '20251019', 't': '19:50', 'v2': 0, 'v4': 109, 'v5': 21.6, 'v6': 184.8, 'v7': 45, 'v8': 28, 'b1': -335.4, 'b2': 63.7, 'b3': 24180, 'b4': 3246290, 'b5': 3190760}"
{'d': '20251019', 't': '19:55', 'v2': 0, 'v4': 0, 'v5': 21.5, 'v6': 170.2, 'v7': 44, 'v8': 28, 'b1': -480.0, 'b2': 63.5, 'b4': 3246290, 'b5': 3190800}"
Under this scenario, you’d like gross consumption calculated as
v4 = v4 - b1 ?
v4 = -5040 - (-5640)
v4 = 600
It would be best to handle this with a flag in the addstatus request e.g. &bc=1 so it won’t affect existing requests where this isn’t applicable.
