---
title: Illuminance & Uniformity Analyzer
description: Record measured illuminance on an equal-area room grid, compare average and uniformity with your targets, and keep a traceable measurement record.
canonical: https://ledyi.com/tools/illuminance-uniformity-analyzer
updatedAt: 2026-10-24T15:51:54Z
---

# Illuminance & Uniformity Analyzer

Record your lux readings. Find the dark spots. Keep a report you can check.

## Where should I take the readings?

Measure at the centre of each equal-sized cell, on the same horizontal plane. Coordinates run right and down from the top-left of the measured rectangle. Follow your project’s measurement method for the grid spacing, wall offsets and measurement height. Use the rectangle for the area you actually want to assess. This version does not combine different heights or irregular sampling patterns into one average.

## Why can the average be enough, but uniformity too low?

A bright centre can raise the average while a corner stays dark. Compare the two requirements separately. Select “Minimum” to locate the lowest recorded point and recheck the area. This tool compares recorded values with the targets you enter. A numerical match does not account for instrument uncertainty or prove acceptance near a limit. It does not assess glare, colour rendering, flicker or full compliance with a lighting standard.

## What do the two uniformity ratios mean?

Average = sum of recorded readings ÷ recorded point count U₀ = minimum ÷ average Min / max = minimum ÷ maximum These are different ratios. A higher value means a more even set of readings. CIE defines illuminance uniformity using minimum / average. Compare against unrounded values; rounded values are for display.

## What if a point is missing or reads zero?

A blank point is unmeasured. Add a note if it is blocked. Incomplete surveys show provisional statistics for recorded points, and no completed target judgement. Zero is a real reading and is included. When every recorded reading is zero, division by zero makes both ratios undefined. A single reading can be recorded, but cannot describe the spatial uniformity of a room.

## Can this page measure light with my phone?

This page records readings from a meter; it does not access your camera or phone sensor. Record the meter and calibration reference in “Measurement record”. Let the reading settle and keep the sensor clear of your own shadow. The reported minimum is the lowest measured point. There may be darker locations between points.

## How do I keep a record or work without internet?

Changes are saved in this browser when storage is available. One tab can edit the draft at a time. “Save / report” downloads a project file you can reopen, a working offline HTML copy, or opens a printable report. CSV contains every planned point, including blanks. The report includes the grid, height, targets, raw readings and entered measurement details. Example data stays labelled. Browser storage can be cleared; keep a downloaded backup.

## 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.

- [Illuminance & Uniformity Analyzer — Full tool instructions (Markdown)](https://ledyi.com/tools/illuminance-uniformity-analyzer.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.

### Illuminance & Uniformity Analyzer

```
POST /api/tools/v1/illuminance
Content-Type: application/json
```

Analyze recorded illuminance on one horizontal rectangular area, sampled at equal-area cell centres. This is measurement analysis, not a lighting simulation. Supply every physical input explicitly in metres and lux. It does not use a phone sensor, invent readings or assess compliance, calibration or measurement uncertainty.

### Measured illuminance and uniformity

The example is illustrative: an 8 m by 6 m rectangle, a horizontal plane 0.75 m above the floor, 6 columns by 4 rows and 24 readings. illuminanceLux is row-major, top row first, left to right; its length must equal rows × columns. A1 is the top-left cell centre, x increases right and y increases down. Null is unmeasured; zero is a recorded value. Set either target to null when it is not supplied; do not infer defaults from a room name.

| Field | Type and constraints | Meaning |
| --- | --- | --- |
| widthM (Required) | {"type":"number","minimum":0.01,"maximum":1000} | Measured rectangle width in metres; coordinates start at the top-left. |
| depthM (Required) | {"type":"number","minimum":0.01,"maximum":1000} | Measured rectangle depth in metres; y increases down the plan. |
| measurementHeightM (Required) | {"type":"number","minimum":0,"maximum":100} | Horizontal sensor plane height above the floor in metres. Do not mix heights or planes. |
| columns (Required) | {"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991} | Whole number of equally spaced columns; one centre reading per equal-area cell. |
| rows (Required) | {"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991} | Whole number of equally spaced rows, labelled A onward in the page. |
| illuminanceLux (Required) | {"maxItems":400,"type":"array"} | Row-major lux readings; length must equal rows × columns. Null means unmeasured; 0 is valid. No interpolation or inferred readings. |
| targets (Required) | {"type":"object","additionalProperties":false} |  |
| targets.averageLux (Required) | {"anyOf":[{"type":"number","minimum":0,"maximum":1000000},{"type":"null"}]} | User-specified average target in lux, or null if unknown. Not a regulatory default. |
| targets.uniformityMinAvg (Required) | {"anyOf":[{"type":"number","minimum":0,"maximum":1},{"type":"null"}]} | User-specified minimum/average ratio target from 0 to 1, or null if unknown. This is not minimum/maximum. |

```
{
  "widthM": 8,
  "depthM": 6,
  "measurementHeightM": 0.75,
  "columns": 6,
  "rows": 4,
  "illuminanceLux": [
    520,
    548,
    564,
    582,
    560,
    534,
    486,
    522,
    550,
    574,
    566,
    540,
    472,
    508,
    539,
    562,
    553,
    524,
    255,
    482,
    520,
    542,
    530,
    500
  ],
  "targets": {
    "averageLux": 500,
    "uniformityMinAvg": 0.6
  }
}
```

### Reading the result

The arithmetic mean uses only recorded points. For a complete equal-area grid, U0 = minimum / mean and minMaxRatio = minimum / maximum. The two ratios are different. Canonical decimal inputs are summed and compared as exact rational values. Returned JSON numeric quantities are finite binary64 projections; targetComparison is authoritative at a rounding boundary. Heat-map interpolation is never part of the calculation.

HTTP 200 can contain result.status=empty, incomplete or complete. plannedPointCount and recordedPointCount disclose coverage. Target comparisons are unset, incomplete, undefined, met or below. Incomplete grids never receive a completed target judgement. If every recorded value is zero, both ratios are null (undefined). points contains every planned location, including null readings; minimumPointIds and maximumPointIds identify all tied extrema. A single point cannot establish room uniformity.

Reject unknown fields, numeric strings, negative readings, missing required geometry, noninteger grid counts, out-of-range values and point-count mismatches with 422. Limits come from the generated request schema; maximum count is 400. A below-target result is a valid analysis, not a transport error. Do not replace invalid input with the example.

To review in the page, save result.project as JSON and use Open project. It contains the same engineering facts and empty site/operator/calibration fields; fill those locally. links.share is null: project metadata is not encoded in a public URL. The browser can print/save PDF, export all points as CSV, download a project, and produce an offline HTML copy. API input does not accept personal or site records; the API does not persist readings. Project files are separate from API requests and have their own format/version. CSV values use metres and lux. The lowest measured point does not establish the continuous-area minimum.

### 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 |
| --- | --- |
| ILLUMINANCE_INCOMPLETE | Some planned points are unmeasured; statistics are provisional and target comparisons are incomplete. |
| ILLUMINANCE_RATIO_UNDEFINED | All recorded readings are zero, so division-by-zero ratios are undefined rather than 0 or 1. |
| ILLUMINANCE_SINGLE_POINT | Only one point was planned; its arithmetic ratio cannot establish spatial uniformity. |

### 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
```

