nrel-spa/.wiki/API-Reference.md
Aric Camarata b44d9a958b v2.0.0: TypeScript rewrite with dual CJS/ESM build
Complete modernization of the package. The core SPA algorithm is
unchanged and validated; everything else is rebuilt to match current
JavaScript ecosystem standards.

Changes:
- TypeScript wrapper in src/ with full type definitions
- Dual CJS/ESM build via tsup (dist/index.cjs, dist/index.mjs)
- Core algorithm moved from dist/spa.js to lib/spa.js (same code)
- Input validation with descriptive TypeError/RangeError messages
- formatTime() and SPA function code constants as named exports
- getSpa() / calcSpa() accept null for optional args (tz, options)
- Test suite: 61 ESM assertions and 17 CJS assertions
- GitHub Actions CI: Node 20/22/24 matrix, typecheck, pack-check
- GitHub Wiki: Home, API Reference, Architecture, Twilight, NREL SPA
- NREL attribution in LICENSE and README per their license terms
- package.json: exports map, files, engines >=20, sideEffects: false
- Author corrected to Aric Camarata; repository.url uses git+https://
- LICENSE year corrected to 2023-2026
- Removed: index.js, test.js, dist/spa.js (superseded by above)
2026-02-25 11:01:38 -05:00

4.5 KiB

API Reference

Functions

getSpa(date, latitude, longitude, timezone?, options?, angles?)

Computes solar position for the given date and location. Returns raw numerical values.

Parameters:

Parameter Type Required Description
date Date Yes UTC date and time. Uses UTC components internally.
latitude number Yes Observer latitude, -90 to 90. Negative = south.
longitude number Yes Observer longitude, -180 to 180. Negative = west.
timezone number | null No Hours from UTC (e.g., -4 for EDT). Default: 0.
options SpaOptions | null No Atmospheric and calculation parameters.
angles number[] No Custom zenith angles in degrees. See Twilight Calculations.

Returns: SpaResult

interface SpaResult {
  zenith:    number; // topocentric zenith angle (degrees)
  azimuth:   number; // topocentric azimuth, eastward from north (degrees)
  sunrise:   number; // local sunrise (fractional hours, e.g. 5.417 = 05:25)
  solarNoon: number; // local solar noon (fractional hours)
  sunset:    number; // local sunset (fractional hours)
}

When angles is provided, returns SpaResultWithAngles:

interface SpaResultWithAngles extends SpaResult {
  angles: Array<{ sunrise: number; sunset: number }>;
}

Throws:

  • TypeError if date is not a valid Date, or latitude/longitude are not finite numbers
  • RangeError if latitude is outside [-90, 90] or longitude outside [-180, 180]
  • Error if the internal SPA calculation returns a non-zero error code

calcSpa(date, latitude, longitude, timezone?, options?, angles?)

Same parameters as getSpa(). Formats sunrise, solarNoon, and sunset as HH:MM:SS strings.

Returns: SpaFormattedResult

interface SpaFormattedResult {
  zenith:    number; // same as SpaResult
  azimuth:   number; // same as SpaResult
  sunrise:   string; // "HH:MM:SS" or "N/A" during polar day/night
  solarNoon: string; // "HH:MM:SS" or "N/A"
  sunset:    string; // "HH:MM:SS" or "N/A"
}

When angles is provided, returns SpaFormattedResultWithAngles:

interface SpaFormattedResultWithAngles extends SpaFormattedResult {
  angles: Array<{ sunrise: string; sunset: string }>;
}

formatTime(hours)

Converts a fractional hour value to HH:MM:SS format.

formatTime(5.417489)  // "05:25:03"
formatTime(12)        // "12:00:00"
formatTime(23.9997)   // "23:59:59"
formatTime(-1)        // "N/A"
formatTime(NaN)       // "N/A"
formatTime(Infinity)  // "N/A"

SpaOptions

All options are optional. Defaults match the NREL C reference implementation.

Option Type Default Description
elevation number 0 Observer elevation above sea level in meters.
pressure number 1013 Annual average atmospheric pressure in millibars.
temperature number 15 Annual average temperature in degrees Celsius.
delta_ut1 number 0 Fractional second difference between UTC and UT1. Valid range: (-1, 1).
delta_t number 67 Difference between Terrestrial Time and UTC in seconds.
slope number 0 Surface slope from horizontal in degrees. Used for incidence angle (SPA_ZA_INC, SPA_ALL).
azm_rotation number 0 Surface azimuth rotation from south in degrees.
atmos_refract number 0.5667 Atmospheric refraction at sunrise/sunset in degrees.
function SpaFunctionCode SPA_ZA_RTS Which outputs to compute.

Function Codes

import { SPA_ZA, SPA_ZA_INC, SPA_ZA_RTS, SPA_ALL } from 'nrel-spa';
Constant Value Outputs Computed
SPA_ZA 0 zenith, azimuth
SPA_ZA_INC 1 zenith, azimuth, incidence angle (for solar panels on sloped surfaces)
SPA_ZA_RTS 2 zenith, azimuth, sunrise, solarNoon, sunset
SPA_ALL 3 All outputs from SPA_ZA_INC and SPA_ZA_RTS combined

The default is SPA_ZA_RTS. Use SPA_ZA for zenith/azimuth-only calculations if you do not need rise/set times; it skips the three-day calculation that rise/set requires and is slightly faster.


SpaFunctionCode Type

type SpaFunctionCode = 0 | 1 | 2 | 3;

Home . Architecture . Twilight Calculations . NREL SPA Algorithm