Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
15 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
62 changes: 61 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,67 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)

---

## [2.30.0] — Unreleased
## [2.31.0] — Unreleased

### Added
- **QuarkView, new brand: 22 cameras** (Shenzhen Kuake Trading Co., Ltd.), starting from the TA-XM-605GP-AI-80N requested in #421. The others are PoE bullets and domes (605GP, 608GP, 629EBP, DM13EP, DM27SP), PT825-family PoE and Wi-Fi pan-tilt and dual-lens cameras, Wi-Fi, battery and solar cameras, and two Tuya cameras. Specs come from QuarkView's own product pages and family manuals. RTSP paths are included only where a QuarkView manual documents them (the Xiongmai main-stream path); app-only cameras are marked `cloud-required`.
- **41 cameras found by comparing makers' catalogues with the dataset:**
- Milesight: 15 D2-series mini bullets and domes (PD2 / FPD2), from their own datasheets (NDAA per the datasheet)
- Dahua: 13, including the WizColor Lite PRO line, WizSense 2 TS cameras, Lite and HDCVI full-colour models, and SD2/SD4/SD5 PTZs
- Swann: EliteX 6K bullet, AdvancedX bullet and dome, MaxRanger4K
- Uniview: the HC191 ANPR checkpoint units
- Tiandy: 2; Annke: 2 (C500D I51HK, I81HZ thermal); Wyze Bulb Cam Pan Color; Reolink OMVI 2i Ultra (announced); Lorex IC301

Every value comes from the maker's own product page or datasheet. Catalogue entries that are variants of existing records, accessories, subscription plans, unreleased pages, or products whose page has no spec table were left out.
- **50 Imou cameras** (Imou now has 164), found by comparing imou.com's product catalogue with the dataset. They include:
- the 2MP and 3MP variants of the Bullet, Cruiser, Cell and Ranger lines (where the dataset had only the 4MP/5MP model)
- DK3, the PS-series bullets, turrets, PTZs and dual-lens cameras (PS2M, PS3D, PS3E, PS7F, PS70F, PS8D, PS8E)
- Rex, Rex 2D, Rex 3D and Rex VT
- the S21FA/S41FA PoE PTZs and the T42EA PoE turret
- Doorbell Wired and the VDP7 2-wire video door phone

Specs come from Imou's own detail and specification pages and the datasheets they link. Model codes are recorded where Imou publishes them. RTSP/ONVIF configs are included only where the spec sheet lists ONVIF, using the Dahua path existing Imou records use (unverified).
- **eufy Window Camera E10** (T8404121), from the official us.eufy.com spec table.
- **22 more cameras from makers' stores and datasheet libraries:**
- Amcrest (12): the NOVALINK solar, 4G and pan-tilt cameras, the AF-2M HD-analog bullets and dome, Qcam IP bullets, and the Eco 720p bullet and dome
- HiLook (7): HAA-series domes, /SX strobe bullets and the DS-T200 Turbo HD camera
- Campark (2): SC22 and BC1154
- Techage (1): the DM28 8MP fisheye

Store listings that turned out to be existing cameras now match through new aliases (EmpireTech PTZ8C42X-T180, Hiseeu HD975B-P, Amcrest IP8M-TB2886EW-AI). Campark SC30 is now an alias of the identical Toguard SC30.

### Changed
- **Imou correction pass: 96 of the 119 existing Imou records corrected** against Imou's official spec pages and the datasheets they link. The fixes:
- values copied from a sibling variant: the 5MP Bullet 2C/2C Pro/2E Pro/3, Cell 3C All-in-One, Rex 3D R1 and Cruiser Dual records
- the VDP7 PoE door phone carried the 2-wire model's power and Wi-Fi values
- the Cruiser 4G night-vision range (10 → 30 m)
- three cameras typed as box/turret that are pan-tilt (A1 4MP, PS2M 4K, Rex 3D R1)
- Wi-Fi-only models listing an Ethernet port
- wrong or sibling order codes (official codes are now aliases)
- missing sensor, FOV, frame-rate and microSD values added where the sheets state them
- two retail price strings removed

Every corrected record says what changed in `release_notes` and cites the spec page and datasheet. Values the official sheets don't state were left unchanged. Where Imou's spec page and datasheet disagree, the record notes both.
- **Imou duplicates merged:** Imou publishes some cameras under two names with identical official spec tables. Each pair is now one record, with the other name and codes kept as aliases:
- Ranger 2C Pro 5MP → Ranger 2 Pro 5MP
- Cue 2 3MP → Cue 2E 3MP
- Ranger 2C Dual 10MP → Ranger 2 Dual
- A1 Dual → Ranger 2C Dual 6MP
- T22EA → Turret SE 2MP

On the website, the old camera URLs redirect to the remaining record.

### Removed
- **`imou-indoor-2k`:** it matched no Imou product. Its sources describe the 2MP fixed Cue 2, but the record claimed a 3MP pan-tilt camera. Its URL now redirects to the Imou brand page.
- **ACTi RTSP port:** 22 ACTi cameras now use port 554 instead of 7070: A214, A426, A711, A713, A826, A951, A952, A956, Q450, Q83, Z32, Z33, Z34, Z36, Z37, Z41, Z42, Z71, Z710, Z84, Z94 and Z95. ACTi's own firmware manuals give two defaults: 7070 for most firmware generations (V, A, S and C series) and 554 for newer models and the Z-series OEM line. Only records whose own manual states 554 changed; every other ACTi record keeps 7070. Configs a user has verified are never changed by bulk corrections (none of these had one). The brand-level RTSP pattern for ACTi now says 7070, with 554 for the newer lines.
- **CONTRIBUTING.md:**
- The field reference is rebuilt from the schema. The removed `msrp_*` price fields are gone, the type, connectivity, protocol and IK enums are corrected, and 19 undocumented fields are now documented.
- The rules now match how records are built: official sources only (retailers only corroborate), one record per camera with packaging variants as aliases, and min-lux only when labelled.
- **README:** the QA tool section now gives the correct data path.

---

## [2.30.0] — 2026-10-25

### Added
- **UNICAM Systems, new brand: 53 cameras** from the Indian maker's official catalogue at unicamsystems.com. They break down as:
Expand Down
88 changes: 54 additions & 34 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ Only five fields are required. Everything else is optional — partial entries a
}
```

A complete entry looks like this:
A fuller entry looks like this:

```json
{
Expand All @@ -100,74 +100,94 @@ A complete entry looks like this:
"model": "RLC-823A",
"aliases": ["Reolink 4K Smart Spotlight Camera"],
"type": "bullet",
"connectivity": ["poe", "wifi"],
"connectivity": ["ethernet"],
"power_source": ["poe", "dc"],
"release_year": 2023,
"resolution": { "megapixels": 8, "label": "4K UHD" },
"resolution": { "megapixels": 8, "max_width": 3840, "max_height": 2160, "label": "4K UHD" },
"video": { "codecs": ["H.265", "H.264"], "max_fps": 25 },
"sensor": "1/2.7\" CMOS",
"lens": { "count": 1, "focal_length_mm": "2.8", "aperture": "F1.6", "varifocal": false },
"field_of_view_deg": "110 horizontal",
"field_of_view_deg": "110",
"night_vision": { "type": "color", "range_m": 20 },
"power": { "method": "PoE (802.3af) / DC 12V" },
"storage": { "onboard": true, "max_microsd_gb": 512, "nvr_compatible": true, "cloud": false },
"protocols": ["onvif", "rtsp"],
"ip_rating": "IP67",
"audio": { "microphone": true, "speaker": true, "two_way": true },
"environment": ["outdoor"],
"features": ["no subscription", "person/vehicle/animal/package AI", "active deterrence"],
"msrp_usd": 79.99,
"markets": ["US", "CA", "AU", "EU"],
"sources": ["https://reolink.com/product/rlc-823a/"]
"sources": ["https://reolink.com/product/rlc-823a/"],
"last_verified": "2026-10-26"
}
```

(Illustrative only: take every value from the camera's own datasheet.)

### Field reference

The authoritative definition is [`schema/camera.schema.json`](schema/camera.schema.json); unknown fields are rejected. The most used fields:

| Field | Required | Type | Notes |
|-------|----------|------|-------|
| `id` | ✅ | string | lowercase slug, e.g. `reolink-rlc-823a`. Must be unique. |
| `brand` | ✅ | string | Canonical brand name, e.g. `Hikvision` |
| `model` | ✅ | string | Exact model number from the manufacturer |
| `type` | ✅ | enum | `bullet` `dome` `turret` `ptz` `dual-lens` `panoramic` `fisheye` `covert` `box` |
| `resolution` | ✅ | object | `{ megapixels: 8, label: "4K UHD" }` |
| `aliases` | — | string[] | Alternate model names, marketing names, regional SKUs |
| `connectivity` | — | enum[] | `poe` `wifi` `ethernet` `battery` `4g` `analog` |
| `type` | ✅ | enum | `bullet` `dome` `turret` `ptz` `dual-lens` `fisheye` `covert` `box` `panoramic` `floodlight` `doorbell` |
| `resolution` | ✅ | object | `{ megapixels, max_width, max_height, label }`, e.g. `{ "megapixels": 8, "label": "4K UHD" }` |
| `aliases` | — | string[] | Other order numbers for the same camera (lens size, colour, regional or option suffixes) and marketing names |
| `connectivity` | — | enum[] | How the camera sends data: `ethernet` `wifi` `4g` `5g` `coax`. Power over Ethernet goes in `power_source`, not here. |
| `power_source` | — | enum[] | `poe` `dc` `usb` `battery` `solar` `ac-mains` (use `ac-mains` for 24 VAC) |
| `video.codecs` | — | enum[] | `H.264` `H.264+` `H.265` `H.265+` `MJPEG` `JPEG` `AV1` `Ultra265` `MPEG-4` |
| `video.max_fps` | — | integer | Max frame rate at the highest resolution |
| `video.streams` | — | object[] | `{ name: main\|sub\|third, resolution: "WxH", fps, codec }` as listed in the datasheet |
| `release_year` | — | integer | Year first sold |
| `sensor` | — | string | e.g. `1/2.7" CMOS` |
| `lens.focal_length_mm` | — | string | e.g. `2.8` or `2.7-13.5 (5x motorized varifocal)` |
| `lens.count` | — | integer | Number of lenses |
| `lens.focal_length_mm` | — | string | e.g. `2.8` or `2.7-13.5` |
| `lens.aperture` | — | string | e.g. `F1.6` |
| `lens.varifocal` | — | boolean | |
| `field_of_view_deg` | — | string | e.g. `110 horizontal` |
| `field_of_view_deg` | — | string | Horizontal FOV without the `°` sign, e.g. `110` or `102-31` |
| `night_vision.type` | — | enum | `ir` `color` `hybrid` `none` |
| `night_vision.range_m` | — | integer | Manufacturer-stated range in metres |
| `night_vision.min_lux` | — | number | minimum illumination for usable image (B&W or unspecified) |
| `night_vision.min_lux_color` | — | number | minimum illumination for usable color image |
| `night_vision.range_m` | — | integer | Manufacturer-stated range in metres (the maximum of a range) |
| `night_vision.min_lux` | — | number | Black-and-white minimum illumination, **only if the datasheet labels it B/W**. Never record "0 lux with IR". |
| `night_vision.min_lux_color` | — | number | Colour minimum illumination, only if labelled colour |
| `ptz.autotracking` | — | boolean | Camera-side (motorised) subject tracking |
| `ptz.onvif_ptz` | — | enum | `relative` `absolute` `continuous` `none` (only if stated) |
| `power.method` | — | string | e.g. `PoE (802.3af) / DC 12V` |
| `power.consumption_w` | — | number | Maximum power draw in watts |
| `power.poe_class` | — | integer | `0`–`8`, only if the class is stated |
| `storage.onboard` | — | boolean | Has a microSD slot |
| `storage.max_microsd_gb` | — | integer | |
| `storage.nvr_compatible` | — | boolean | Works with third-party NVRs |
| `storage.cloud` | — | boolean | Has cloud storage option |
| `protocols` | — | enum[] | `onvif` `rtsp` `rtmp` `http` `p2p` |
| `storage.cloud` | — | boolean | Has a cloud storage option |
| `protocols` | — | enum[] | `onvif` `rtsp` `rtmp` `http` `p2p` `hdcvi` `mxpeg` |
| `ip_rating` | — | string | e.g. `IP67`, `IP66` |
| `ik_rating` | — | enum[] | `IK00` `IK01` `IK02` `IK03` `IK04` `IK05` `IK06` `IK07` `IK08` `IK09` `IK10` `IK11` |
| `audio.microphone` | — | boolean | |
| `audio.speaker` | — | boolean | |
| `audio.two_way` | — | boolean | |
| `features` | — | string[] | Free-text list of notable features |
| `msrp_usd` | — | number | Approximate price in USD |
| `msrp_eur` | — | number | Approximate price in EUR |
| `msrp_gbp` | — | number | Approximate price in GBP |
| `msrp_aud` | — | number | Approximate price in AUD |
| `msrp_inr` | — | number | Approximate price in INR |
| `msrp_aed` | — | number | Approximate price in AED |
| `msrp_cad` | — | number | Approximate price in CAD |
| `markets` | — | string[] | ISO country codes + region tags: `US` `UK` `EU` `DE` `FR` `IN` `AU` `AE` `SA` `MENA` `LATAM` etc. |
| `sources` | — | string[] | Datasheet / retailer URLs — please include at least one |
| `ik_rating` | — | enum | `IK00` … `IK11` |
| `audio.microphone` / `audio.speaker` / `audio.two_way` | — | boolean | |
| `environment` | — | enum[] | `indoor` `outdoor` (a weatherproof IP rating means `outdoor`) |
| `operating_temp_c` | — | string | e.g. `-30 to 60` |
| `dimensions_mm` | — | string | as stated, e.g. `167.5 x 74.5 x 74.5` |
| `weight_g` | — | number | Net weight in grams |
| `network.ethernet_speed_mbps` | — | enum | `10` `100` `1000` `2500` `10000` |
| `ndaa_compliant` | — | boolean | Only with an official basis (maker statement, compliance list, or Section 889-named brand); otherwise omit |
| `cloud_dependency` | — | enum | `local` `cloud-optional` `cloud-required` |
| `status` | — | enum | `available` `announced` `discontinued` |
| `generation` | — | string | Product line, e.g. `Wisenet X` |
| `soc` | — | string | System-on-chip, only if officially stated |
| `features` | — | string[] | Short factual list of notable features |
| `markets` | — | string[] | Country codes and region tags: `US` `UK` `EU` `DE` `FR` `IN` `AU` `AE` `SA` `MENA` `LATAM` `global` etc. |
| `sources` | — | string[] | Official datasheet / product page URLs (at least one) |
| `last_verified` | — | string | `YYYY-MM-DD` date the record was last checked against its sources |
| `release_notes` | — | string | Short note on the source and any caveats |
| `configs` | — | object | Frigate / Home Assistant / Blue Iris settings (see below) |

### ID conventions

- Always lowercase
- Hyphens only — no underscores, dots, or spaces
- Format: `<brand-slug>-<model-slug>`
- Regional variants: append `-<region>`, e.g. `hikvision-ds-2cd2387g2-lu-uk`
- Regional variants with different hardware: append `-<region>`, e.g. `hikvision-ds-2cd2387g2-lu-uk` (packaging-only variants are aliases, not new IDs)
- Generation variants: append `-v2`, `-gen2`, `-s2`, etc.

### Naming the file
Expand All @@ -187,9 +207,9 @@ cameras/hikvision/ds-2cd2387g2-lu.json → id: "hikvision-ds-2cd2387g2-lu"

## What makes a good entry

- **Source it.** Always include at least one URL in `sources` — official datasheet preferred, reputable retailer accepted
- **Source it officially.** Always include at least one URL in `sources` pointing at the manufacturer's datasheet, manual or product page. Retailer listings can corroborate a value but are never the only source
- **Don't guess specs.** If you're unsure, leave the field out — a partial entry is better than a wrong one
- **One file per variant.** Regional editions (different firmware, power supply, certifications) should be separate entries with a market suffix in the ID
- **One record per camera, variants as aliases.** Order numbers that differ only in lens size, housing colour, PAL/NTSC, mount or a regional/option suffix go in `aliases` of one record. Use a separate record (with a suffix in the ID) only when the hardware differs: different sensor, resolution, lens type, housing, power or certification
- **No marketing copy in `features`.** Keep features factual and terse: `"no subscription"` not `"experience true security freedom with zero monthly fees"`
- **Auto-tracking → set `ptz.autotracking`.** If a `ptz` / `dual-lens` / `panoramic` camera does onboard auto-tracking (it physically moves to follow a subject), set `"ptz": { "autotracking": true }` — the build **fails** if such a camera mentions auto-tracking only in `features`. If the tracking is *digital*/e-PTZ (software crop, no motor), don't set the flag; describe it as digital in `features` instead.

Expand Down
Loading
Loading