Add lamp comparison export with TM-30 computation
lamp_export.py writes the per-lamp bundle consumed by the buildfor.life comparison pages: spd.csv (full 380-1050 nm spectrum), tm30.csv (ANSI/IES TM-30-18 hue-bin data for the color vector graphic), and metrics.json (photometric, colorimetric, CRI R1-R15, TM-30 Rf/Rg, electrical, supply settings). - tm30.py computes TM-30-18 via colour-science from the measured spectrum, resampled to a uniform 1 nm grid; validated against CIE FL2 (Rf 70, Rg 86) - Optional built-in PSU control (--mode/--voltage/--frequency/--current), switched on for the measurement and off afterwards, with --settle warm-up and --interval between readings - Readings use the vendor single-shot cycle verified from USB captures: test config -> trigger (8C 0E 02) -> poll -> read -> reset per reading - Also supports --passive and --parse <pcap> sources
This commit is contained in:
@@ -14,6 +14,10 @@ vendor software for measurement automation and data extraction.
|
||||
- **Power supply**: Control the built-in AC (100-240V, 50/60Hz) and DC
|
||||
(1-60V, 0-5A) power supply
|
||||
- **Export**: CSV output for data logging
|
||||
- **TM-30**: ANSI/IES TM-30-18 Rf, Rg, and hue-bin data computed from the
|
||||
measured spectrum (via colour-science)
|
||||
- **Lamp bundles**: one-command export of spectrum + TM-30 + metrics for the
|
||||
[buildfor.life lamp comparison](https://buildfor.life/comparisons)
|
||||
|
||||
## Quick Start
|
||||
|
||||
@@ -58,6 +62,34 @@ uv run hpcs6500.py --psu-off
|
||||
uv run hpcs6500.py --integration 500
|
||||
```
|
||||
|
||||
## Lamp Comparison Export
|
||||
|
||||
Produces the per-lamp data bundle consumed by the buildfor.life comparison
|
||||
pages: `spd.csv` (full 380-1050 nm spectrum), `tm30.csv` (TM-30-18 hue-bin
|
||||
data for the color vector graphic), and `metrics.json` (photometric,
|
||||
colorimetric, CRI R1-R15, TM-30 Rf/Rg, electrical).
|
||||
|
||||
```bash
|
||||
# Single reading from the device
|
||||
uv run lamp_export.py --name philips-a60-8w --manufacturer Philips --model "A60 8W 927"
|
||||
|
||||
# Average several readings
|
||||
uv run lamp_export.py --name philips-a60-8w --readings 5
|
||||
|
||||
# Power the lamp from the built-in supply: 230 V / 50 Hz, 60 s warm-up,
|
||||
# PSU switches on before the readings and off afterwards
|
||||
uv run lamp_export.py --name philips-a60-8w --voltage 230 --frequency 50 --settle 60
|
||||
|
||||
# From an existing pcap capture
|
||||
uv run lamp_export.py --name some-lamp --parse captures/run.pcap
|
||||
```
|
||||
|
||||
Output lands in `lamps/<name>/`. TM-30 is computed from the measured spectrum
|
||||
with [colour-science](https://www.colour-science.org/); the spectrum is
|
||||
relative, which TM-30 is invariant to. Sanity check of the implementation:
|
||||
`uv run tm30.py` reproduces the published values for the CIE FL2 illuminant
|
||||
(Rf 70, Rg 86).
|
||||
|
||||
## Offline Parsing
|
||||
|
||||
Parse previously captured USB traffic (pcap files from USBPcap):
|
||||
@@ -72,6 +104,8 @@ uv run hpcs6500.py --parse captures/some_capture.pcap --quick
|
||||
| File | Description |
|
||||
|------------------|----------------------------------------------------|
|
||||
| `hpcs6500.py` | Driver class (`HPCS6500`) and CLI |
|
||||
| `lamp_export.py` | Lamp comparison bundle export (spd/tm30/metrics) |
|
||||
| `tm30.py` | ANSI/IES TM-30-18 computation from a spectrum |
|
||||
| `usb_capture.py` | USB traffic capture tool (requires USBPcap) |
|
||||
| `PROTOCOL.md` | Complete protocol reference (byte-level) |
|
||||
| `pyproject.toml` | Project metadata and dependencies |
|
||||
@@ -86,6 +120,7 @@ uv run hpcs6500.py --parse captures/some_capture.pcap --quick
|
||||
|
||||
- Python 3.11+
|
||||
- `pyserial` (serial communication)
|
||||
- `colour-science` (TM-30 computation)
|
||||
- USBPcap (only for `usb_capture.py`, not needed for normal operation)
|
||||
|
||||
## Protocol
|
||||
|
||||
Reference in New Issue
Block a user