---
title: Emergency Lighting Battery Calculator
description: Estimate emergency lighting battery runtime or capacity for a target duration under explicit operating assumptions.
canonical: https://ledyi.com/tools/emergency-lighting-battery-calculator
updatedAt: 2026-10-24T18:00:18Z
---

# Emergency Lighting Battery Calculator

Estimate emergency lighting battery runtime or capacity for a target duration under explicit operating assumptions.

## For AI agents: instructions and calculation APIs

Read the tool instructions in Markdown and the request/response schemas in OpenAPI. These public calculation APIs run the same models as the web and offline calculators. No account, API key or Turnstile is required.

- [Emergency Lighting Battery Calculator — Full tool instructions (Markdown)](https://ledyi.com/tools/emergency-lighting-battery-calculator.md)
- [OpenAPI contract](https://ledyi.com/openapi.json)
- [Agent site index](https://ledyi.com/llms.txt)

Your agent needs an HTTP tool permitted to send POST requests. Reading this page or importing OpenAPI does not automatically grant execution access.

### Emergency Lighting Battery Calculator

```
POST /api/tools/v1/emergency-lighting-battery
Content-Type: application/json
```

Estimate a constant emergency load on one battery or bank. Results are conditional energy budgets, not a battery discharge curve, illuminance calculation, equipment recommendation or compliance approval. Obtain the operating assumptions from the user or equipment data; do not silently use the editable web examples.

### Estimate battery runtime

Use operation=estimate-runtime with batteryCapacity.value and its explicit Ah, mAh or Wh unit. batteryVoltageV is the nominal complete-bank voltage. capacity.basis=rated requires availablePercent for the intended load, temperature, cutoff and battery condition; capacity.basis=usable omits that factor. The complete example yields 96 Wh usable energy and about 129.6 minutes.

| Field | Type and constraints | Meaning |
| --- | --- | --- |
| operation (Required) | {"type":"string","const":"estimate-runtime"} |  |
| batteryVoltageV (Required) | {"type":"number","minimum":0.1,"maximum":1000} | Nominal voltage of the complete battery bank, not mains voltage. |
| capacity (Required) | {"oneOf":[{"type":"object","properties":{"basis":{"type":"string","const":"rated"},"availablePercent":{"type":"number","minimum":0.1,"maximum":100,"description":"Battery-side usable energy as a percentage of nameplate energy for this load, temperature, cutoff and condition. No universal chemistry default."}},"required":["basis","availablePercent"],"additionalProperties":false},{"type":"object","properties":{"basis":{"type":"string","const":"usable"}},"required":["basis"],"additionalProperties":false,"description":"Capacity already represents usable battery-side energy; do not derate again."}]} |  |
| power (Required) | {"oneOf":[{"type":"object","properties":{"basis":{"type":"string","const":"load"},"load":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"total"},"powerW":{"type":"number","minimum":0.01,"maximum":1000000}},"required":["kind","powerW"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"fixtures"},"fixtures":{"minItems":1,"maxItems":30,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","maxLength":60},"quantity":{"type":"integer","minimum":0,"maximum":10000},"powerPerFixtureW":{"anyOf":[{"type":"number","minimum":0.01,"maximum":100000},{"type":"null"}],"description":"Emergency-mode watts at the same measurement point. Null is allowed only when quantity is zero."}},"required":["label","quantity","powerPerFixtureW"],"additionalProperties":false}}},"required":["kind","fixtures"],"additionalProperties":false}]},"efficiencyPercent":{"type":"number","minimum":0.1,"maximum":100},"overheadW":{"type":"number","minimum":0,"maximum":100000,"description":"Additional battery-side consumption not already included in the entered efficiency."}},"required":["basis","load","efficiencyPercent","overheadW"],"additionalProperties":false},{"type":"object","properties":{"basis":{"type":"string","const":"battery"},"powerW":{"type":"number","minimum":0.01,"maximum":1000000}},"required":["basis","powerW"],"additionalProperties":false,"description":"Total measured battery-side draw. No further efficiency or overhead adjustment."}]} |  |
| targetMinutes (Required) | {"type":"number","minimum":1,"maximum":43200} |  |
| extraCapacityPercent (Required) | {"type":"number","minimum":0,"maximum":100} |  |
| batteryCapacity (Required) | {"type":"object","additionalProperties":false} | Whole-bank capacity. Ah/mAh use nominal voltage; Wh is used directly. Normalized energy must be within 0.000001–1000000000000000000 Wh. |
| batteryCapacity.value (Required) | {"type":"number","exclusiveMinimum":0} |  |
| batteryCapacity.unit (Required) | {"type":"string","enum":["Ah","mAh","Wh"]} |  |

```
{
  "operation": "estimate-runtime",
  "batteryVoltageV": 12,
  "batteryCapacity": {
    "value": 10,
    "unit": "Ah"
  },
  "capacity": {
    "basis": "rated",
    "availablePercent": 80
  },
  "power": {
    "basis": "load",
    "load": {
      "kind": "total",
      "powerW": 40
    },
    "efficiencyPercent": 90,
    "overheadW": 0
  },
  "targetMinutes": 90,
  "extraCapacityPercent": 20
}
```

### Size battery capacity

Use operation=size-battery and omit batteryCapacity. Supply targetMinutes and extraCapacityPercent explicitly. The example needs 100 Wh, approximately 8.333333 Ah at 12 V before upward display rounding. These are energy equivalents; verify the actual battery discharge curve and driver compatibility before choosing a product.

| Field | Type and constraints | Meaning |
| --- | --- | --- |
| operation (Required) | {"type":"string","const":"size-battery"} |  |
| batteryVoltageV (Required) | {"type":"number","minimum":0.1,"maximum":1000} | Nominal voltage of the complete battery bank, not mains voltage. |
| capacity (Required) | {"oneOf":[{"type":"object","properties":{"basis":{"type":"string","const":"rated"},"availablePercent":{"type":"number","minimum":0.1,"maximum":100,"description":"Battery-side usable energy as a percentage of nameplate energy for this load, temperature, cutoff and condition. No universal chemistry default."}},"required":["basis","availablePercent"],"additionalProperties":false},{"type":"object","properties":{"basis":{"type":"string","const":"usable"}},"required":["basis"],"additionalProperties":false,"description":"Capacity already represents usable battery-side energy; do not derate again."}]} |  |
| power (Required) | {"oneOf":[{"type":"object","properties":{"basis":{"type":"string","const":"load"},"load":{"oneOf":[{"type":"object","properties":{"kind":{"type":"string","const":"total"},"powerW":{"type":"number","minimum":0.01,"maximum":1000000}},"required":["kind","powerW"],"additionalProperties":false},{"type":"object","properties":{"kind":{"type":"string","const":"fixtures"},"fixtures":{"minItems":1,"maxItems":30,"type":"array","items":{"type":"object","properties":{"label":{"type":"string","maxLength":60},"quantity":{"type":"integer","minimum":0,"maximum":10000},"powerPerFixtureW":{"anyOf":[{"type":"number","minimum":0.01,"maximum":100000},{"type":"null"}],"description":"Emergency-mode watts at the same measurement point. Null is allowed only when quantity is zero."}},"required":["label","quantity","powerPerFixtureW"],"additionalProperties":false}}},"required":["kind","fixtures"],"additionalProperties":false}]},"efficiencyPercent":{"type":"number","minimum":0.1,"maximum":100},"overheadW":{"type":"number","minimum":0,"maximum":100000,"description":"Additional battery-side consumption not already included in the entered efficiency."}},"required":["basis","load","efficiencyPercent","overheadW"],"additionalProperties":false},{"type":"object","properties":{"basis":{"type":"string","const":"battery"},"powerW":{"type":"number","minimum":0.01,"maximum":1000000}},"required":["basis","powerW"],"additionalProperties":false,"description":"Total measured battery-side draw. No further efficiency or overhead adjustment."}]} |  |
| targetMinutes (Required) | {"type":"number","minimum":1,"maximum":43200} |  |
| extraCapacityPercent (Required) | {"type":"number","minimum":0,"maximum":100} |  |

```
{
  "operation": "size-battery",
  "batteryVoltageV": 12,
  "capacity": {
    "basis": "rated",
    "availablePercent": 80
  },
  "power": {
    "basis": "load",
    "load": {
      "kind": "total",
      "powerW": 40
    },
    "efficiencyPercent": 90,
    "overheadW": 0
  },
  "targetMinutes": 90,
  "extraCapacityPercent": 20
}
```

### Reading the result

Battery draw = load watts / (efficiencyPercent / 100) + overheadW. Usable Wh = entered Wh × available fraction. Runtime minutes = usable Wh / battery draw × 60. Capacity Wh = battery draw × targetMinutes / 60 × (1 + extraCapacityPercent / 100) / available fraction. Ah × nominal volts is approximate Wh; mAh is first divided by 1000. Known usable capacity has fraction 1. Measured total battery power skips conversion loss and overhead.

HTTP 200 means valid inputs. result.model is always conditional-energy. status is capacity-calculated, target-and-margin-covered, target-only or below-target. Keep all warnings and assumptions visible. A below-target result is not an HTTP error; it still has a share link for review. runtimeMinutes, inputEnergyWh and usableWh are null in sizing mode. requiredWh and requiredAh include extra capacity; minimumWh excludes it. API numbers are unrounded; web capacities round up and duration displays round down.

Unknown fields, numeric strings, missing assumptions, non-integer quantities and invalid ranges return 422. power.basis=load takes either a total or a list of at most 30 fixture types; all must be supplied by this battery and measured at the same point. A zero-quantity row may have null powerPerFixtureW; a positive-quantity row may not. power.basis=battery accepts only total measured powerW. Do not send efficiency or overhead in that branch; do not send availablePercent for already-usable capacity.

Open links.share to restore the input in the web calculator, then compare the assumptions with manufacturer data. The same available fraction must be rechecked if the load, battery, temperature or cutoff changes. Check full-duration operation and required light levels separately. Copy, CSV, print and offline HTML contain the same calculation; the offline file computes locally and its download endpoint is not a calculation API.

### Request limits and errors

Every success carries apiVersion, a server-generated requestId, operation, normalized inputs, result, warnings and links (tool, markdown, openapi, share). requestId also appears in X-Request-Id. The domain result is deterministic; the request ID changes. Preserve warnings and special statuses when explaining results.

Send uncompressed application/json with strict types and no query parameters. Indoor lighting bodies are limited to 16 KiB; driver-match bodies to 16 KiB; battery bodies to 16 KiB; voltage bodies to 16 KiB; resistor bodies to 16 KiB; DMX bodies to 1024 KiB and 1000 fixtures; pixel bodies to 64 KiB, 64 run rows, 128 outputs and 2000000 channels. DALI bodies are limited to 64 KiB, 24 rows and 512 devices. Illuminance bodies are limited to 16 KiB and 400 planned points. Photometry bodies are limited to 1024 KiB with up to 4 files and 16 by 721 query directions per file. Lighting-cost bodies are limited to 64 KiB with up to 20 groups in each scenario. Body reading expires after 5 seconds. Complete success JSON is bounded to 4 MiB. GET/HEAD return 405; OPTIONS returns 204. Source responses are no-store. Anonymous browser CORS permits POST/OPTIONS and Content-Type with credentials omitted.

Tool POST requests and ordinary page requests share 120 requests per 60 seconds per IP/Cloudflare location; mitigation lasts 60 seconds. Heavy tool use can temporarily block pages from the same source. This is not an independent or globally exact API quota. Inquiry/search use their existing separate rule. Tool POST requests do not inherit the company-page or verified-bot exemption.

Source errors use application/problem+json with status, stable code, requestId and at most one invalidParams JSON pointer. 400: malformed JSON/query; 405: method; 408: body timeout; 413: body limit; 415: media/encoding; 422: parameter/domain error; 500/503: service failure. Fix invalid inputs rather than retrying or changing engineering facts. For 429 or transient failures, use at most two retries with backoff and jitter, honoring Retry-After when present.

Cloudflare can return 403/429/5xx before the application, sometimes as HTML without CORS or Retry-After. Check HTTP status and Content-Type before parsing JSON. A browser may see only a network error. Do not present an error or an older result as a successful new calculation.

Calculations do not create inquiries, send emails, call a language model or store project results. Operational logs exclude fixture labels, groups and request bodies. Existing network/access logs still apply. Submit a quotation request only when the user asks, using the separate inquiry contract and buyer confirmation flow.

### Warning codes

| Field | Meaning |
| --- | --- |
| BATTERY_CONDITIONAL_ESTIMATE | The calculation is conditional on entered usable energy and constant power assumptions. It is not physical validation or a safety/compliance verdict. |
| BATTERY_TARGET_SHORTFALL | The calculated runtime is shorter than targetMinutes under the supplied assumptions. |
| BATTERY_CAPACITY_MARGIN_SHORTFALL | The target is reached in the model, but the battery does not cover the requested extra capacity margin. |

### Error codes

```
TOOLS_INVALID_JSON
TOOLS_QUERY_UNSUPPORTED
TOOLS_METHOD_NOT_ALLOWED
TOOLS_BODY_TIMEOUT
TOOLS_BODY_TOO_LARGE
TOOLS_MEDIA_TYPE_UNSUPPORTED
TOOLS_CONTENT_ENCODING_UNSUPPORTED
TOOLS_INPUT_INVALID
TOOLS_NUMERIC_DOMAIN_UNSUPPORTED
TOOLS_INTERNAL_ERROR
TOOLS_SERVICE_UNAVAILABLE
DMX_INPUT_INVALID
DMX_ADDRESS_NOT_ENCODABLE
DMX_CHANNEL_RANGE_EXCEEDED
DMX_SPACING_OVERLAP
DMX_UNIVERSE_RANGE_EXCEEDED
PHOTOMETRY_FILE_INVALID
PHOTOMETRY_FILE_UNSUPPORTED
PHOTOMETRY_LIMIT_EXCEEDED
```

## Which power rating should I enter?

Enter watts used during emergency operation at the point you are measuring: LED-array watts with driver efficiency, or luminaire input watts with upstream inverter efficiency. A normal 40 W luminaire may use a 5 W emergency driver. Add only the loads supplied by this one battery or bank. If you measured the total draw at the battery, select that option in settings. The tool then applies no further conversion loss or additional consumption.

## How do I find the available capacity percentage?

Use manufacturer data or a measured capacity for the intended temperature, load, cutoff voltage and state of health. It is the share of nameplate energy available to the converter for this discharge. The 80% example is not a general recommendation for lead-acid or lithium batteries. Already have usable energy under those conditions? Select “Known usable capacity”. No further capacity reduction is applied. A nameplate Ah rating alone cannot establish the condition of an installed battery.

## Do I enter one battery or the whole bank?

Enter the complete bank. For two identical 12 V, 7 Ah batteries, a series bank is 24 V, 7 Ah; a parallel bank is 12 V, 14 Ah. Both are nominally 168 Wh. This arithmetic does not confirm that a battery arrangement is compatible with the charger or emergency driver.

## Why separate runtime from extra capacity margin?

The estimated runtime describes the energy available in the entered battery. Extra margin increases the capacity you plan to specify. At 20%, a design needs 1.2 times the calculated minimum. A battery can reach 90 minutes and still fall short of that extra margin.

## Can I replace the battery with a larger one?

Capacity alone is not a replacement specification. Match the manufacturer-approved battery, chemistry, voltage, connector, charge system and enclosure requirements. Select a compatible product and verify its discharge performance. A larger Ah label does not by itself establish a longer approved duration.

## Does reaching 90 or 180 minutes mean compliance?

No. The time presets are shortcuts, not rules for a country or building type. Use your project’s required duration. Illuminance, distribution, equipment approval, switching and testing remain separate checks. This tool does not model the brightness of a dimming emergency driver.

## How is the estimate calculated?

For a constant load, battery draw is lighting watts divided by efficiency, plus any additional battery-side consumption. Runtime (h) = battery Wh × available fraction ÷ battery W Required Wh = battery W × target h × (1 + margin) ÷ available fraction Required Ah = required Wh ÷ nominal battery V Ah × V gives approximate nominal Wh; mAh is first divided by 1,000. Wh is used directly. The fraction is 1 for already-usable capacity. A usable-energy value measured at one load cannot validate another load. Voltage sag, cutoff and non-linear discharge are represented only by the capacity value you supply; this is not a discharge-curve simulation. Runtime is rounded down to whole minutes; required capacities are rounded up to 0.01 Ah / Wh.

## Can I save this without an account?

Yes. Copy a summary, share a link with all calculation inputs, or use Save results to print a report, export the duration comparison or download an offline calculator. Everything is calculated in your browser. Nothing is submitted to LEDYI by these actions.

