GridBank is the control brain for solar parks with batteries. It watches every 15-minute electricity price in your bidding zone, lets the sun fill the batteries, holds the energy, and sells it only in the most expensive slots of the day — inside a 12-rule safety guard, with every decision explained in plain language.
A battery earns by selling at a better price than it stored at. GridBank makes that the only thing it does — and refuses everything else.
Solar production goes into storage instead of being sold at midday prices. GridBank records every hour: what the panels made, when the battery got full, and whether the sun still to come will fill it again — with the time it will happen.
The engine ranks the next 24 hours of known prices and picks the top slots that can absorb what the battery holds. Every other slot is a HOLD, however tempting the plan looks. You always see the sell threshold, the next slot and how many MWh are waiting.
Discharge runs only in the chosen slots, only into the site's own bidding zone, only below the export limit of the grid connection — at full ramp, with minutes-to-empty and sellable MW shown live.
Most batteries today sit in an aggregator's pool and earn a fixed share. Most optimizers are a black box you have to trust. GridBank is built so you never have to.
| What matters to the owner | Fixed aggregator contract | Black-box optimizer | GridBank |
|---|---|---|---|
| Where the energy goes | Wherever the pool needs it | Unknown | ✔ Only the top-priced slots of your own zone, shown 24 h ahead |
| Grid buying | Pool decides | Often, silently | ✔ Never — unless you switch arbitrage on, with a margin gate and a daily cap |
| Why a decision was taken | ✗ | ✗ | ✔ Written reason for every slot, switch log with exact times |
| Proof before handing over control | ✗ | ~ backtests | ✔ Shadow twin runs on your real plant next to your current controller |
| Safety limits enforced in software | ~ pool's | ~ | ✔ 12 interlock-style rules, every veto logged |
| Connecting the plant | Their gateway, their installer | Integration project | ✔ 3 steps in the browser, or a box paired with a 6-digit code |
| Your data | Theirs | Their cloud | ✔ One zero-dependency binary — our cloud or your own server |
| Reserve markets (FCR / aFRR / mFRR) | ✔ (their contract) | ~ | roadmap — venues shown per zone, traded once the TSO prequalification exists |
Ranks every 15-minute price of the next 24 hours, picks the top slots that can absorb the stored energy (default: slots at ≥ 90 % of the day's high), sells there and nowhere else. Battery wear is priced into every cycle.
A dynamic-programming plan over 36 hours, 41 battery levels, three actions per slot, with the solar forecast and round-trip losses. Energy left at midnight is valued at tomorrow's good slots, so charge is carried overnight instead of dumped.
An Estonian site sells into EE, a Finnish one into FI — the guard vetoes anything else. Per site you set the export limit, the enabled venues and the strategy.
Buying cheap grid power to sell at the peak is off by default. Switched on, it fires only when the margin after losses, import fee and wear beats your threshold, under a daily buying cap.
Hourly and daily production, peak time, first and last sun, battery-full time, 7-day average, best day — and an outlook that says whether the sun ahead fills the battery and by when.
Solar underdelivering versus forecast is where plants silently bleed money. GridBank detects deviation within minutes, alerts you and replans the whole schedule to real conditions.
Whether the request comes from the optimizer, the rule engine or a manual button, the same guard checks it. Property-tested against 50,000 random states with zero violations. Every veto is logged with its reason.
A daily loss floor enforced in software. If the day's result ever touches it, the battery sells only at a clear profit until midnight — the system can recover, but it can never dig deeper.
Price-feed outages, offline sites, guard vetoes, skipped sell slots, battery-full events, failed logins — logged, de-duplicated and badged the moment they happen.
PBKDF2 password hashing, hashed session tokens, rate-limited logins, token-gated write API, secrets stored server-side and masked in the browser, strict CSP.
No box, no installer. Pick the plant, tap the portal your app already uses, type the same login or key, press Test. GridBank reads the portal itself from the cloud — nothing is installed at the site. Eleven brands and sources today; the box exists only for plants without any portal.
Eleven tiles in plain words. Each field says where to find the value — "SolarEdge portal → Admin → Site Access → API key".
One live read, nothing saved. The answer is a sentence: "Solar now 3.4 kW · battery charging 1.0 kW (55 % full) · sending 1.2 kW to the grid." If a sign looks wrong, flip a switch and test again.
The simulator switches off, the site starts in shadow mode, and the dashboard shows the link health: source, age of the last reading, readings today, gaps.
A small computer at the site. The dashboard gives a pairing code:
Whoever plugs in the box types one line with that code and it connects itself. The code works once and expires in 30 minutes. Or skip even that: the dashboard makes a pre-paired USB stick — on a Raspberry Pi it installs itself on first boot, on any plant PC one file is run. The stick carries a token for that site only, revocable from the dashboard. The box then fetches its settings from the dashboard — inverter address, sign conventions, poll rate, control mode — so nobody ever edits a config file.
The box scans the plant network for Modbus TCP devices, recognises SunSpec inverters, meters and batteries, and decodes power and state of charge from the standard models. Vendor-specific plants use the JSON path or the Advanced register map.
Solar, battery, grid and state of charge stream into the engine, which re-evaluates each site every cycle and at every 15-minute slot boundary. Telemetry older than 90 seconds idles the plant — fail-safe by design.
A battery that already sits with an aggregator keeps earning there while GridBank proves itself alongside. Nothing is dispatched until a real site is switched to ACTIVE by typing its name.
The engine decides every slot and values it at real prices. The guard blocks every dispatch at the lowest level (rule I12). Your current controller or aggregator keeps running the battery.
Same as shadow, but the setpoint API tells a human or the partner what GridBank would do right now, with the guard's verdict and the reason.
The box executes GridBank's setpoints — only while the server says ACTIVE, only with control explicitly enabled on the box, and it releases the battery to idle if it ever loses the server.
For every battery a virtual twin with the same specs runs GridBank's decisions through the same guard, against the real sun and the real prices. Its revenue sits next to what the plant actually earned under its current controller, and next to what the aggregator reports.
| Day | Solar MWh | GridBank twin € | Actual plant € | Difference | Aggregator reported € | Twin sell slots |
|---|---|---|---|---|---|---|
| Mon | 61.2 | 3 940 | 2 860 | +1 080 | 2 790 | 6 |
| Tue | 44.8 | 2 615 | 2 210 | +405 | 2 180 | 5 |
| Wed | 70.5 | 4 380 | 3 050 | +1 330 | — | 7 |
| Illustrative numbers. Real rows fill in day by day; the aggregator's figures are typed in or imported as CSV. | ||||||
The analyst sees every site's zone, strategy, sellable energy, solar record, outlook, guard vetoes and the shadow comparison. It judges by peak capture — how close to the daily high the energy was sold — never by market averages. In English, Estonian, Finnish, Russian or Spanish.
GridBank shows, per bidding zone, every venue a site could sell into and what each one requires. Only markets with a live price feed are ever traded automatically.
EE, FI, LV, LT — 15-minute auction, prices from the Elering feed, verified slot-exact. The baseline the engine trades on.
Continuous trading until an hour before delivery. Shown as an estimate; traded once your partner grants intraday access.
Baltic balancing energy and capacity markets (Elering) and Fingrid reserves. Requires a balancing-service-provider agreement and a prequalified battery; typical minimum bid 1 MW, aggregation allowed.
Grid connection contract → metering point in the data hub → balance responsibility via a supplier/aggregator or your own Nord Pool membership → reserves later. The dashboard walks you through it and GridBank produces the 15-minute schedules either way.
Go, standard library only, the dashboard embedded. Runs in our cloud or fully on-premise — plant data never has to leave your network.
English, Estonian, Finnish, Russian and Spanish — every page, every guide, every AI brief.
Bottom tab bar, big status chips, one-line reasons. Everything an operator needs at 06:00 from a phone.
Trade ledger per 15-minute settlement, switch log with reasons, CSV export, daily net revenue history.
Guard invariants, zone lock, export cap, solar-only charging, control-mode lock and the shadow twin are covered by automated tests on every build.
Watchdog restarts, persistent state, slot-boundary refresh, de-duplicated events. The engine has been running the public demo fleet on real prices since August 2026.
No. In shadow mode GridBank only reads the plant and decides on paper. Your aggregator keeps controlling the battery and earning its reserves. The Proof page then shows what GridBank would have earned next to what actually happened.
Not unless you switch arbitrage on. By default the sun is the only source. With arbitrage on, it buys only when the margin after losses, import fee and wear beats your threshold, under a daily cap you set.
Either a supplier/aggregator that already holds balance responsibility sells at the exchange price and GridBank sends it the 15-minute schedule, or a larger owner becomes a Nord Pool member itself. GridBank produces the schedules and bids in both cases.
For SolarEdge, Huawei FusionSolar, Victron VRM and Home Assistant: nothing — GridBank reads the portal. For everything else the GridBank box is paired with a 6-digit code and finds the inverter on its own.
The guard enforces reserve floor, rated powers, ramp rate, export limit, zone lock and control mode on every command, and a daily loss floor stops further loss. Every veto is logged. Real sites cannot be switched to ACTIVE without typing the site name.
In one zero-dependency binary that runs in our cloud or on your own server. Secrets are stored server-side and never shown unmasked in the browser.
A 30-day shadow pilot costs nothing and touches nothing. Connect the plant in three steps and read the Proof page in a month.