Bundle
dsh-ls125-uv-probe
LinShang LS125 UV irradiance meter / UVALED-X3 probe: fully reverse-engineered 9600 8N1 protocol (28-byte frames, CRC-16/MODBUS, poll + clear commands) provided as a DSH skill, together with the capture/decode toolchain and a verified STM32F103 host firmware.
- Source
- 2333hutao
- License
- MIT
- Updated
- Updated 4 days ago
Readme
# dsh-ls125-uv-probe
A **DeepSeek Harness skill plugin** for the **林上 LinShang LS125 紫外辐照计** and its
**UVALED-X3** UV probe: the private UART protocol between the meter and the probe,
reverse-engineered end to end, plus the tooling to capture and decode it and a
**verified host firmware** that replaces the original meter.
> 中文说明:[README.zh.md](README.zh.md)
Install it and your agent gains a `ls125-uv-probe` skill — the protocol table, the
commands, the toolchain usage, and the traps that make a working setup look dead.
## What it answers
| Question | Answer |
|---|---|
| Can I read this probe from my own MCU, without the original meter? | **Yes** — verified on an STM32F103: 21/21 frames, zero CRC errors, zero timeouts |
| What is the protocol? | **9600 8N1**, polled every 500 ms, 28-byte replies, **CRC-16/MODBUS** |
| Is there a hidden handshake, challenge, or ID check? | **No** — the poll command is a constant 8-byte string |
| Can I reset the probe's records? | **Yes** — a second command; it clears energy, minimum, and the elapsed-time counter |
| Do I have to send the meter's startup configuration? | **No** — polling alone is enough (verified) |
## Install
```sh
dsh plugin --profile web add dsh-ls125-uv-probe
```
Or straight from this repository:
```sh
dsh plugin --profile web add github:2333hutao/dsh-ls125-uv-probe
```
## Protocol at a glance
```
主机 → 探头 轮询(每 500 ms) AB 20 60 00 14 00 89 07
清零 AB 21 20 00 02 00 01 00 3D 8A
探头 → 主机 28 字节帧,帧头 AB 20 60 00 14 00
偏移 6–9 float LE 实时辐照度 µW/cm²(表显 mW/cm² = ÷1000)
偏移 10–13 float LE 累积能量 µJ/cm²
偏移 14–15 uint16 LE 距上次清零的时间 ×0.1 s
偏移 16–17 2 字节 恒 0(含义未定)
偏移 18–21 float LE 最小值 µW/cm²
偏移 22–25 float LE 平均辐照度 µW/cm²
偏移 26–27 uint16 LE CRC-16/MODBUS(over 0–25,poly 0xA001 / init 0xFFFF / LSB-first)
```
Frame values are **always** µW/cm² and µJ/cm² regardless of the meter's display
unit setting, so a host never has to track that setting. The **maximum is not in
the frame** — the meter computes it, and so should you.
## What ships in here
```
skill/SKILL.md the skill body (protocol quick table, commands, toolchain usage, hard rules)
skill/PROTOCOL.md full specification, command families, reference C implementation
skill/LESSONS.md transferable methodology + 13 measured pitfalls with their verdicts
skill/AGENTS.md a takeover briefing for an agent landing in the workspace
skill/tools/ fx2cap.cjs (capture, official libusb + fx2lafw) and four decode/analysis scripts
skill/firmware/ f103_probe (verified host) and f103_rgb (controllable light source)
skill/captures/ a sample capture so the toolchain can be exercised with no hardware
```
The toolchain bypasses a long-standing sigrok problem: every Windows sigrok build
statically links a 2016 `libusb` whose backend dispatch fails on some systems, so
`fx2lafw` reports `LIBUSB_ERROR_NOT_SUPPORTED` while `--scan` still lists the
device. Reinstalling drivers does not help. `fx2cap.cjs` talks to the device with
an official `libusb` instead, and adds what sigrok lacks: no capture duration cap
and a soft trigger.
## Evidence, not assertions
Every claim above was measured, and the repository keeps the measurements: three
rounds of "frame value ↔ meter display" matched to all four decimals, a 65536-polynomial
brute force that found the checksum, a halt test that proved the probe never speaks
unless polled, and four independent experiments that ruled D4 out as a reset line.
## How this was built — AI authorship disclosure
**All of the code, firmware, tooling and documentation in this repository was written by an
AI agent** (DeepSeek Harness), working from measurements taken on real hardware.
The protocol knowledge here was not copied from a datasheet, a vendor document, or a
third-party implementation — it was captured off the wire, cross-checked against the meter's
own display, and every claim is backed by a recorded experiment. Nothing in `skill/` is
asserted without a measurement behind it, and the few open items are labelled as open.
A human operator did the parts an AI cannot: wiring, power, probes, pressing the meter's
own keys, and reporting what its display showed.
Review it as you would any machine-written code before relying on it. The measurement
evidence is all here, so the claims can be re-checked rather than taken on trust.
## License
MIT
Install
dsh plugin --profile web add github:2333hutao/dsh-ls125-uv-probe
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-ls125-uv-probe from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.