Reference: Glossary, File Formats & Troubleshooting
At a glance
This appendix is the lookup reference you reach for after you know your way around the tabs: it defines every line of the loss diagram, every file pvSpline reads and writes, and every acronym on the report cover.
Use the loss-cascade glossary to read a Sankey diagram line by line — each entry lists the on-screen name, where in the chain it applies, and what it physically means.
Use the file-format reference to understand what a
.pvspline.jsonproject stores (including the embedded weather and consumption series that let a project open with no network), what the.PAN/.OND/.BTRimports and the CSV/XLSX/PDF/JSON exports contain, and how large a file you may upload.Use the acronym glossary, the keyboard and mouse reference and troubleshooting / FAQ when something is unclear or a run fails.
Nothing here needs a project loaded — it is pure reference, and every section is a bookmarkable anchor on its own page. For the physics behind the numbers see Simulation Physics & Data Reference; for the views that produce them see Running a Simulation & the Production Tab, Charts, Heatmaps & Tables and Reporting & Export.
The loss cascade, line by line
Every pvSpline simulation produces a single ordered loss cascade: the chain that turns the sunlight arriving on your modules into the energy delivered at the meter. It is what the Sankey loss diagram (Charts, Heatmaps & Tables) and the report loss page (Reporting & Export) draw, and it is the same order in the PDF, the CSV export and the on-screen chart. The order is canonical and fixed — irradiance first, grid connection last — so an auditor can match it line for line against a PVsyst loss diagram.
A few conventions make the diagram readable:
Most lines are losses: the energy shrinks as you go down. A handful are gains (a credit, drawn as a positive step): transposition, bifacial rear-side, LCPV concentration and the battery outage-recovery credit — and temperature, on a site where cold hours outweigh hot ones.
Some lines are ghost entries. The physics solver already subtracted that energy upstream (for example far/horizon shading is baked into the plane-of-array total before the cells ever see it); the ghost line surfaces the hidden amount for the diagram without deducting it twice.
A line only appears when it is non-zero for your project. A fixed-tilt rooftop with no trackers, no optimizers and no transformer shows perhaps a dozen lines; a large ground-mount with trackers, combiners, MV/HV transformers and a weak grid shows most of them.
On the diagram a label may carry a qualifier that says how its number was obtained — (hourly integrated), (computed), (scheduled), (STC, local), (3-D bake) and the like — after the names listed below.
Each line carries a provenance tag (see Reporting & Export) recording where its number came from: a value you typed, a PVGIS-attested breakdown for your exact site, an Open-Meteo-computed weather loss, or an hour-by-hour integration over your sized bill of materials.
The table below lists every line in cascade order, grouped by the stage it belongs to.
| The unified loss cascade, in canonical top-to-bottom order. | |
|---|---|
| Loss-diagram line | Meaning |
| Transposition stage | Horizontal irradiance re-projected onto the tilted array. |
| Transposition (GHI → POA) | Gain. The extra irradiance a tilted, oriented plane collects versus the flat horizontal ground value. Positive because a well-aimed array sees more sun than the weather station's horizontal sensor. |
| Far shading (horizon) | Ghost. Direct beam blocked by the distant terrain silhouette (the 36-point PVGIS horizon or a sampled skyline). Peeled off the plane-of-array total before the cells convert it. |
| Inter-row shading | Ghost. Near-field mutual shading between neighbouring low-tilt rows on East–West dome layouts, plus any sky-view masking on flat-plate arrays. A 3-D shading bake renames it after what it measured (for example Near shading — sky masking (3-D bake)). Zero for an open-field single row. |
| Tracker backtracking / rotation limit | Ghost. Plane-of-array irradiance a single-axis tracker gives up by sitting at its backtracked or limit-saturated rotation instead of the ideal-tracking angle the PVGIS irradiance was computed for (Tracking). Only on a tracker with a backtracking GCR above 0 or a rotation limit; zero for fixed tilt and for ideal tracking. |
| Wind stow (wind-stow) | Ghost. Energy given up when trackers are driven to their safe stow angle in hours whose wind speed exceeds the configured threshold. Zero for fixed tilt or when wind-stow is off. |
| Optical stage | What is lost before the cells convert anything. |
| Concentration gain (LCPV) | Gain. Extra beam the low-concentration optics (troughs, V-troughs, CPC) deliver to the cell. Only on LCPV projects. |
| LCPV — optical losses (reflector/lens) | Absorption and soiling in the LCPV reflector or lens stack. |
| LCPV — outside the acceptance angle | Beam that misses the concentrator's acceptance cone (seasonal / pointing miss). |
| LCPV — rejection of diffuse radiation | Sky-diffuse light a flat plate would have kept but a concentrator rejects. |
| Mutual shading — beam (rows/brise-soleil) | Direct-beam fraction one unlimited row or louver casts on the next. |
| Near shading — vegetation (3-D bake, canopy) | The share of the near-field beam shading that came from vegetation rather than from terrain, rows or buildings — trees attenuating the beam, measured against the canopy in the 3-D scene. Split out of the row-shading beam line (which keeps the opaque-geometry part), so the two together are what one line used to be. Appears only on projects whose 3-D shading bake saw a canopy (The 3D Earth Site View). |
| Mutual shading — diffuse + ground (rows/brise-soleil) | Diffuse and ground-reflected fraction masked by neighbouring rows or louvers. |
| Angle of incidence | Reflection off the glass when light strikes off-perpendicular (IAM). Read from the module's own measured IAM curve where available. |
| Soiling | Dust and dirt on the glass. Computed by the Kimber model from the Open-Meteo rainfall that washes the modules and, for the years the air-quality record covers, its PM10 dust (other years take the model's constant daily soiling rate). A typed percentage applies when the project has no Open-Meteo record or Auto (weather) is off. |
| Snow | Snow cover on the modules. Computed from Open-Meteo snowfall (Marion model) when available. |
| Spectral | Mismatch between the real solar spectrum (air mass, water vapour) and the STC reference spectrum. |
| Module physics stage | Conversion of plane-of-array light to DC power. |
| Module conversion (STC) | The core photovoltaic conversion at Standard Test Conditions: plane-of-array irradiance × the module's rated STC efficiency. The single largest “loss” by magnitude (most sunlight is not converted). |
| Concentrator — optics (lens/mirror) | HCPV Fresnel-lens / mirror optical efficiency loss. HCPV projects only. |
| Spectral utilisation factor (UF) | Multi-junction spectral utilisation loss on HCPV triple-junction cells. |
| Acceptance angle / pointing | HCPV acceptance-angle and tracking-error pointing loss. |
| Irradiance level | IV-curve non-linearity at low light (the “IL” / low-light loss). Only when the single-diode solver ran. |
| Temperature | The net effect of cell temperature over the year: power lost in the hours the cell runs hotter than 25 °C, less the power gained in the colder ones, so on a cold site it can come out as a gain. Usually the largest physics loss after STC in hot climates. |
| Bifacial gain (rear face) | Gain. Rear-side irradiance harvested by bifacial modules, with snow-aware ground albedo. |
| Mutual shading — electrical effect (rows/brise-soleil) | Extra power a partially-shaded module loses to string-limiting and bypass diodes, beyond the pure geometric shadow. |
| Module quality | Datasheet-versus-measured power tolerance (typically 0.5–1.5 %). |
| LID (year 1) | Light-induced degradation in the first year of operation. |
| Mismatch | Module-to-module manufacturing spread within a string. |
| DC & inverter stage | Wiring, optimizers and DC→AC conversion. |
| DC ohmic losses | I2R heating in the DC string and array cabling. Computed from your sized conductors when a bill of materials exists, else a flat percentage. |
| LCPV — non-uniform flux | DC derate from inhomogeneous illumination across an LCPV cell. |
| Combiner ohmic losses | Busbar, fuse and connector I2R inside combiner boxes. |
| Optimiser — conversion losses | Partial-load conversion penalty of module-level DC optimizers (Tigo / SolarEdge class). |
| Optimiser — power clipping | Energy clipped at the optimizer's power limit. |
| Optimiser — current clipping | Energy clipped at the optimizer's current limit. |
| Inverter | Inverter conversion loss along its partial-load efficiency curve. The operating-envelope buckets below come on top of it, each a distinct loss. |
OP_Oper / IL_Oper (MPPT efficiency) | Maximum-power-point tracker overhead — the tracker never sits exactly on the true peak. |
OP_Pmin / IL_Pmin (Pdc < threshold) | DC input below the inverter's start-up threshold; the inverter produces nothing. |
OP_Pmax / IL_Pmax (clipping) | DC power above the inverter's AC nameplate; the excess is clipped (the classic oversizing loss). |
OP_Vmin / IL_Vmin (Vdc < Vmppt min) | String voltage below the MPPT window; the inverter is forced off its optimum on the low rail. |
OP_Vmax / IL_Vmax (Vdc > Vmppt max) | String voltage above the MPPT window; forced off-optimum on the high rail. |
IL_Night (night-time consumption) | Inverter standby / auxiliary draw overnight. |
| Reactive power / cos(φ) | Active-power curtailment when a non-unity power factor forces apparent power to stay inside the inverter's kVA envelope. Only on projects with a grid cos(φ) setpoint. |
| AC & grid stage | From the inverter output to the meter. |
| AC ohmic losses | I2R in the low-voltage AC cabling from inverter to switchgear. |
| MV transformer losses | No-load (iron) plus load (copper) losses of the medium-voltage step-up transformer(s). |
| HV transformer losses (step-up) | Iron plus copper losses of an optional grid-side high-voltage transformer. |
| MV line ohmic losses | I2R in the medium-voltage line from the transformer to the point of connection. |
| Auxiliaries | Continuous parasitic AC load: fans, monitoring, tracker motors. |
| Availability | Planned equipment-side downtime: maintenance, outages, curtailment. |
| Grid unavailability | Unplanned grid-side losses: voltage/frequency-ride-through trips, brown/blackouts and the inverter's reconnection delay. |
| Battery recovery (backup) | Gain. kWh a battery delivered to the local load during a grid outage in backup-dispatch mode — drawn as a recovery credit against the grid-unavailability loss. |
| Degradation stage | Ageing over the project life. |
| Module degradation (year N) | Multi-year module ageing beyond LID, for simulation years after the first; grows with the year simulated. |
Note
The inverter is reported on an Inverter line — its partial-load conversion — followed by up to six OP_*/IL_* buckets for the operating envelope (MPPT tracking, start threshold, clipping, the two voltage rails, night consumption), which reconcile line-for-line with the two variable sets PVsyst exports. Each line is a distinct loss, so nothing is counted twice.
Tip
To find which loss is eating your yield, sort the loss page by magnitude. On oversized arrays the culprit is usually OP_Pmax (inverter clipping) — lower the DC/AC ratio or add DC-coupled storage (Storage, EV & Specialized Systems). In hot climates it is Temperature — improve back-ventilation or pick a module with a lower temperature coefficient. When inverter clipping costs 2 % of production or more on a grid-connected system, the run flags it itself on the Warnings card of Results (Charts, Heatmaps & Tables), naming the kWh lost, the inverters' AC rating, the array's kWp and the DC:AC ratio.
File formats
The project file: .pvspline.json
A pvSpline project is a single self-contained JSON document. It stores everything about the project: name and client details, the site (latitude, longitude, altitude, time zone, country), every array polygon (tilt, azimuth, ground coverage, albedo, tracker type, the panel it uses, its peak power), the tariff structure, capacity subscription, battery configuration, time-of-use windows, EV sessions, export-limit schedules, and the batch study from the Batch tab — its scenarios, results and chart axes — that the report's comparison page is printed from.
Note
Since schema 8 the file also embeds the fetched weather and consumption series — the PVGIS irradiance, the Open-Meteo rainfall/snow/temperature and the Enedis metered load — inside a dataPayloads block. That is what lets you email a project to a colleague, or open it on a plane, and have it simulate identically with no network connection. A project saved to your account keeps them too: the series, and any imported weather file, are stored beside the save and come back when you open it. Its Enedis series is removed from every saved version once the customer's authorisation for that delivery point is no longer in force, and only a new authorisation lets you download it again (When your client's authorisation expires); until then a run warns that the delivery point has no embedded consumption series. A save that could not store its series reopens without them: its weather is fetched again before its next run, so a project whose weather came from an imported file runs on PVGIS until you import the file again. Later schemas added the sized electrical bill of materials, floating-PV flags, component prices, the 3D map calibration offset and customer-contact fields, all on the same self-contained principle. Since schema 19 the drawn footprint of each array travels too (the vertex ring you drew on the map), so a project opened on another machine redraws exactly as you left it; schema 26 added a provenance record for the embedded series — what window each one covers, when it was fetched and from where — so a reviewer can tell a fresh dataset from a two-year-old one; schema 29 embeds the two pictures of a 3-D shading bake (the horizon panorama and the near-shading view), so they reopen beside the numbers they illustrate, in a downloaded file and an account save alike; and schema 30 records the site's design cold temperature — the coldest daylight hour of the embedded multi-year Open-Meteo record — which a planned string layout's cold-voltage check uses when no site minimum is set (Deciding and applying).
Note
That self-containment is the format's user-facing promise, and it is what makes the web version workable: the project you open in a browser tab is the whole study. Nothing is left behind on a server you have to be logged into, and nothing has to be re-fetched before it will simulate. The same single file is what you download, what you e-mail, what you drop back onto the app, and what is posted to the engine when you press Run the project.
Every project file carries a top-level schema integer. The current version is 31. pvSpline handles version skew automatically:
Older files are migrated up one version at a time when you open them, so an old project keeps working after you update the app. Files below the supported floor (schemas 1–4) are refused — open them in an older release and re-save to upgrade.
Newer files (a file written by a release newer than the engine answering) open with a soft warning and read only the fields that engine understands. It will not write such a project back out at the older version — it refuses rather than silently drop the newer data, so a round trip through an older engine cannot quietly damage the file.
A missing or zero
schemais rejected outright.
Caution
The project file is the single source of truth for a project. A project saved to your account keeps a version history you can browse and restore from (The Project Tab); a file you downloaded to your own disk keeps none — so put anything client-facing under version control or a backup regime. Overwriting a downloaded file is not undoable.
Imported component datasheets: .PAN / .OND / .BTR / .PMP
pvSpline reads the native PVsyst component datasheet formats directly, so your existing library imports with zero re-entry (The Component Catalogue) — in the web app, by anyone holding the Manager or Admin role in your company:
.PAN— a PV module: electrical parameters, the temperature coefficients, the maximum system voltage it is certified for (IEC and UL), and the measured incidence-angle (IAM) and low-light curves..OND— an inverter: nameplate, MPPT window, and the efficiency curve (Euro/CEC or the full imported curve)..BTR— a battery: capacity and electrical characteristics..PMP— a solar-pump curve (head versus flow), for the water-pumping system type.
These files are Windows-1252 encoded and use PVsyst's PVObject_ section syntax; pvSpline tolerates unknown keys. Importing brings the component into your catalogue — it does not import a whole PVsyst project (.PRJ) or variant.
What you can import in the browser
Every import is an ordinary file picker: click the button, pick a file from your own computer, and the app reads it. Some files are parsed in the browser and never leave it; the rest are sent to the engine, which parses them and hands back the result. Nothing is stored server-side except a cloud upload used to carry a large file to the engine (see below).
| Files the web app accepts, where you pick them, and what they bring in. | ||
|---|---|---|
| What | Where | Notes |
.pvspline.json project | Project /project | Parsed in the browser; it becomes the working project. Replacing an unsaved project asks first. |
.PAN .OND .BTR .PMP | Catalogue /catalogue | PVsyst module, inverter, battery and pump datasheets. The Diagram view also accepts a .OND directly on an inverter row: anyone can load one into the row, and with the Manager or Admin role it is also added to your company's Inverters catalogue. |
.yaml / .yml | Catalogue /catalogue | Combiner boxes, cables, generators and utility tariffs — the catalogue's own seed format. |
.epw .tmy3 .csv .json weather | Production /production | An hourly weather file to simulate against instead of the fetched series. |
Electricity bill (.pdf) | Project /project | Reads a French supplier invoice and fills the tariffs, the peak/off-peak schedule and the monthly consumption from it. You review what it parsed before applying. |
PVGIS report (.pdf) | Production /production | Reads a PVGIS site report back into the project for comparison. |
Hourly tariff / Tempo calendar (.csv) | Project /project | An 8760-row price curve (8784 rows for a leap year, whose 29 February is dropped), or a day-colour calendar. |
.kml site outline | Map /map | Brings polygon outlines in as array zones with the drawing defaults. |
.dxf CAD drawing | Map /map | Places the drawing's closed outlines — in its map grid, or centred on the view — and imports them as array zones. |
| Georeferenced image | Map /map | A GeoTIFF, or a .png / .jpg with its world file and .prj, drawn under the zones as your own imagery. |
| 3-D building model | Map /map | .glb .gltf .dae .3ds .fbx .obj .stl, converted by the engine for the 3-D scene. |
Batch scenario .csv | Batch /batch | Parsed in the browser. You can also drop the file onto the authoring board. |
Report theme .json | Results /results | Parsed in the browser; loads a saved report design. |
Measured-production .json | Production /production | A real metered series, to hold the simulation against. |
Settings .json | Account page /account/preferences | Parsed in the browser; restores an exported preferences document. |
| Video file | Video player /video | Open a video file… plays a clip from your computer in the player. It stays in the browser and is not kept after the tab closes. |
Images (.png .jpg .bmp) | Results /results | Report and theme artwork, and the DP7/DP8 site photographs of a permit dossier. |
Note
Every one of these is a browser file picker, which means the app can read a file you choose but can never reach into your file system on its own, and never writes back to the file you picked. Changes live in the working project until you download it again or save it to your account.
How large a file you can import
Every file picker checks the size before it reads anything, and refuses an oversized file by name with both numbers: what your file is, and what the ceiling is. The ceiling is not arbitrary — it is the real limit of whatever would otherwise have refused the upload, so the app never turns away a file the platform would have taken.
| Import size ceilings, as the app states them. | ||
|---|---|---|
| Kind of import | Ceiling | Why that number |
| Anything sent to the cloud — datasheets, catalogue YAML, weather files, bill and PVGIS PDFs, tariff CSV, KML, DXF, georeferenced images, 3-D models | 25 MB | The cloud service's own per-file ceiling. The file is uploaded once and referenced, so this is the number that applies — not the smaller request limit. |
| Files parsed in the browser — project, settings, batch CSV, report theme, measured-production series | 67 MB | Nothing on the network constrains these; the ceiling exists only so a pathological file cannot hang the tab. |
| Pictures — report and theme artwork, permit photographs | 25 MB | The browser has to decode the original at full size before the app shrinks it, so the picked file is what needs bounding. |
Exports: PDF, CSV, XLSX, JSON, SVG, PNG
Everything you export arrives as an ordinary browser download, saved wherever your browser puts downloads. The engine renders it and hands the bytes back; nothing is written on your disk without you.
PDF — the branded client report from the report workspace on Results (
/results, Reporting & Export): themed cover with your logo and the verification QR code (Report verification), a plan of your arrays over orthophoto imagery where it is available, the single-line diagram, the charts you ticked at high resolution — the Sankey loss diagram among them — and the financial projection with its performance footer. It is written in the interface language — for a cloud run, the one the page used when the run started. Its other tabs export the tender dossier, always in French, the permit package and the Consuel technical file.XLSX — the financial projection as a one-sheet Excel workbook (the table, its summary block and the column legend) and the bill of materials, both from Results.
CSV — the bill of materials from Results, the scenario board from Batch (Export CSV…).
PNG — any chart of a finished run, rendered server-side at report resolution (Charts, Heatmaps & Tables).
SVG — the one-line diagram, from the menu beside Download PDF on Results or the canvas menu of Diagram (Exporting the diagram and the bill of materials). The drawing is also exportable as a PDF. Both are drawn in the interface language.
JSON — the working project as a portable file (Project), your preferences (the account page), and a report theme.
Note
Exporting the PDF report ships the report stored with the run you are previewing; it does not re-run the project first. If that run no longer matches the project on screen, its Stale badge beside Run the project says so — press Run the project, wait for the new run, then export (What an export ships). With no run at all, exporting runs the project first.
Note
Cloud runs carry their artefacts with them: once a plain cloud run succeeds, View result on its row in Cloud runs on Account (Cloud runs: the job history) opens it on Results, and its report, workbook, dossier and chart images are fetched straight from storage.
Tariff catalogue files (.yaml)
Utility-rate plans are small YAML files, one tariff per file. They ship with the catalogue, and you can add your own from the Catalogue view's Tariffs tab (/catalogue). They carry the provider and plan name, country/currency, validity dates, the buy mode (flat, HP/HC, seasonal HP/HC, hourly CSV or EDF Tempo), the per-period rates, the network/subscription charges and the surplus feed-in tariff. Applying a catalogue tariff to a project is copy-on-apply: the values land on the project's own tariff inputs — the Granularity of the GRID PRICING card included, when the file sets one — and they are not linked. Rates in these files are in cents per kWh, not €/kWh: a file's 21.46 shows as 0.2146 on the project's rate fields.
Glossary of terms & acronyms
| Terms and acronyms used across pvSpline and this manual. | |
|---|---|
| Term | Meaning |
| GHI | Global Horizontal Irradiance — total sunlight on a flat horizontal surface (W/m2). |
| DNI | Direct Normal Irradiance — the beam component measured perpendicular to the sun. |
| DHI | Diffuse Horizontal Irradiance — scattered sky light on a horizontal surface. |
| POA | Plane-Of-Array irradiance — the light actually reaching your tilted, oriented modules. |
| TMY | Typical Meteorological Year — a synthetic representative year assembled from multi-year records. |
| IAM | Incidence-Angle Modifier — how much light is lost to glass reflection as the sun moves off-perpendicular. |
| STC | Standard Test Conditions — 1000 W/m2, 25 °C, AM1.5; the reference under which modules are rated. |
| AOI | Angle Of Incidence — angle between the sunbeam and the module normal. |
| LID | Light-Induced Degradation — first-year power loss when a module is first exposed to sunlight. |
| PR | Performance Ratio (IEC 61724-1) — delivered energy divided by the ideal STC energy for the collected irradiance; the headline quality metric. |
| kWp / kWc | Kilowatt-peak / kilowatt-crête — the DC nameplate power of the array at STC. kWc is the French form of kWp; they are identical. |
| kVA | Kilovolt-ampere — apparent power; the sizing unit for inverters and grid connections. |
| Yf | Final (specific) yield — annual energy per installed peak power, kWh/kWp/yr; the banker's headline number. |
| Yr | Reference yield — annual POA irradiation expressed as equivalent peak-sun-hours. |
| Capacity factor | Delivered energy as a fraction of running at full nameplate every hour of the year. |
| MPPT | Maximum Power Point Tracker — the inverter circuit that keeps a string at its optimal voltage. |
| GCR | Ground Coverage Ratio — module area divided by ground area; drives inter-row shading. |
| SOC / SOH | Battery State Of Charge (how full, now) / State Of Health (capacity retained versus new). |
| DoD | Depth of Discharge — how deeply a battery is drained per cycle. |
| cos(φ) | Power factor — ratio of active to apparent power; a grid-code setpoint below 1 curtails active power. |
| P50 / P90 | Probability of exceedance — the annual yield that will be beaten 50 % (median) / 90 % (conservative, lender case) of years. Also P75, P99. |
| σIAV | Inter-annual variability — the year-to-year yield spread that sets the width of the P50/P90 distribution. |
| LCOE | Levelised Cost Of Energy — lifetime cost per kWh produced; the break-even price. |
| NPV / VAN | Net Present Value (French Valeur Actuelle Nette) — the lifetime equity cash flow, discounted at the cost of equity (not at the WACC, which only the LCOE uses). |
| IRR / TRI | Internal Rate of Return (French Taux de Rendement Interne) — the discount rate at which the present value of the pre-tax cash flow is zero. pvSpline quotes it in two forms: the project IRR, on the whole installation cost (the summary under the financial projection's CSV and Sheets exports), and the equity IRR, on your own funds after loan repayments (the line under the financial projection on Results, tagged (equity) when a loan makes the two differ, the batch results, the bankability sensitivity table, the workbook and the PDF report). Without a loan the two are equal. |
| DSCR | Debt-Service Coverage Ratio — cash available divided by debt due in a period; a lender solvency test. |
| LLCR | Loan-Life Coverage Ratio — discounted cash over the loan life divided by outstanding debt. |
| TOU / HP-HC | Time-Of-Use tariff; French Heures Pleines / Heures Creuses (peak / off-peak) periods. |
| Tempo | EDF dynamic tariff with blue/white/red day colours at different prices. |
| PRM | French Enedis meter identifier (14 digits) used to pull metered consumption. |
| TURPE | The French regulated grid-use tariff bundled into network charges. |
| Enedis | The French distribution-grid operator; source of metered load data. |
| PVGIS | The EU Photovoltaic Geographical Information System — free per-site irradiance, TMY and horizon. Its TMY, downloaded as CSV or JSON, is a weather file pvSpline can import; its EPW download is not. |
| Open-Meteo | Hourly weather archive built on the Copernicus ERA5 / ERA5-Land reanalyses, with the CAMS air-quality record for particulates; pvSpline's cloud is designed to read it from its own Open-Meteo server. It feeds the soiling (rainfall and PM10) and snow models, the precipitable water of the spectral correction, the snow-covered ground albedo, the optional wind channel, the 3-D view's real weather and the cold design temperature that planned strings are checked against. |
| EPW / TMY3 | Industry-standard hourly weather file formats pvSpline can import; a typical year among them, whose months come from different years, is placed on one calendar year. |
| NSRDB | The US National Solar Radiation Database; its CSV download, a single year or a typical year, is a weather file pvSpline can import. |
| Solcast | Satellite-derived irradiance and weather service; its CSV export, a historical time series or a typical year, is a weather file pvSpline can import. |
| Solargis | Satellite-derived solar resource database; its CSV time series and TMY files are weather files pvSpline can import. |
| BOM | Bill Of Materials — the sized list of conductors, boxes and components with cable lengths. |
| LCPV / HCPV | Low- / High-Concentration Photovoltaics — optics that concentrate sunlight onto the cell. |
| V2H | Vehicle-to-Home — discharging an EV battery to power the building. |
| Backtracking | Trackers rotating away from the sun at low angles to avoid shading the next row. What it costs is the Tracker backtracking / rotation limit line of the loss diagram. |
| Sankey | The flow diagram that draws the loss cascade as a shrinking energy ribbon. |
| Engine | The simulation program the browser talks to. It is not part of the page: the app sends it a project and it sends back results. |
| Run | One simulation of one project. You start it, Results says where it stands, and the results fill in when it lands. |
| Job | The queued unit of work behind a run — also used for a batch sweep, an optimisation, a weather fetch or a tile build. Jobs have an id, a status and a history you can go back to. |
| Stale | The badge a results view shows once the project has drifted from the run being displayed. It reads Stale — the project changed since this run. |
| Quota / allowance | The metered budget a cloud account spends, renewed on the 1st of each month. Engine time (cloud runs), 3-D streaming, tile builds and the cloud API are counted in seconds, file imports in megabytes; on a subscription each member has their own allowance of each, and on the free plan the whole company shares one of each. All are shown on Account, and every plan's figures are in Monthly allowances by plan. |
| Engine-second | The unit cloud compute is counted in: one second of engine time. A light run costs about one. |
| Streaming second | The unit 3-D streaming is counted in, from a session's first frame to its end — a separate allowance from engine time. |
| Tile build | One queued build of the 3-D map tiles for a project area, charged the seconds its build runner spent on it. |
| Cloud API time | The seconds of server time spent answering your requests, counted against a monthly allowance on every plan — your own on a subscription, your company's on the free plan. Signing in and the account and billing pages are not counted. |
| Verified account | An account whose email is confirmed and whose company's SIREN was found active in INSEE's Sirene register. A new account's free plan starts once it is verified, and subscribing needs it too (Verifying your account). |
| Seat | One person on a company plan — or one service token made for a server, a container or a CI pipeline, which takes a seat too. Seats limit who can sign in; the compute budget is shared, not per seat. |
| Role | What an account may do in its company, shown on Account as Profile: {role}. The first account of a company holds the Manager role: it sees every project and run of the company, manages the members and the billing, and may change the company's catalogue. Colleagues who join later are User — their own projects and runs — until a Manager account promotes them (Roles, and what a manager can change). Admin is pvSpline's own support staff. |
| Save / version | A project stored in your account. Every save appends a version, so you can look at an earlier one and restore it. |
| Bake | Measuring beam shading and sky view against the real 3-D scene rather than the analytic row model. The resulting tables are stored in the project and used by the next simulation. |
Keyboard & mouse shortcuts
pvSpline is a point-and-click application: nearly everything is a button on the view you are in, and no shortcut is the only way to reach an action. The bindings below are the ones that exist. Everywhere it says Ctrl, macOS uses Cmd.
Anywhere in the app
Three shortcuts are bound to the whole window, whichever view you are on.
| Shortcut | Action |
|---|---|
| Ctrl+Enter | Run the working project and go straight to its results. Any card you were still editing is committed first, so the run includes what is on screen. |
| Ctrl+Z | Undo the last change to the project. A short toast names what was undone. |
| Ctrl+Shift+Z or Ctrl+Y | Redo. |
They deliberately stand down in four situations, so they never fire when you meant something else:
while the cursor is in a text box, number field, dropdown or rich-text area — Ctrl+Z then belongs to the field you are typing in;
while the licence agreement is on screen, which owns the whole window until you accept it;
while the report theme editor or the permit dialog is open — those take the keyboard over, with their own bindings (below);
whenever Alt is also held.
Watch out
There is one global mouse rule worth knowing. Rolling the wheel over a number field, slider, date/time field or dropdown that does not have focus scrolls the page instead of changing the value. This is deliberate: scrolling past a form must never silently alter it. Click into the control (or Tab to it) first, and the wheel adjusts it normally.
Map (/map)
| Gesture | Action |
|---|---|
| Click (while drawing) | Add a vertex. Clicking the first vertex again closes the ring. |
| Double-click (while drawing) | Close the ring. |
| Enter (while drawing) | Close the ring. |
| Right-click (while drawing) | Remove the last vertex you placed; once the draft is empty it cancels the drawing. |
| Escape | Cancel the drawing, cancel a pin you are dragging, or put away an armed tool (the colour picker, pin placement). |
| Right-click (tool armed) | Same as Escape for an armed colour picker, pin placement or string painter — no second trip to the button. |
| Drag a vertex knob | Move that vertex. The polygon's cards and handles stay out of the way for the whole drag. |
| Right-click a vertex | Delete it. Refused when the outline is down to three vertices, or when the polygon is locked as a rectangle. |
| Click a “+” chip on an edge | Split that edge at its midpoint, adding a vertex. |
| Drag a polygon's body | Move the whole footprint; every vertex travels with it. |
| Drag an equipment pin | Move a placed combiner, inverter or AC-panel marker. |
| Drag across modules (painter armed) | Paint the modules into the active string. |
| Shift+click a module (painter armed) | Pick up the string under the pointer instead of painting — the eyedropper. |
| Shift+click a building footprint (overlay armed) | Import it straight as a building; a plain click offers the choice instead. |
| Compass ring: Left Right | Rotate 1° at a time, Shift for 10°; Home returns to north. Focus the ring first — it is otherwise dragged with the mouse. |
Note
Editing a polygon's card does not need a shortcut: the card writes itself back about half a second after your last keystroke. Leaving the view and Ctrl+Enter are the backstops for an edit younger than that.
Catalogue (/catalogue)
| Gesture | Action |
|---|---|
| Click a row | Select it, replacing the selection. |
| Ctrl+click | Add or remove that one row from the selection. |
| Shift+click | Select every row between the anchor and this one. |
| Delete | Delete the selected parts. Catalogue rows that ship with the app are never deleted, and the key respects the same role gate as the button. |
| Double-click a row | Toggle its favourite heart. |
| Drag a selection to Batch | Add those parts to the sweep being authored. |
One-line diagram (/diagram)
The drawing takes the keyboard once you click into it.
| Gesture | Action |
|---|---|
| Mouse wheel | Zoom about the pointer. |
| Drag (left button) | Pan the drawing. |
| + / - | Zoom in / out. (= works as +.) |
| 0 | Reset the view. |
| Left/Up / Right/Down | Step the selection backwards / forwards through the elements. |
| Enter | Open the selected element's editor — a cable opens the cable dialog. |
| Delete or Backspace | Remove the selected inverter or combiner. Asks first; nothing else is removable. |
| Escape | Clear the selection. |
| Right-click | Open the context menu for whatever is under the pointer. The background carries the full action set, so nothing here is reachable only by gesture. |
| Menu or Shift+F10 | Same menu, from the keyboard, on the focused element. |
| Inside a menu | Up Down move and wrap, Home/End jump to the ends, Escape closes. |
| Double-click an element | Open its editor. Double-click a cable row in the table for the cable dialog. |
Report theme editor (/results)
While the theme editor is open it owns the keyboard, and the global shortcuts above stand down.
| Shortcut | Action |
|---|---|
| Escape | Close the editor — or, if a dialog is open over it, dismiss that first. |
| Ctrl+Z / Ctrl+Shift+Z / Ctrl+Y | Undo / redo inside the design. While you are editing a text in place, these belong to the text instead. |
| Ctrl+S | Save the theme. Ctrl+Shift+S saves it under a new name. |
| Ctrl+Tab | Cycle the pages of the design (cover, charts, tables); Ctrl+Shift+Tab the other way. |
| Ctrl+0 | Fit the page in the window. Ctrl+1 goes to 100 %. |
| Left Right Up Down | Nudge the selected box by one step; Shift makes it ten. |
| Delete or Backspace | Clear the selected slot's content. The slot itself stays. |
| Hold Space | Pan the page for as long as you hold it, whatever tool is active. |
| V T P H Z | Pick the move, text, place, hand and zoom tools. |
Elsewhere
| Shortcut | Action |
|---|---|
| Left Right on a loss grip | On the Production loss cascade, nudge that loss by 0.1 point — Shift for a full point. |
| Escape on Batch | Close the run-settings popover. |
| Left Right on the Batch divider | Move the split between the two panes; Home resets it. |
| Drop a file on Batch | A .csv loads the scenarios; a catalogue selection adds those parts. |
| Space in the video player | Play / pause. F toggles full screen. |
| Left Right on the Results document tabs | Show the previous or the next document; Home and End go to the first and the last. |
| Down Up in a Results document menu | Walk its entries; Home and End jump to its ends, Escape closes it. |
| Escape in any dialog | Cancel it. |
Where the browser's own shortcuts fit in
pvSpline claims very little of the keyboard, so almost every browser shortcut still works as you expect. That is a feature, not an oversight:
Reload (F5 / Ctrl+R) reloads the app. If the working project has unsaved changes, the browser's own “leave this site?” prompt appears first — pvSpline asks it to. Answer stay if you did not mean to.
Back and forward move between views, because every view has its own address. Going back out of a results page does not cancel the run behind it.
Find (Ctrl+F) is the browser's, untouched. It searches what is rendered; to search a catalogue or your projects, use the view's own search box, which searches everything, not just the visible rows.
Print (Ctrl+P) is the browser's. For a client deliverable use the report's own print action instead — it prints the rendered report rather than the app window. If your browser blocks the window it opens, allow pop-ups for the site, or export the PDF and print that.
Save page (Ctrl+S) is the browser's — except inside the report theme editor, which uses it to save the theme. To save a project to your account, use Save on Project.
Zoom (Ctrl++ / Ctrl+-) scales the whole app. The map, the diagram and the report preview also have their own zoom, which is the one to reach for.
Full screen (F11) belongs to the browser and cannot be reassigned; the video player offers F for its own full-screen instead.
Troubleshooting & FAQ
Each entry below is a symptom, the cause behind it, and the fix.
Weather or consumption data will not load
Symptom. A fetch reports a failure, or a run stops to say it is fetching weather and never finishes.
Cause and fix.
No site set. The fetch says so: set the latitude and longitude on Map (The Map & Site Design Tab) first. Nothing can be fetched for a site at 0, 0.
Already fetched, nothing happening. Weather is fetched automatically — when an array is drawn or edited, before the next run, and again whenever the site moves — and only what the project lacks is downloaded, so there is often nothing to press. A project that already has weather offers Refresh weather data instead, which re-downloads everything on demand.
The Open-Meteo badge stays at
Open-Meteo data not embedded. The weather-history service did not answer. The fetch still embeds the PVGIS irradiance, so runs go ahead, but Soiling and Snow on Auto (weather) cannot follow the weather and keep the project's own figures, and the 3-D view's Real weather reportsWeather unavailable: …. No other weather service stands in for it. Press Refresh weather data on Production later to try again: nothing retries on its own until the site moves.The first fetch for a site is slow. The weather history of a site that has not been fetched before takes noticeably longer to arrive the first time; later fetches for the same site come back quicker. A run started meanwhile waits with
Fetching weather data for the site first — the run starts as soon as it lands…— let it finish.Enedis consumption will not pull. Metered-load retrieval is French and needs an authorised delivery point: the 14-digit PRM belongs to the saved project and comes from the customer's authorisation, so it cannot be typed in here. If the project has none, start the consent flow from the same card (The Consumption Tab).
A delivery point that downloaded before now refuses with
No Enedis authorization is in force for this PRM…. The customer's authorisation has most likely expired — it runs for the duration stated on the form the customer signed, twelve months by default — or been revoked; the same message covers Enedis access switched off for your account, which someone with the Manager role in your company can switch on. A project saved to your account keeps the metered series only while the authorisation is in force: once it ends, the series is removed from every saved version, the run's Warnings card says the delivery point has no embedded consumption series, and only a new authorisation signed by the customer lets you download it again (When your client's authorisation expires).
Tip
Once a site's series have been fetched they are embedded in the project file, so the project runs from then on without touching the network — including on a machine that has never seen that site.
A run failed, or you want to stop one
Symptom. The report's place on Results reads This job failed: with a message, or a run you no longer want is on its way.
Cause and fix.
Read the message first — it comes from the engine and usually names the input at fault. Then run it again: the check that starts every run lists, under Run the project, exactly what is missing or out of range, and stops the run before anything is computed.
A failed cloud run is charged the engine time it used. Fixing the input and running again spends the new run on top, so read the failed run's Warnings card before resubmitting it. An error the check catches stops a run before it is submitted, so it costs nothing.
A run is not withdrawn from Results. Once the engine has picked a job up it cannot be interrupted, so let it finish and run again. A cloud run still queued is cancelled from the Cloud runs list on the account page (Cloud runs: the job history).
Jobs disappearing from Choose a job. The list keeps a bounded number of recent jobs per session. A result you need to keep is already in your run history on Account.
Some rows of a batch come back failed. Step 4 lists them under Scenarios the engine did not run:. Each swaps in a part that neither the project, the engine's catalogue nor your company's shared components hold, so the engine refuses to run it rather than score your own part under that part's name. The run's Log names the part: add it to your company's catalogue (Manager or Admin role, The Component Catalogue) or pick another, then run the batch again (Batch Simulation & Scenario Sweeps).
A cloud run stays queued
Symptom. A row in Cloud runs keeps reading Queued — pickup typically ≤ 5 s well past five seconds — or, on the free plan, Queued — on the free plan, runs start once no paying customer’s run is waiting.
Cause. Every worker is busy. The workers are shared by all pvSpline companies and take turns between them: another company's long backlog does not all go ahead of you, only its next job at each turn. Within your own company the oldest job starts first, so runs and batches your colleagues — or a script or an AI assistant working for your company — queued earlier start before yours. On the free plan, paying customers' runs go first, even ones queued after yours: your run starts only once none is waiting, and a batch or optimization under way can be stopped to make room for one — its row then reads Queued again — stopped to make room for a paying customer’s run (free plan); it starts over once a worker is free (Paying customers' work goes first).
Fix. Wait: the row turns Running on its own, and the time spent queued is never charged — the drawer's Queue figure counts it apart from the Engine time. To see what your company has waiting, pick the Active chip in Cloud runs (Cloud runs: the job history), and cancel the queued runs you no longer need: a run cancelled before pickup costs nothing. On the free plan, subscribing lifts the wait at once: your company's runs, those already queued included, then go first like any paying customer's.
The cloud refuses to queue a run
Symptom. Pressing Run produces a message instead of a job, mentioning an allowance or a subscription.
Cause. Cloud compute is metered — per member on a subscription, per company on the free plan — and there are several independent meters:
your monthly simulation allowance is used up — the run was not queued— your engine-time allowance is spent. On a subscription it is your own, not shared with colleagues; on the free plan it is the company's, so a colleague's runs count too. It resets monthly.A message that your monthly cloud API allowance is used up — the cloud API meter, which every plan caps. Until it renews on the 1st, saves to your account and other cloud work are refused as well.
your company's subscription is inactive — cloud runs are paused— a billing state, not a quota.Your plan does not include 3-D streamingorYour monthly tile-build allowance is used up— the 3-D meters, which are separate from engine time.
Fix. Open the Usage section of Account (/account/usage): it shows what is left of each allowance and the date it resets, and Advanced mode adds every meter, with what you have spent.
An upload is refused because the file is too large
Symptom. Picking a file produces a refusal naming the file, its size and a limit, before anything is read.
Cause. Every import has a ceiling, and for anything the engine parses it is 25 MB per file through the cloud (File formats).
Fix. For a picture, resize or re-compress it first — the app shrinks images for the report, but the browser has to decode the original at full size before it can.
A different refusal, Your monthly import allowance is used up, is not about one file: in the cloud, every file large enough to be uploaded counts against a monthly allowance — your own on a subscription, your company's on the free plan — shown in the File imports meter on Account. It resets at the start of the next month.
Note
The sizes the app prints are the ones your file manager shows (decimal MB), so you can compare them directly against the file's properties.
The 3-D view will not start, or the picture is poor
Symptom. Start streaming fails, or the session runs but looks soft or stutters.
Cause and fix. The 3-D view is a rendering session run for you in the cloud and streamed to the tab, so the failures are about entitlement, capacity and bandwidth rather than your graphics card:
Sign in to your cloud account to start a streaming session— it is not available signed out.Your plan does not include 3-D streaming— an entitlement, not a quota. Every plan carries a streaming allowance, the free plan too, so this means your account has no active plan (Your Account, Team & Cloud Runs).Your monthly 3-D streaming allowance is used up— the 3-D streaming meter on Account. A session starts only with at least 60 s left; if the allowance runs out mid-session the stream stops, and only the seconds actually streamed are charged.Every 3-D server is busy right now. Try again in a few minutes — on the free plan, a session starts only when no paying customer needs the server.— capacity, not your account: every 3-D server is in use, and as paying customers come first, a free-plan session starts only when a server is free and no paying customer needs it (Paying customers' work goes first). Try again a few minutes later.3-D streaming is not enabled on this deploymentorThe streaming player is not installed on this deployment— nothing you can fix from the app; ask whoever runs the deployment.Soft or stuttering picture. The stream adapts to your connection. Lower the Quality setting, close other heavy tabs, and prefer a wired connection — the renderer is not the bottleneck, the link is.
Note
The startup phase — Starting the cloud renderer — does not count against the streaming allowance. The meter starts when the session turns Live.
The results do not match the project on screen
Symptom. A results view carries a Stale badge, or the numbers do not reflect an edit you just made.
Cause. Running is explicit: editing the project does not re-run it. The badge appears as soon as what is on screen has drifted from the run being displayed, and its wording names what drifted: Stale — the project changed since this run.
Fix. Press Run the project, right before the badge on Results, which submits the current project and takes you to the new result.
Note
Exporting does not re-run the project: the PDF is the one stored with the run you are previewing. When the badge says the project changed, press Run the project and export once the new run has finished (What an export ships).
The Results icon is red
Symptom. The Results entry of the navigation rail is red, and its tooltip lists Calculation: The calculation has not been run — sometimes while Results still shows a run.
Cause. The flag speaks for the project open in this tab: this browser knows of no successful run of it. The run on screen, if there is one, is the newest of your session and can belong to the project you had open before. A failed run does not count, and neither does a run made somewhere this browser has not seen — another browser or computer, a colleague, an AI assistant or a script.
Fix. Run the project (Run the project, or Ctrl+Enter from any view). If a cloud run of it already exists that you may open — your own, or any of the company's with the Manager role — View result on its row in Cloud runs (Cloud runs: the job history) clears the flag without spending another run.
A project will not open
Symptom. Picking a .pvspline.json file reports Could not read the selected file, or the project opens but the editing cards say the working project is not valid JSON.
Cause and fix.
It is not valid JSON. Something truncated or edited the file. Open it in a text editor and confirm it parses, and that it has a top-level
schemanumber.It is too old. Files below the supported floor (schemas 1–4) are refused outright. Open such a file in an older pvSpline release and re-save it to bring it forward.
It is newer than the engine answering. The engine reads only the fields it understands and warns; it will not save the project back down to the older format.
Tip
Run the project is also the fastest triage for a project that opens but behaves oddly: an error the engine's check finds is listed under the button without spending a run, and every warning it finds heads the run's Warnings card.
A component datasheet will not import
.PAN/.OND/.BTR/.PMPfiles are Windows-1252 encoded; one re-saved as UTF-8, or truncated by a mail gateway, may not parse. Re-export it from PVsyst and import the original bytes.You can import a component, not a whole PVsyst project or variant — there is no
.PRJimporter.If the file is large, check the ceiling above before blaming the file.
On the Diagram tab the inverter loaded, but it is not in the catalogue. Loading a
.ONDinto an inverter row works for every role, but only the Manager or Admin role also files the device in your company's Inverters catalogue; with the User role the row is filled and nothing more. With the role,The inverter was loaded, but could not be added to the catalogue: …means the row is fine and only the catalogue copy failed — import the file again from the Inverters category of Catalogue.
The report will not print or export
“No completed run yet.” The study report is drawn from a finished run: pick one at the top of the Results tab, or run the project with Run the project. The town-hall permit and the Consuel dossier need no run.
“No project is loaded.” The report is guarded on the project, not just the run — open or create one.
The print window never appears. Your browser blocked the pop-up. Allow pop-ups for the site, or export the PDF and print it from your own viewer.
The export runs a simulation first. There was no finished run to export, so the app produces one (The report needs a fresh simulation — running the current project…) and exports its report. If that run fails, the message says why: fix what it names and export again.
The verifier finds no code. Only a report the cloud signed carries one: a cloud run computed before reports were sealed, and a run an AI assistant queued, carry none — run the project again for a report that does. Then drop the PDF itself on the checker rather than a picture of its cover: it reads the file's fingerprint and its seal. A photograph too blurred to read is answered
No QR code detected in the image. Try a sharper photo, or drop the PDF.(Report verification).The batch-study page is missing. The page prints from the batch study stored in the project the run was computed from, so a run made before the batch has none, and the report has no page for it. Re-run the project, then export — and check that the page's tick box in the chart list is ticked (Batch study — scenario comparison).
The numbers differ from PVsyst
Symptom. A PVsyst study of the same site and the same hardware gives a different annual yield.
Cause. Almost always an input difference rather than a physics difference, and the loss cascade is built to make that visible: it is laid out in PVsyst's own order, and the inverter losses reconcile line for line with the two variable sets PVsyst exports (The loss cascade, line by line).
Fix. Put the two loss diagrams side by side and walk down them. The lines that usually differ are:
Near shading — pvSpline reports mutual row shading as separate beam, diffuse and electrical lines, and splits vegetation out of the beam line when a 3-D bake saw a canopy. PVsyst rolls all of that into its 3-D scene, so compare the sum, not a single row.
Soiling, snow and horizon — pvSpline computes these from real weather and the site's own horizon where it can, instead of a typed percentage. Check what each model produced against the constant the other study assumed.
DC ohmic — computed from your sized cable runs when the project has a bill of materials, rather than a flat percentage.
The inverter — with no inverter in the electrical design, conversion is a flat loss with no clipping and the yield reads a few percent high; the generic starter inverter that Create initial design places has no datasheet efficiency. The Warnings card on Results says when either applies. Put the PVsyst variant's own inverter on the Diagram tab before comparing (The starter inverter).
The reference year — confirm both studies use the same weather source and the same probability of exceedance (a P50 median against a P90 lender case will never agree). A pvSpline project is computed at P90 unless you pick another percentile, and the Production tiles and the loss diagram's kWh show that figure — the tiles say so (
Annual production · P90) — while a PVsyst annual yield is the P50. Compare it with the P50 segment of Probabilistic production (Probabilistic production (P50/P75/P90/P99)), or pick P50 and run again; the loss percentages are the same at every percentile.
Field reference
This appendix has no editable panel of its own; its “fields” are the entries of the files pvSpline reads and writes. The tables below let you read or hand-author a project, site or tariff file. Each row gives the key, its type and unit, its default, and its meaning. (For the on-screen controls that set these values, see the chapters cross-referenced in each subsection.)
Project file — top-level keys
| Field / Control | Type & unit | Default | What it does & how to set it |
|---|---|---|---|
| schema | integer | 31 | File-format version. Required; a missing or below-floor value is rejected. Written as 31; older files are auto-migrated up on open. |
| projectName | string | "" | Free-form project title shown on the report cover. |
| clientName | string | "" | Free-form client name for the cover. |
| clientEmail / clientPhone / clientSiret | string | "" / "" / "" | Customer-contact block: e-mail, phone and (French) SIRET company number. All default empty. Added schema 16. |
| prm | string | "" | French Enedis meter identifier (14 digits) used to pull metered load. |
| saveId | integer | -1 | Local database row id. -1 means a file-only project with no DB row. |
| pNomStcKwp | number · kWp | 0 | Installed DC nameplate at STC. Drives every per-kWp metric (specific yield, PR). |
| acSystemRatedKw | number · kW | 0 | Aggregate inverter AC nameplate. 0 disables AC clipping. |
| summerMonthsMask | string · 12 chars | "" | “0/1” flags Jan..Dec marking which months use the summer tariff. Empty or all zeros means April to October. |
| horaireE / horaireH | array | — | The summer (horaireE) and winter (horaireH) peak/off-peak time windows, each a list of {"start":"HH:MM","end":"HH:MM"} ranges marking the peak (HP) hours. Set on the CONSUMPTION RATES card (The project's consumption-rate and grid-pricing cards). Up to three windows per season: the card adds no more, and a save to your account keeps the first three of each season. Under Peak / Off-peak the winter windows apply all year. |
| hourlyTariff | array · 8760 × €/kWh | — | Optional per-hour buy price. It prices the run only when the Rate source of the CONSUMPTION RATES card is From an hourly CSV (the hourly-CSV scheme), or in a file that stores no granularity; under Tempo (EDF) the run builds its own curve from the six colour prices and the file carries that curve here, and under the flat and peak/off-peak schemes a curve is kept but ignored. |
| exportLimitSchedule | 12×24 array · kW | — | Grid export cap per month × hour. -1 = uncapped; omitted when all-uncapped. |
| evSessions | array | — | Electric-vehicle charging sessions in the form older files use (arrival and departure, energy needed, charger power, charging mode). The app keeps a project's vehicles among its consumption sources (consumptionSources) instead, so a file it writes usually has none here. Sessions found here are still read, each one becoming a co-simulated Electric vehicle source — unless the file already lists a vehicle there, in which case they are ignored. See The Consumption Tab. |
| dataPayloads | object | — | Embedded fetched series (PVGIS irradiance, Open-Meteo weather, consumption) that make the project open and simulate offline. Added at schema 8. |
| dataPayloads.dataVintage | object | — | Provenance for those embedded series: for each one, its source, the window it actually covers, when it was fetched and a hash of its content — plus the windows the next fetch should ask for. Absent means “unverified”, never “mismatched”. Added schema 26. |
| dataPayloads.designClimate | object | — | The site's design cold temperature: the coldest air temperature (°C) of any daylight hour in the embedded multi-year Open-Meteo record (coldestDaylightC), with the years it covers (firstYear, lastYear, years) and its source. Written when that record is embedded and spans at least five years; absent otherwise. A planned string layout's cold-voltage check uses it when no site minimum temperature is set on Diagram (Deciding and applying). Added schema 30. |
| dataPayloads.pvgisSeriesParams | object | — | For each PV polygon, keyed by its polyId, the request its embedded PVGIS series answers: the point queried (lat, lon), the plane (tilt, azimuth), the PVGIS mounting place and tracking type (mounting, tracking) and the share of the primary face in the stored two-face blend (eastFraction). Written by the weather fetch beside each series. The web app re-fetches a polygon edited after its fetch instead of simulating it on the old series, and a run warns when it has to. Absent means the series is taken as current. Added schema 31. |
| electricalBom | object | — | Sized wire runs, conductor and component unit prices (componentPrices) and user-entered manual BOM rows (manualItems — mounting, labour, permits, misc) for a portable bill of materials. Added schemas 9/11/17. Schema 21 added the cable-length estimator's own state: the AC service-panel map pin (acPanelLat / acPanelLon) and the project-level routingFactor / verticalDropM tunables. |
| mapOffset | object | — | 3D-map East/North calibration offset (metres) that aligns the drawn layout with the basemap imagery. Added schema 12. See The Map & Site Design Tab. |
| tenderFamily / tenderPeriode | string | "" / "" | CRE tender target family and period (the French call-for-tenders bracket that gates module-ECS eligibility). Both default empty. Added schema 15. |
| rawValues | object | empty | Low-level key/value cell store mirroring the app's internal input grid. It also holds the tariff inputs a second time — the four buy rates (tarif_hph … tarif_hce, in c€/kWh there), the capacity charge, the summer months, the peak-hour windows (horaire_h0s … horaire_e2e, three per season), the hourly curve and the export cap — and for these a cell holding a value takes precedence over the typed key above, which applies only when its cell is absent or empty (or, for a rate, a capacity figure or the curve, unreadable). A file the app wrote usually carries both forms, so to hand-edit one of these, change the cell or delete it. The cells also hold the Granularity chosen on the CONSUMPTION RATES and GRID PRICING cards (tarif_conso_mode, tarification_reseau_mode), the include-in-PDF chart ticks (graph_vis_N) and the stored batch study (batch_study_json). A save to your account stores the cells, filling an empty one from its typed key, so the tariff the project is simulated with survives saving and reopening. |
site sub-object
See The Project Tab and The Map & Site Design Tab for the controls that set these.
| Field / Control | Type & unit | Default | What it does & how to set it |
|---|---|---|---|
| latitude | number · ° | 0.0 | Decimal degrees, positive North. Range -90 to +90. |
| longitude | number · ° | 0.0 | Decimal degrees, positive East. Range -180 to +180. |
| altitude | number · m | 0.0 | Metres above sea level. |
| timezoneOffsetHours | number · h | 0 | Signed offset from UTC in hours, no daylight saving; a half- or quarter-hour offset such as 5.5 is kept. Range -12 to +14. |
| countryCode | string | "" | ISO 3166-1 alpha-2 (e.g. FR). The carbon balance takes its grid figure from the CARBON FOOTPRINT card (The Project Tab), and reads this code only when the card leaves both its country and its grid intensity blank: the grid figure then comes from the bundled country table for this code. |
| name | string | "" | Free-form site label. |
polygons array (one per array zone)
See The Map & Site Design Tab and Running a Simulation & the Production Tab.
| Field / Control | Type & unit | Default | What it does & how to set it |
|---|---|---|---|
| polyId | integer | -1 | Unique id for the polygon. |
| tiltDegrees | number · ° | 35.0 | Surface tilt from horizontal. Drives transposition and self-shading. |
| azimuthDegrees | number · ° | 0.0 | Surface azimuth: 0=North, 90=East, 180=South, 270=West. Always write both this key and tiltDegrees: a polygon that omits the azimuth runs facing north. A run warns about a fixed array tilted 10° or more that faces within 20° of its hemisphere's pole (in the northern hemisphere, north), except on a site within 5° of the equator; a flatter array runs north-facing with no warning. |
| groundCoverageRatio | number | 0.4 | Backtracking ground-coverage ratio of a single-axis tracker zone (module length / row pitch); on a two-axis concentrator field, also the row spacing behind its inter-row shading. On a zone whose module type is a tracker, the module's Backtracking GCR (0–1) applies instead — 0 meaning no backtracking — and picking such a module copies a non-zero value here. Ignored for fixed arrays (Simulation Physics & Data Reference). |
| groundAlbedo | number | 0.2 | Ground reflectance, 0–1. Feeds diffuse and bifacial rear-side light. |
| trackerEnum | integer | 0 | 0=Fixed, 1=Single-axis (a horizontal axis along azimuthDegrees: 180 north–south, 90 east–west), 2=Dual-axis. On a PVGIS run a single-axis zone whose axis runs within 45° of east–west gets a horizontal east–west tracker's irradiance, any other a horizontal north–south one's, unless singleAxisPvgisCode names the axis. Written from the zone's module type whenever a module is picked for the zone on Map, which shows it read-only as Tracker. |
| singleAxisPvgisCode | integer | — | The PVGIS axis type a single-axis zone's irradiance is requested for, when the file names one: 3=vertical axis, 4=horizontal east–west, 5=inclined north–south. Omitted (the default), the axis follows azimuthDegrees, as under trackerEnum. It shapes only the PVGIS request: the run's own geometry still turns about a horizontal axis along azimuthDegrees. |
| trackingStrategy | integer | 0 | Single-axis tracking strategy, copied from the module type: 0=Astronomic, 1=Irradiance optimization. Omitted at 0. |
| rotationLimitDegrees | number · ° | — | Mechanical rotation limit of a single-axis tracker, copied from the module type. Omitted when the type sets none. |
| windStowThresholdMs / windStowAngleDegrees | number · m/s / number · ° | — | Tracker wind stow, copied from the module type: the hourly wind above which the tracker stows, and its rotation in stow. Present only while the stow is armed; absent = no stow. |
| panelFingerprint | string | "" | Content-addressed reference to the module used on this zone. Empty = project default. The referenced part travels in the file's panelLibrary / inverterLibrary / batteryLibrary / boxLibrary / wireLibrary top-level arrays (added schemas 3–4), so a shared project resolves every component with no re-entry. |
| kWp | number · kWp | 0.0 | Installed nameplate power on this polygon. Derived, not typed: the module placer writes back what it actually fitted. |
| floating | bool | false | On-water (floating PV) flag; enables the FPV thermal/albedo treatment. Added schema 10. |
| albedoMaterial / autoAlbedo | string / bool | "" / false | Optional ground-material preset key and a flag that the albedo was estimated from the basemap imagery. Added schema 14. |
| vertexRing | array | — | The drawn outline, [[lat, lon], ...] in vertex order (WGS84 degrees), open — the last point is not repeated. This is what lets a shared project redraw its footprint and re-pack its modules anywhere. Added schema 19; a project authored before it lists in the side panel but has no footprint to draw. Since schema 23 a vertex may carry a third element, an above-ground height in metres, used only by the 3-D camera path. |
| maxKwpCap | number · kWp | — | Per-polygon ceiling on installed power. The module placer honours it; it never writes it. Added schema 19. |
| pvPortraitMode | bool | — | Whether modules are laid out portrait rather than landscape on this zone. Added schema 19. |
| isObstacle / isBuilding | bool | false / false | Marks the polygon as an obstruction or a building rather than an array zone — it casts shade but carries no modules. Added schema 19. |
| bipvMode | string | "" | Building-integrated mounting for this zone, overriding the module datasheet's own mounting: integrated (insulated back, no airflow — the hottest regime) or semi_integrated (ventilated gap). Empty = not built into the envelope. Added schema 28. See The Map & Site Design Tab. |
| isBiome | bool | false | Marks the polygon as a vegetation region rather than a PV array. When set, the companion keys biomeType, biomePreset, biomeParams, plantSpecies, growthCurve, biomeCoverage and biomeDensity describe it; they are omitted entirely on every other polygon. Added schema 20. See The 3D Earth Site View. |
| isVideoPath / videoFocusPv | bool | false / false | Marks the polygon whose vertexRing is the open camera track for a 3-D sun-path video (its azimuth doubles as the camera direction), and whether the camera aims at the nearest array while travelling. Added schema 22; schema 23 added videoLensZoom (1 = natural lens), videoPerPointHeights and videoFollowTerrain. |
tariffs sub-object (4-period buy rates)
See Preferences, Tariffs & Theming. Missing keys default to 0.0 (no revenue / no cost). Which of the four a run bills follows the Granularity of the CONSUMPTION RATES card: under Flat rate every hour bills at hphTarif, under Peak / Off-peak summer bills at the winter pair, and under the From an hourly CSV source the hourly curve prices every hour — or, with no curve loaded, the four rates by season and peak hours, which a run warns about. A rawValues cell holding the same rate (tarif_hph … tarif_hce, in c€/kWh) takes precedence over these keys.
| Field / Control | Type & unit | Default | What it does & how to set it |
|---|---|---|---|
| hphTarif | number · €/kWh | 0.0 | Peak × winter buy rate (HP × hiver). |
| hpeTarif | number · €/kWh | 0.0 | Peak × summer buy rate (HP × été). |
| hchTarif | number · €/kWh | 0.0 | Off-peak × winter buy rate (HC × hiver). |
| hceTarif | number · €/kWh | 0.0 | Off-peak × summer buy rate (HC × été). |
capacityCharge sub-object
The capacity-subscription block, billed as far as the Granularity of the GRID PRICING card allows (rawValues.tarification_reseau_mode): 0 (None) bills none of it, 1 (Subscription) bills puissanceSouscriteKva × prixKvaMois but not prixDepassementKvah, and 2 (TURPE + peak-shaving), 3 (Net metering) or a file that stores no level bill all of it. All-zero means “no capacity charge”. A rawValues cell holding the same figure takes precedence over these keys. See Preferences, Tariffs & Theming.
| Field / Control | Type & unit | Default | What it does & how to set it |
|---|---|---|---|
| puissanceSouscriteKva | number · kVA | 0 | Subscribed capacity. |
| prixKvaMois | number · €/kVA/month | 0 | Monthly capacity charge per subscribed kVA. |
| prixDepassementKvah | number · €/kVAh | 0 | Overage rate charged when the peak exceeds the subscription. |
| prixPeakKwMois | number · €/kW/month | 0 | Peak demand charge on each month's peak grid draw, billed with or without a subscription from the TURPE level up; omitted from the file when 0. |
| peakWindowMinutes | integer · min | 0 | Rolling window used to define the billed “peak”. |
battery sub-object
Physical and virtual (cloud-bank) storage. All-zero = no battery. See Storage, EV & Specialized Systems.
| Field / Control | Type & unit | Default | What it does & how to set it |
|---|---|---|---|
| capacityKwh | number · kWh | 0 | Usable battery capacity. Called capacity before schema 25; older files are migrated. |
| isVirtual | bool | false | Virtual (cloud energy-bank) battery. Mutually exclusive with isPhysical. |
| isPhysical | bool | false | Physical on-site battery. |
| physicalMinSocFrac | number | 0 | Floor state of charge (fraction 0–1); the battery is never drained below it. Called physicalDodMin before schema 25 — a name that said its own opposite — and renamed in both places it persists, so older files are migrated. |
| physicalMaxChargeKw | number · kW | 0 | Maximum charge power. |
| physicalMaxDischargeKw | number · kW | 0 | Maximum discharge power. |
| physicalCoupling | integer | 0 | 0=AC-coupled, 1=DC-coupled. DC-coupling banks surplus that AC clipping would waste. |
| virtualFeeEurPerKwh | number · €/kWh | 0 | Per-kWh withdrawal fee on a virtual bank. |
| virtualSubscriptionEurPerMonth | number · €/month | 0 | Flat monthly subscription for a virtual bank. |
| virtualSubscriptionEurPerKwcMonth | number · €/kWp/month | 0 | Per-kWp subscription, billed on installed kWp on top of the flat fee. Added schema 18. |
| virtualConversionRatio | number | 1.0 | Round-trip efficiency of the virtual bank, 0–1. |
| virtualExpiresMonthly / virtualExpiresAnnually | bool | false | Whether the banked balance resets at month or year end. Mutually exclusive. |
Tariff catalogue YAML
One tariff per file. All fields optional; “absent” stays distinct from “explicitly 0”. Rates are in cents/kWh.
| Field / Control | Type & unit | Default | What it does & how to set it |
|---|---|---|---|
| provider / name | string | — | Utility and plan identity, shown in the catalogue. |
| country / currency | string | — | ISO 3166 alpha-2 / ISO 4217. |
| valid_from / valid_to | string · ISO date | — | Validity window used for staleness warnings. |
| source_url | string | — | Attribution / audit link for the rate. Excluded from the tariff fingerprint. |
| buy_mode | enum | — | One of flat (or forfait), hp_hc (or hphc), hp_hc_season (or saison), hourly_csv (or csv) or tempo — the five modes below. |
| flat_rate | number · c/kWh | — | Single buy rate for flat mode. |
| hph / hpe / hch / hce | number · c/kWh | — | Peak/off-peak × winter/summer buy rates. |
| summer_months_mask | string · 12 chars | — | “0/1” Jan..Dec; seasonal mode only. |
| hourly_csv_path | string | — | Path (relative to the seed file) to an 8760-row per-hour price curve; hourly-CSV mode only. |
| tempo_bleu_hc … tempo_rouge_hp | number · c/kWh | — | The six EDF Tempo prices; Tempo mode only. |
| tempo_calendar_codes | string · 365 chars | — | Per-day colour codes (0 blue / 1 white / 2 red); empty = canonical EDF calendar. |
| sell_rate | number · c/kWh | — | PV surplus feed-in tariff. |
| sell_escalation_pct | number · %/yr | — | Annual escalation of the feed-in tariff. |
| network_kind | enum | — | Grid charge model: none, subscription (or abonnement) or turpe (or turpe_peakshave). Applying the tariff sets the Granularity of the project's GRID PRICING card to match — None, Subscription or TURPE + peak-shaving — and that level decides what is billed: none no grid charge at all, subscription the monthly per-kVA charge only, turpe the overshoot penalty on top. Fields a kind does not bill are still written, just not charged. Absent leaves the project's level as it is; net_metering_enabled set to true selects Net metering instead. On a project that had net metering, applying a tariff that sets a network_kind (or a bill that carries a grid model) turns the net-metering reconciliation off along with the level change, and so does net_metering_enabled set to false. |
| subscribed_kva | number · kVA | — | Subscribed capacity for the network charge. |
| price_kva_month | number · €/kVA/month | — | Monthly capacity charge (Enedis publishes per year; convert). |
| price_depassement_kvah | number · €/kVAh | — | Capacity-overage penalty. |
| net_metering_enabled / period / ratio / true_up | bool / int / number / number | — | Net-metering block: on/off, monthly (1) or annual (12), compensation fraction, and the true-up rate for excess. |
| reactive_tan_phi_threshold | number | — | Free tan(φ) reactive-power allowance before penalties apply (TURPE default 0.4). |
| price_kvarh_penalty | number · €/kVArh | — | Reactive-energy penalty charged on consumption beyond the tan(φ) threshold. |
| Tariff buy mode | Meaning / effect |
|---|---|
| Flat | One rate applied to every hour. |
| HP/HC | Peak and off-peak periods (French Heures Pleines / Heures Creuses). |
| Seasonal HP/HC | Peak/off-peak split further by summer versus winter months. |
| Hourly CSV | An 8760-row per-hour price curve. |
| Tempo | EDF's blue/white/red day calendar, each colour with its own peak and off-peak price. |
Make a project portable so it opens offline
Open the project while you have an internet connection.
Set the site and let pvSpline fetch the weather (The Map & Site Design Tab) — PVGIS irradiance and Open-Meteo download and cache automatically the first time.
If you use metered load, pull the Enedis consumption for the PRM (The Consumption Tab).
Run a simulation once so every series is materialised.
Download the project from Project (
/project). From schema 8 on, the fetched series are embedded in the.pvspline.jsonfile itself.Copy or e-mail that single file. On any machine — even with no network — dropping it back into the app opens it and re-simulates it identically, because the weather and consumption travel inside it.
Diagnose a project the app refuses to open
Note the exact message. “Could not read the selected file” means the browser could not read it at all; “not valid JSON” means it read it and the contents are malformed.
Open the file in a text editor and confirm it parses as JSON and carries a top-level
schemanumber. A file that lost itsschemakey, or that a mail gateway truncated, fails here.Check the version. Below the supported floor (schemas 1–4) it is refused; open it in an older pvSpline release and re-save to bring it forward. Above the engine's version it opens with a warning and reads only the fields that engine knows.
If the file opens but behaves oddly, run it: the engine's check names every problem it can see — a site still at 0, 0, no polygons, an out-of-range value, a tilted array facing the pole, an hourly or Tempo tariff missing its prices, a meter with no consumption series. An error stops the run under Run the project without spending it; a warning heads the run's Warnings card.