Energy journal
Right now
Connecting to your battery…
Price and battery plan
The height is the electricity price in ct/kWh, the colour what the plan does with the battery in that quarter hour, from midnight to the end of the plan. The lines are the battery level in % on the right: planned, and measured until now. Vienna time.
Working out the plan…
Discharge to the home
How many watts the battery gives to the home: what the plan says, and from midnight to now what it really gave. Charging shows in the chart above. Vienna time.
Today
From the Zendure app's energy history.
Your home's three phases
Waiting for the smart meter…
Each phase's use is what the smart meter measures there, plus what the battery covers on its own phase. The battery's grid-tied output feeds one phase only; whatever that phase does not use flows into the grid there and comes back on the other phases.
Your setup
Phases 1, 2 and 3 are the Shelly meter's clamps A, B and C. Your grid operator, or the meter's data sheet, says whether the meter nets the phases (“saldierend”). The main fuses are in the meter cabinet. The circuit breaker is the one in your apartment's panel that switches off the battery's socket: B13 is 13 A, C16 is 16 A.
What each phase uses
What to watch out for
Battery mode
Loading the battery's mode…
Switch the battery to another mode, as the Zendure app's mode picker does. The battery shows the new mode within a minute or two.
- ZENKI
- Zendure's AI plans charging from the prices and covers the home from the smart meter.
- Self-Consumption
- The battery covers the home's use from the smart meter reading.
- Time of use
- Follows the time-of-use settings in the Zendure app.
- Auto
- The Zendure app's automatic mode.
- Custom
- Runs the time slots set in the Zendure app. With no slots, the battery keeps its last setting.
- Dashboard plan
- This dashboard's charging plan, sent to the battery by the Mac poller in Custom Mode. If the Mac goes quiet for 10 minutes, ZENKI takes over again.
Time in each mode
Mode changes
Understand your charging.
Find out whether your own plan beats the Zendure app's AI, and see when your battery charged, how much energy it used, and what that energy cost.
Tap or drag on any chart to see the exact values at that moment. + and − zoom in and out, ‹ and › step from one reading to the next.
What the words on this page mean
- W (watt)
- Power: how fast energy flows right now. A kettle draws about 2000 W.
- kWh (kilowatt hour)
- An amount of energy: 1000 W for one hour. Your battery holds a few kWh.
- ct/kWh
- The electricity price: cents for each kWh.
- Battery level
- How full the battery is, in percent.
- Spot price
- The market price of electricity, new for every quarter hour. Siedla has the next day's prices from about 13:15 Vienna time; your fees come on top.
- ZENKI
- The AI mode in the Zendure app. It decides when the battery charges and discharges.
- This dashboard's plan (own plan)
- A plan this dashboard works out from your usual use and the known prices. It is only a suggestion: the battery doesn't follow it on its own.
- Charge from the grid
- The battery buys electricity, ideally while it is cheap.
- Discharge, or the battery covers the home
- The battery supplies the home, so less has to be bought from the grid.
- Hold
- The battery rests and the home uses the grid, so the stored energy is kept for a more expensive time.
- No battery, and Battery only covers the home
- Two yardsticks: what the same use would have cost without any battery, and with a battery that only empties into the home but never charges from the grid.
- Round trip
- How much of the energy bought for the battery reaches your home again. The rest is lost as heat while charging and discharging.
- Net cost
- What the electricity cost, corrected for the energy left in the battery at the end, so a plan that ends with a fuller battery isn't counted as more expensive.
- Off-grid outlet
- The socket on the SolarFlow itself, which also works without the grid.
- Grid meter
- The smart meter that measures what the whole home takes from or feeds into the grid.
- Vienna time
- All times are local time in Austria.
Own plan or ZENKI?
Whether running the battery on this dashboard's plan would beat letting the Zendure app's AI (ZENKI) run it, scored day by day with the real prices and your real use.
Scoring the days…
Each row is one way of running the battery; the amounts are what the electricity would have cost. Lower is better. The last row is the difference between ZENKI and this dashboard's plan.
Difference per day
Above zero, this dashboard's plan would have been cheaper that day; below zero, ZENKI was.
Every day
How the verdict is worked out, and where it is unfair
Charging plan
When to charge, discharge or hold the battery, from your usual use and the known prices.
Working out the plan…
Electricity price and the plan
The height is the electricity price in ct/kWh, the colour what the plan does in that quarter hour. Vienna time.
Planned battery level
How full the battery would be if it followed the plan. Before now, the solid grey line is how full it really was.
Did the battery follow this plan?
Every finished quarter hour of the time range, what this dashboard's plan said and what the battery did.
The upper row is this dashboard's plan: while it ran the battery, the plan in force at the time, otherwise as worked out at midnight. The lower row says whether the battery did it. Vienna time.
This dashboard Charge from the grid Discharge to the home Hold (home uses the grid) Battery at its minimum
Followed? Followed Partly: charged less or more, or stayed idle Not followed: didn't charge, or charged without a plan No plan or no readings
Where the plan wasn't followed
Pick one to show that moment in every graph on this page.
Day by day
How following the plan is judged
Each finished quarter hour is compared with the plan of its day, by the same rules as the app's plan on the Zendure app plan page. Charging counts as followed when at least 80% of the planned energy went in, or once the battery was within 3% of its upper limit. Holding means the battery should neither charge nor discharge more than 100 W on average. Discharging counts as followed while the battery covers the home without charging from the grid, or stays put at its minimum. Charging more than 100 W on average while the plan said to discharge counts as charging without a plan. Quarter hours without a plan (no prices that day) or with fewer than two five-minute readings are not judged.
Step by step
The plan in blocks of time: what the battery should do, and what it means for you.
Earlier plans in the time range
How the plan changed
Every plan revision in the time range
How plan changes are recorded
Every quarter hour the dashboard works its plan out again with the latest battery level, prices, weather forecast and settings, and keeps it. A new revision starts when any quarter hour up to the last published price says something different: another action, or charging power more than 300 W apart. Covering the home and sitting at the minimum count as the same. The part on estimated prices is left out, because it moves with every new day of prices. The Zendure app runs the battery, so its level often differs from what this plan expected, and the plan then changes with it. Small changes means nothing big changed, but the battery level, the forecast or the plan reaching a quarter hour further tipped a close choice.
How the plan is worked out
Adjust the battery settings →Shadow run
With every reading, the Mac works out what it would tell the battery for this plan and stores it. Nothing is sent to the battery and ZENKI stays in charge; this compares the two.
ZENKI is off. With every reading, the Mac tells the battery what to do for this plan; this compares the commands with what the battery did.
Where the dashboard and ZENKI differed
How fast the battery follows the house
The Mac reads the smart meter every second. When the house suddenly uses less while the battery gives power out, the extra goes into the grid unpaid until the battery turns down; when it uses more, the difference is bought until the battery turns up. Every such jump of 150 W or more is timed.
The drops that fed the most into the grid
Zendure app plan
What the Zendure app's AI mode (ZENKI) planned and plans, whether the battery did it, and how the plan changed.
Loading the app's plan…
Did the battery follow the plan?
Every quarter hour of the time range, what the app's plan said at the time and what the battery did. The graphs below share the same time axis; pointing at one shows the same moment in all of them.
Checking the plan against the readings…
The upper row is the app's plan as it stood at each moment: green charges from the grid (paler is lower power), blue lets the battery cover the home. The lower row says whether the battery did it. Vienna time.
App plan Charge from the grid Battery covers the home Discharge Not known
Followed? Followed Partly: charged less or more, or stayed idle Not followed: didn't charge, or charged without a plan No plan or no readings
Where the plan wasn't followed
Pick one to show that moment in every graph on this page.
Battery level: expected and actual
The solid line is how full the battery really was. The dashed lines are what the app's plan at the time expected and, ahead, what the current plans expect.
Planned and actual charging
The plan line shows what the app's plan said for each moment at the time, so its changes show up as steps.
Grid and home
What the SolarFlow drew from the home circuit (grid charging, and the outlet while the battery holds), what it gave the home, and the off-grid outlet. Five-minute averages.
Day by day
How following the plan is judged
Each finished quarter hour is compared with the newest plan the app had shown before it began. Charging counts as followed when at least 80% of the planned energy went in, or once the battery had reached the plan's charge limit. The app's charging at about 50 W means hold: the battery should neither charge nor discharge more than 100 W on average. Self-consumption counts as followed while the battery covers the home without charging from the grid, or stays put at the plan's battery floor. Charging more than 100 W on average while the plan said self-consumption counts as charging without a plan. Quarter hours without a recorded plan or with fewer than two five-minute readings are not judged.
Next 24 hours, next to this dashboard's plan
Paler charging means lower power. ZENKI's self-consumption follows the home's demand down to its battery floor. Vienna time.
How the plan changed
Every plan revision in the time range
What the app's plan contains
The app sends its plan with its AI energy report (tdengine/aiEms/energy), which
the collector already reads every 5 minutes. The plan is a list of periods covering the next
24 hours, starting at the current half hour. Each period is either charging from the grid at a
planned power and up to a charge limit, or self-consumption: the battery covers the home's
demand as it happens, down to a planned floor. The report also carries ZENKI's expected
battery level until midnight and its own price list. A new revision is recorded whenever any
period changes; a plan that only moved on by half an hour counts as the same plan.
This dashboard's plan against the app's
What each plan would have cost on the same day, with the same prices and the same home use.
Comparing the plans…
What each plan does
One row per plan, read from left to right through the day. The Measured row is what the battery really did.
Battery level
How full the battery would be under each plan, next to what was measured.
How the comparison works
Charging & costs
When the battery charged from the grid and what that energy cost. The filled area is the charging power, the lines are the electricity price at that time.
View a specific day
Battery charging in W · Price in ct/kWh · Vienna time
Charging periods
Energy purchased from the grid, with the battery level before and after each period.
Latest battery reading
Power flows
Above zero the battery supplies the home, below zero it charges. The other lines show what the SolarFlow sends into the home, what solar delivers and what it draws from the home circuit.
Battery level
How full the battery was, as a whole and for each pack.
The bigger picture.
Compare your days and months, or download the readings behind the charts.
Energy & cost summary
Totals cover the selected range. Gaps are flagged instead of treated as zero.
Energy per day
One group of bars per day: what solar delivered, what the SolarFlow sent into the home, what the battery charged and discharged, and what was bought from or fed into the grid.
Table
Download your data
CSV files include all selected readings, tariff rates and data-quality flags. Timestamps use UTC.
Unlock the dashboard to download these files.
Inspect five-minute charging readings
Month by month.
What you bought, what the battery saved and what it lost on the way.
When the battery pays for itself
The system price against what the battery has saved so far, carried forward at the rate measured since the grid meter was connected.
Working out the payback…
How the payback is worked out
Which battery size pays off best
Your stored days replayed with 1 to 6 packs: what each size would have saved with this dashboard’s plan, what it costs, and whether one more pack is worth it.
Working out the battery sizes…
How the sizes are compared
How efficient the battery really is
Of the energy bought to charge the battery, how much reached your home again: measured from the battery’s readings, its packs and the smart meter.
Round trip per day
Per month
Measuring the battery’s efficiency…
How the efficiency is measured
Cost and savings
Every month since the first reading.
Loading the monthly report…
Two bars per month: what you paid for electricity, and what the same use would have cost without the battery. The gap between them is what the battery saved.
Months
How the report is calculated
Edit your tariff →Dynamic tariff or fixed price?
What the same home use would have cost on a fixed-price contract, against what the dynamic tariff with the battery really cost.
Loading the comparison…
Months
How the comparison is worked out
Edit your tariff →Savings calendar
What the battery saved each day, three ways. The Zendure app values every kWh the battery discharged at the price of its hour and doesn’t take off what charging from the grid cost, the losses or unpaid feed-in. The net saving takes all of that off. Both are for the battery as the Zendure app (ZENKI) really ran it. Own plan is what this dashboard’s charging plan would have saved instead, worked out the way the Own plan or ZENKI? scoreboard scores each day.
How the own plan is scored: Own plan or ZENKI? →
What the figures mean, and why they can differ from the app
- In the Zendure app view, a day is the rise of the app’s own savings counter, which this dashboard stores from 5 October 2026, so it should match the app to within a cent or two.
- Days marked ≈ were not read that way, mostly days before the counter was stored. They apply the app’s rule to this dashboard’s readings: every kWh the battery discharged, at the price of its hour. In September 2026 that came within 5 cents of the app on 24 of 30 days.
- Days marked ≥ miss some readings or prices, for example when collection was stopped, so they show less than the app. Days without prices have no figure.
- Net saving is what the battery really saved while the Zendure app ran it: what the home would have cost without it, minus what you paid. Unlike the app, it takes off what charging from the grid cost, the losses, and energy fed into the grid unpaid, so it is much lower: September 2026 was €23.31 in the app and €4.99 net.
- Own plan is what this dashboard’s charging plan would have saved against no battery, from the scoreboard under Own plan or ZENKI? on the Overview: planned from your usual use and that day’s prices, played through the battery model with your real use, and ending the day at least as full as the battery really did. On ZENKI’s days, marked ≈, the battery never ran this plan, so it is an estimate. On the days this dashboard ran the battery (from 11 October 2026), it is what the grid meter recorded. A day ZENKI and this dashboard shared, or another mode of the app ran the battery for over an hour, counts for neither and is marked –.
- Compare the own plan with ZENKI scored the same way, shown when you tap a day, rather than with the net saving: the net saving is measured and values what is left in the battery differently. Days the scoreboard has not scored, because readings or prices are missing or a battery pack was added, have no own-plan figure.
Months
Where the app’s figures come from
Energy bought by price
Grid energy per month by the spot price of its quarter hour (before fees), split into what charged the battery and what the home used directly.
Ask about the data.
A question in your own words; the answer comes from the numbers on this dashboard.
Answers are written by an AI model (Google Gemma on Cloudflare Workers AI) from this dashboard's data. It can get things wrong: check the numbers on the pages it names.
Your Zendure system.
Device details, settings and all the information reported by your account.
Devices and all reported properties
Zendure app data
Make it yours.
Your tariff, refresh preferences and collection status in one place.
Language
The language of this dashboard and of the alerts. Automatic follows your browser; alerts are then sent in English.
Questions about the data
The Ask page answers questions with Cloudflare Workers AI. You can always ask once unlocked; visitors only when you allow it, and only as many questions a day as you set here.
Data sources
Where each kind of data comes from, over which connection, and whether it is arriving.
Checking the data sources…
Alerts
Checking the alert settings…
Install the free ntfy app on your phone and subscribe to the same topic. Anyone who knows a topic on ntfy.sh can read it, so use a hard-to-guess name; this page only shows it masked. A webhook gets each alert as a JSON POST. Each problem is sent once, and again when it is over. The checks run with every collection, once a minute. The battery alert clears 2 points above the floor.
The fuse and breaker alerts go out after one minute at 90% of the ratings entered on the Phases page and end after 15 minutes below 85%. The Shelly only measures what runs through it, so a wallbox on its own line is not counted. The plan alert goes out after half an hour in which the battery clearly did something else than the dashboard told it, the grid alert after 10 minutes with more than 100 W going into the grid while the battery gives out power. These go out right away; the delay applies to the other checks.
Email goes out through Cloudflare Email Service. It is free to addresses verified in the Cloudflare dashboard under Email Service › Email Routing › Destination addresses. The sender must be an address on a domain of yours that uses Email Routing in the same Cloudflare account.
Your electricity tariff
Gross rates in cents per kWh. Your confirmed handling fee is 1.44 ct/kWh.
Leave unknown network fees or levies blank. Enter 0 only if the charge does not apply. These rates apply throughout the selected history.
Battery for the charging plan
Leave capacity and round trip blank to use the reported packs (2.88 kWh each) and the efficiency measured over the last 28 days.
Round trip is the share of the grid energy used for charging that reaches your home again. It includes the inverter's losses, which are higher at low household loads. The grid output limit caps what the battery feeds into the home's wiring; the off-grid outlet can take the rest, up to the total discharge limit.
Battery control
ZENKI, the Zendure app's AI, runs the battery. In the shadow run the Mac poller also works out what it would tell the battery for this dashboard's plan, so the Charging plan page can compare the two; nothing is sent. With the dashboard in charge, ZENKI is switched off (the app's Custom Mode) and the Mac poller sends the plan's commands to the battery.
Both need the poller's new control.py on the Mac: pull the repository there and run poller/install_service.sh again. To stop the dashboard at any time, choose ZENKI here or ZENKI Mode in the Zendure app. If the Mac sends no readings for 10 minutes, ZENKI takes over again by itself.
In the Zendure app's Custom Mode, switch off all time slots first: they would run alongside the dashboard.
Weather for the charging plan
The plan reads the Open-Meteo forecast for this place at most once an hour. Where past weather measurably changed your home use, the forecast moves the expected use; solar panels add their expected output.
The default place is Vienna. Leave the panels at 0 kWp without solar. Direction counts from south: −90 is east, 90 is west.
Dashboard refresh
Choose how often this page updates. Cloud collection continues when the page is closed.
Cloud collection
Zendure connection
Checking how the collector signs in…
Paste the session token of an existing Zendure sign-in, for example the one the app uses (blade-auth
header, with or without bearer). It must belong to the account email above and is
stored encrypted. The collector shares the app's session and never signs in itself, so your app
stays signed in; it keeps no password. When the token stops working, paste a new one.
You can also paste the app's Authorization Cloud key (the key for Home Assistant). It never expires with the app's session and doesn't sign the app out, but it only gives live battery data over MQTT: charge level, power flows and packs, once a minute. The app's history, energy totals and plan still need an access token.
Siedla prices
Siedla is the only price source. It has tomorrow's prices from about 13:15 Vienna time, around four hours before SmartEnergy, so the charging plan can use them sooner. In Siedla, create an API key with read access under Account, API keys, and paste it here. It is stored encrypted and never shown again. Save an empty field to remove it; without a key no new prices are collected.
Historical import
Checking historical coverage…
Imports each completed day and resumes automatically on Cloudflare. The initial start date comes from the available battery records; choose an earlier date to check for older data. Today is collected separately.