What Apsia needs from you.

Three inputs, all in formats you already have. This page is the whole integration guide.

Telemetry file

One row per sample, in the file your ground segment already exports. Recognised as they come: Yamcs parameter exports (qualified names, raw and monitoring columns, tab-separated), OpenC3 COSMOS Data Extractor files (full or short item headers, Matlab comment header), Grafana CSV downloads, InfluxDB annotated CSV, SatNOGS exports, and plain CSV or TSV with a decimal point or comma; also xlsx, Parquet, JSON and a zip of any of these. Column names are matched to their role, so vbatt, batt_v, /EPS/HK/BatteryVoltage and EPS HK BATT_V all work; a separate charge and discharge current, or several panel currents, are combined. Units are checked by magnitude and can be set by hand: millivolts, milliamps, kelvin. Timestamps may be ISO 8601, Unix seconds, milliseconds, microseconds or nanoseconds, Excel serial days, or seconds from an epoch you give. Before anything runs you see every column, what we think it is and why, the unit, the time base, the sign convention of the current and a 24-hour preview, and you can correct any of it. The corrected mapping is remembered for the next file with the same columns.

ColumnRequiredNotes
timestampyesISO 8601 (UTC), Unix seconds/ms/µs/ns, Excel serial days, or seconds from a stated epoch.
battery_voltageyesPack voltage, V or mV.
battery_currentyesA or mA, or a charge current and a discharge current as two columns. Sign convention is detected from the eclipse pattern or the voltage slope; you can also state it.
battery_tempoptional°C, K or m°C. Improves aging estimates a lot.
array_currentoptionalTotal array current, A or mA, or one column per panel (they are summed). Enables array health and shadow detection.
socoptionalOnboard state-of-charge estimate, % or fraction. Used for comparison only.
eclipseoptional1 in shadow, 0 in sunlight (or a sunlit flag). Pins the current sign.

Minimum useful length: a few hours. Best: weeks to months, at any cadence between 1 s and 4 min. Gaps are fine and are reported. Up to 8 MB without an account, 64 MB with a workspace key; zip large files.

The pack is learned from the file itself: its capacity from the discharges it holds (gaps of a few minutes are bridged when the load did not change), its resistance from every current step — eclipse entry and exit, a load switching — and the state of charge is re-zeroed wherever the open-circuit voltage is known. The rated capacity and the bench resistance are the starting point, not the answer. When the file carries an on-board state of charge, the last fifth of it is scored with the pack learned from the first four fifths, and that error is printed next to the nominal pack's.

Pass telemetry works too. Give the NORAD id (or your own element-set history) and every sample is placed on its orbit: you get the trend of the end-of-eclipse voltage at constant load, temperature and eclipse length, with its range and a verdict — the health trend a ground station can measure from a few samples per pass, months of passes being the only requirement.

The report leaves as a PDF made on the server from the same numbers you see on screen — verdict, figures with their ranges, findings with their physical reason, charts, method — with the file, its hash, the date and the engine version on the page, so what you forward is exactly what was computed.

With the orbit in hand the report also looks ahead: the end-of-eclipse voltage the station will see in 7 and in 30 days, from the eclipse length of every coming orbit and what the history says a minute of eclipse costs, with a band calibrated on the same forecast issued from earlier dates.

Download the template

Orbit and power sheet

The forecast needs the orbit and a short description of the power system. The orbit is altitude, inclination and the node; a two-line element set; a CCSDS Orbit Mean-Elements Message (OMM, as JSON, KVN or XML, exactly as CelesTrak serves it); or a CCSDS Orbit Ephemeris Message (OEM) from your flight dynamics, in an inertial or Earth-fixed frame. Presets exist for common battery packs and platform classes; every value can be overwritten.

  • Array: power at beginning of life in watts, attitude mode (sun tracking, nadir fixed, tumbling), age in orbit.
  • Battery: a pack preset, or capacity and cell type; the state of health from an analysis carries over, and a depth-of-discharge limit sets the design rule the findings check against.
  • Loads: housekeeping watts (or a platform class that sets them) and heater power. Payload power comes from the activity plan, per task.
  • Reserve: the state of charge you never want to cross. Space weather can raise it temporarily; the forecast says when and why.

Activity plan

CSV or JSON, one row per activity, or an iCalendar (.ics) pass schedule from your ground-station network: each event becomes an activity, passes and contacts are treated as committed downlinks, and the event summary sets the type. In CSV the first four columns and an end or a duration are required.

ColumnNotes
activity_idYour identifier for the task.
satellite_idYour identifier for the satellite; it must match the name given in the forecast.
typeIMAGING, DOWNLINK, CALIBRATION, MAINTENANCE, MANEUVER, or your own. Downlinks are treated as committed: never moved or dropped.
start_utcISO 8601 UTC, with end_utc or duration_s.
power_wAverage power during the task, in watts.
priority, valueOptional. Priority 1 is highest. Value in euros is what the task is worth; it drives cost-versus-value decisions.
earliest_utc, latest_utcOptional. The window inside which the optimiser may move the task. Without a window the task stays where it is.

Download the plan template

End of life

Give the end-of-mission date, the rule (FCC 5-year, ESA Zero Debris, 25-year or your own) and the disposal plan as a short list of activities: power, minutes, how many times, how far apart. Templates cover a drag sail, electric manoeuvres and passivation. Battery, array and orbit are taken from steps 1 and 2; safe-mode load and attitude in disposal are yours to set.

The answer is a table by year to the deadline: projected state of health with its range, effective array power, energy generated and needed per orbit in the worst eclipse, usable energy against the deepest draw, and the share of projected cases with margin. From it: the last safe start date, the passivation time, and the energy share of the disposal probability. It is printable as a “power at disposal” page.

Reading the results

  • Ranges. Most figures come as a central value with a low and high bound. The bounds reflect what the model does not know: cell parameters, load uncertainty, attitude. Narrow them by giving telemetry.
  • Findings. Each finding states what was seen and the physical reason. A finding is never a recommendation to command anything.
  • Cost per task. Battery-life hours consumed by a task, converted to euros using the satellite value and design life you enter. Change those inputs and the euros change; the hours do not.
  • Before and after. The proposed plan is compared with your plan on the same tasks with the same model. That comparison is the control arm for any improvement we show.
  • Consistency checks. The battery report flags what the telemetry contradicts: sudden voltage drops the model cannot explain, a charge that never reaches its termination voltage, heater load in eclipse, a change in the fade rate (a knee). Each flag names the time and the physical reading.
  • Solar array. With an array current, the report adds its loss per year with a range and any step loss with its date. With one current per face, each panel gets a verdict: ok, degraded since a date, or dead. Checked on the BIRDS CubeSat data: the two panel failures the dataset reports are found, the other two satellites raise nothing.

The validation figures behind every number on this site, each with its control arm and its held-out test, are in the white paper.

White paper (PDF)

Connectors

A connector reads telemetry where it already lives, so the analysis repeats itself without anyone exporting a file. Three sources today: Yamcs (the parameter archive of one instance), OpenC3 COSMOS (decommutated items over its streaming API) and Grafana (any datasource behind it, with your own query). You name the channel for each role — battery voltage, current, temperature, array or panel currents — test it, and choose a window and a cadence.

Each pull fetches the last window, runs the battery analysis with the satellite's pack and threshold, saves the summary to the satellite and raises alerts. Nothing raw is stored: the telemetry is read, analysed and dropped. Scheduled pulls run from a scheduler you control that calls the poll endpoint with your key, so Apsia never holds an open session into your ground segment. Tokens stay on the server and are never returned.

Grafana can also read Apsia: three endpoints return flat rows (health history, forecasts, alerts) for the JSON API or Infinity datasource with your key as a header, so state of health and open alerts sit on the dashboards your operators already watch. Connectors are read-only. Recommendations go back as files in your formats, through the API, or on those dashboards.

Workspace and API

The free analysis needs no account. A workspace key adds memory: each analysis is saved to its satellite, with the column mapping and the power sheet. The fleet view lists every satellite with its latest health, fade, months to end of life, array status and open alerts; each satellite keeps a history of health with ranges, resistance and the trend across analyses.

Alerts fire when a saved analysis crosses a rule: health below the end-of-life threshold, a knee in the fade, a dead panel, a step loss of array current, a forecast that breaches the reserve, resistance growth, or no analysis for N days. Rules can be fleet-wide or per satellite, with an e-mail address.

The same key gives programmatic access to the four operations (analyse, forecast, check, propose), in JSON, with CSV and JSON exports. Keys come with a pilot or subscription and can be rotated or revoked. University teams get an academic key by verifying a university e-mail in the app.

Container

Enterprise customers run Apsia as a container inside their own infrastructure. It exposes the same operations on your network, needs no outbound connection, and receives updates as signed images. Nothing leaves your perimeter.

Data handling

Housekeeping telemetry only: voltages, currents, temperatures. Never payload data, never commands. Processing in the European Union. The free analysis stores nothing after the run; workspaces store summaries and reports, not raw telemetry. Full note on the security page.

Terms

The reports use the vocabulary of the European space battery standards, so a finding reads the same in your test reports and in ours.

BOL, EOL
Beginning and end of life. EOL is the point where the battery no longer meets the mission's energy need; the threshold you set (80 % of nominal capacity by default) is the criterion used here.
State of health (SoH)
Capacity the pack delivers today divided by its nominal capacity at BOL, both at the same conditions. Given with a range. The level depends on the nominal capacity assumed; the trend does not.
Fade
Capacity lost per year, from the observed trend. Reported as unresolved until at least 30 days of data separate the trend from noise.
Remaining useful life (RUL)
Time until the state of health crosses the EOL threshold: the observed trend when it is resolved, otherwise a physical projection at the current duty. Always a range, never a date.
DoD
Depth of discharge: the share of nominal capacity taken out in one discharge. Cycle life falls steeply with DoD; the design limit you set is what the findings check against.
EoDV
End-of-discharge voltage: the pack voltage at the end of an eclipse. The quantity most teams trend by hand; we use it as one indicator among several.
Internal resistance (R0)
Ohmic resistance of the pack seen at a current step. Its growth over time is the early warning that precedes capacity loss.
C-rate
Current relative to nominal capacity: 1C empties the pack in one hour. Damage per cycle grows with C-rate, so the same DoD is not the same wear.
Reserve
The state of charge you never want to cross. A plan that would go below it is reported as a breach before it happens.
Beta angle
Angle between the orbit plane and the direction of the Sun. It sets the eclipse length of every orbit and changes through the year.
Calendar aging
Capacity lost with time regardless of cycling, faster at high temperature and high state of charge.