Fixed: - calcSpa with empty angles array no longer crashes (consistent guard with getSpa) - getSpa with SPA_ZA/SPA_ZA_INC now returns NaN for sunrise/solarNoon/sunset instead of misleading 0; calcSpa returns "N/A" for those fields - lib/spa.js header comment corrected from dist/spa.js to lib/spa.js - dist/spa.js removed (file moved to lib/spa.js in v2.0.0, stale copy deleted) - wiki-sync.yml handles first-run when GitHub Wiki repo does not yet exist - CI pack-check grep uses word-boundary pattern to prevent false prefix matches - Removed package-import-method=hardlink from .npmrc (pnpm default, caused npm warn) Added: - options.function validated before calculation; invalid code throws RangeError - angles with non-RTS function code throws RangeError (requires suntransit) - TypeScript function overloads for getSpa and calcSpa; angles typed as [number, ...number[]] non-empty tuple, narrows return type automatically - SpaFormattedAnglesResult interface, consistent with SpaAnglesResult - CI jobs declare explicit permissions: contents: read - Wiki: Implementation Comparison page with accuracy table (8 locations vs C reference, max delta 0.49 s) and performance benchmarks (nrel-spa vs solar-spa vs C, both SPA_ZA_RTS and SPA_ZA modes, 200k iterations on Node v24.6.0) - Wiki: API Reference updated with named types, all throws, Named Types block - Wiki: Architecture updated with all exported interfaces
5.4 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, ...number[]] |
No | One or more 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)
}
sunrise, solarNoon, and sunset are NaN when options.function is SPA_ZA or SPA_ZA_INC (those codes skip the rise/set calculation).
When angles is provided, returns SpaResultWithAngles:
interface SpaResultWithAngles extends SpaResult {
angles: SpaAnglesResult[];
}
interface SpaAnglesResult {
sunrise: number; // rise time for this zenith angle (fractional hours)
sunset: number; // set time for this zenith angle (fractional hours)
}
Throws:
TypeErrorifdateis not a valid Date, orlatitude/longitudeare not finite numbersRangeErroriflatitudeis outside [-90, 90] orlongitudeoutside [-180, 180]RangeErrorifoptions.functionis not 0, 1, 2, or 3RangeErrorifanglesis provided with a non-RTS function code (SPA_ZAorSPA_ZA_INC)Errorif 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, or when using SPA_ZA/SPA_ZA_INC
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: SpaFormattedAnglesResult[];
}
interface SpaFormattedAnglesResult {
sunrise: string; // "HH:MM:SS" or "N/A"
sunset: string; // "HH:MM:SS" or "N/A"
}
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. Custom zenith angles require SPA_ZA_RTS or SPA_ALL.
SpaFunctionCode Type
type SpaFunctionCode = 0 | 1 | 2 | 3;
Named Types
All interfaces and types are exported from nrel-spa and can be imported in TypeScript:
import type {
SpaOptions,
SpaResult,
SpaFormattedResult,
SpaAnglesResult,
SpaFormattedAnglesResult,
SpaResultWithAngles,
SpaFormattedResultWithAngles,
SpaFunctionCode,
} from 'nrel-spa';
Home . Architecture . Twilight Calculations . NREL SPA Algorithm