Skip to content

Commit 0a49514

Browse files
committed
v1.6.0: enforce schema via Ajv, close schema/data drift, point to cctv-database.com
Schema & validation: - Enforce schema/camera.schema.json in the build via Ajv (was only hand-checking 5 fields; schema had silently drifted). CI now fails on any violation. - Declare 11 fields the data already used: localized prices (msrp_eur/gbp/inr/aed/ aud/cad/vnd/chf), markets, generation, release_notes. - Add storage.notes; widen protocols enum with hdcvi and mxpeg. Data: - Remove invalid ip_rating: null from 3 indoor cameras (Amcrest ASH42-W, Tapo C121/C135). - Reolink Video Doorbell PoE: verified Frigate config + HA details + soc/poe_class/environment. Build & CI: - Decouple dataset mirroring: opt-in via DATA_MIRROR_DIR (local gitignored .env), no hardcoded downstream path. Add ajv/ajv-formats; npm ci step in CI workflows. Website: - Point README + package.json homepage to cctv-database.com. - GitHub Pages demo (docs/index.html) now redirects to the site; keep a standalone offline copy at docs/demo.html. README states the dataset is CC0 and always will be.
1 parent 243c7e9 commit 0a49514

17 files changed

Lines changed: 1704 additions & 1358 deletions

File tree

.github/workflows/build.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ jobs:
1313
- uses: actions/setup-node@v4
1414
with:
1515
node-version: "20"
16+
- name: Install dependencies
17+
run: npm ci
1618
- name: Build & validate dataset
1719
run: node scripts/build.js
1820
- name: Generate docs
@@ -41,6 +43,8 @@ jobs:
4143
- uses: actions/setup-node@v4
4244
with:
4345
node-version: "20"
46+
- name: Install dependencies
47+
run: npm ci
4448
- name: Build dataset
4549
run: node scripts/build.js
4650
- name: Copy data into docs for Pages

.github/workflows/release.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ jobs:
1919
with:
2020
node-version: "20"
2121

22+
- name: Install dependencies
23+
run: npm ci
24+
2225
- name: Determine version
2326
id: version
2427
run: |

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ node_modules/
22
*.log
33
.DS_Store
44
.idea/
5+
.env

CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,27 @@ Format: [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
66

77
---
88

9+
## [1.6.0] — 2026-06-17
10+
11+
### Added
12+
13+
- **Schema validation now enforced in the build** — every entry is validated against `schema/camera.schema.json` via Ajv. Previously the build only hand-checked five required fields, so the schema had silently drifted from the data; it is now the single source of truth and CI fails on any violation.
14+
- **11 fields added to the schema** that the data already used but never declared: localized prices `msrp_eur`, `msrp_gbp`, `msrp_inr`, `msrp_aed`, `msrp_aud`, `msrp_cad`, `msrp_vnd`, `msrp_chf`; plus `markets`, `generation`, and `release_notes`.
15+
- **`storage.notes`** field — free-text storage notes (e.g. external-hub requirements).
16+
- **`hdcvi` and `mxpeg`** added to the `protocols` enum (HD-CVI coax for HiLook/Dahua analog; MxPEG for Mobotix).
17+
- **Reolink Video Doorbell PoE** enriched — verified Frigate config (tested by blakeblacksear on v0.14, go2rtc), Home Assistant details (`local_push`, doorbell button, two-way audio, ONVIF events), plus `soc` (Novatek NT98566), `poe_class`, and outdoor `environment`.
18+
19+
### Fixed
20+
21+
- Removed invalid `ip_rating: null` from 3 indoor cameras (Amcrest ASH42-W, Tapo C121, Tapo C135) — the field is optional and `null` is not a valid rating.
22+
23+
### Changed
24+
25+
- Dataset mirroring to a downstream consumer is now opt-in via the `DATA_MIRROR_DIR` env var (configurable through a local, gitignored `.env`), replacing a hardcoded copy path in the build script.
26+
- **Project now points to the website at [cctv-database.com](https://cctv-database.com)** — README links and `package.json` `homepage` updated. The GitHub Pages demo redirects there, with a standalone offline copy kept at `docs/demo.html`. The README now states explicitly that the dataset is CC0 and always will be.
27+
28+
---
29+
930
## [1.5.0] — 2026-06-12
1031

1132
### Added

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,15 @@ An open, structured database of 1,314 CCTV / IP camera models and their technica
1212

1313
Camera spec sheets are scattered across vendor PDFs, retailer pages, and paywalled databases (IPVM, etc.) in inconsistent formats. This repo normalises them into one machine-readable structure so they can be compared, filtered, and reused.
1414

15+
**The dataset is CC0 and always will be** — free to use, copy, and redistribute with no restrictions. The website is just a convenient viewer; the data here is the source of truth.
16+
1517
---
1618

1719
## Browse online
1820

19-
**[Live Demo ](https://ch-bas.github.io/cctv-camera-databse)**
21+
**[Browse the database → cctv-database.com](https://cctv-database.com)**
22+
23+
Prefer to self-host or browse offline? A [standalone demo](docs/demo.html) (just `demo.html` + `cameras.json`, no build step) is included — serve the `docs/` folder locally with any static server, e.g. `python3 -m http.server` inside `docs/`, then open it.
2024

2125
<p align="center">
2226
<img src="docs/demo.gif" alt="CCTV Camera Database — browse, search, filter, and inspect 1,296 cameras across 64 brands" width="800" />

cameras/amcrest/ash42-w.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@
2929
"protocols": [
3030
"rtsp"
3131
],
32-
"ip_rating": null,
3332
"audio": {
3433
"microphone": true,
3534
"speaker": true,

cameras/reolink/video-doorbell-poe.json

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
"range_m": 5
2525
},
2626
"power": {
27-
"method": "PoE (IEEE 802.3af) / 12-24VAC doorbell wiring / 24VDC"
27+
"method": "PoE (IEEE 802.3af) / 12-24VAC doorbell wiring / 24VDC",
28+
"poe_class": 2
2829
},
2930
"storage": {
3031
"onboard": true,
@@ -52,6 +53,10 @@
5253
"works with Reolink NVR"
5354
],
5455
"release_year": 2022,
56+
"environment": [
57+
"outdoor"
58+
],
59+
"soc": "Novatek NT98566",
5560
"sources": [
5661
"https://reolink.com/product/reolink-video-doorbell-poe/"
5762
],
@@ -88,11 +93,19 @@
8893
},
8994
"rtsp_url_template": "rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main",
9095
"best_substream": "rtsp://{user}:{pass}@{ip}:554/h264Preview_01_sub",
91-
"notes": "Portrait 3:4 aspect ratio (white model 1920x2560, black model is 4:3 at 2560x1920). Set detect to 720x960 for white or 960x720 for black to maintain correct ratio. For two-way audio: use go2rtc as the RTSP proxy — Frigate does not natively handle talk-back. In go2rtc config add the camera as an RTSP source, then enable WebRTC with opus re-encoding for the back-channel: 'streams: doorbell: - rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main - ffmpeg:doorbell#audio=opus'. Button press events are not exposed via RTSP; use HA Reolink integration's Visitor binary_sensor or subscribe to ONVIF events via MQTT."
96+
"notes": "Portrait 3:4 aspect ratio (white model 1920x2560, black model is 4:3 at 2560x1920). Set detect to 720x960 for white or 960x720 for black to maintain correct ratio. For two-way audio: use go2rtc as the RTSP proxy — Frigate does not natively handle talk-back. In go2rtc config add the camera as an RTSP source, then enable WebRTC with opus re-encoding for the back-channel: 'streams: doorbell: - rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main - ffmpeg:doorbell#audio=opus'. Button press events are not exposed via RTSP; use HA Reolink integration's Visitor binary_sensor or subscribe to ONVIF events via MQTT.",
97+
"verified": true,
98+
"tested_by": "blakeblacksear",
99+
"tested_version": "0.14",
100+
"recommended_stream_type": "go2rtc"
92101
},
93102
"home_assistant": {
94103
"integration": "reolink",
95-
"notes": "Native Reolink integration auto-discovers via ONVIF (port 8000). Doorbell button press is exposed as a 'Visitor' binary_sensor entity. Two-way audio works in the Reolink app; for HA dashboard intercom, use go2rtc WebRTC card with opus back-channel."
104+
"notes": "Native Reolink integration auto-discovers via ONVIF (port 8000). Doorbell button press is exposed as a 'Visitor' binary_sensor entity. Two-way audio works in the Reolink app; for HA dashboard intercom, use go2rtc WebRTC card with opus back-channel.",
105+
"connection_type": "local_push",
106+
"doorbell_button": true,
107+
"two_way_audio": true,
108+
"onvif_events": true
96109
},
97110
"blue_iris": {
98111
"profile": "Reolink",

cameras/tapo/c121.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
"rtsp",
3636
"onvif"
3737
],
38-
"ip_rating": null,
3938
"audio": {
4039
"microphone": true,
4140
"speaker": true,

cameras/tapo/c135.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
"rtsp",
3636
"onvif"
3737
],
38-
"ip_rating": null,
3938
"audio": {
4039
"microphone": true,
4140
"speaker": true,

data/cameras.json

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2679,7 +2679,6 @@
26792679
"protocols": [
26802680
"rtsp"
26812681
],
2682-
"ip_rating": null,
26832682
"audio": {
26842683
"microphone": true,
26852684
"speaker": true,
@@ -80367,7 +80366,8 @@
8036780366
"range_m": 5
8036880367
},
8036980368
"power": {
80370-
"method": "PoE (IEEE 802.3af) / 12-24VAC doorbell wiring / 24VDC"
80369+
"method": "PoE (IEEE 802.3af) / 12-24VAC doorbell wiring / 24VDC",
80370+
"poe_class": 2
8037180371
},
8037280372
"storage": {
8037380373
"onboard": true,
@@ -80395,6 +80395,10 @@
8039580395
"works with Reolink NVR"
8039680396
],
8039780397
"release_year": 2022,
80398+
"environment": [
80399+
"outdoor"
80400+
],
80401+
"soc": "Novatek NT98566",
8039880402
"sources": [
8039980403
"https://reolink.com/product/reolink-video-doorbell-poe/"
8040080404
],
@@ -80431,11 +80435,19 @@
8043180435
},
8043280436
"rtsp_url_template": "rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main",
8043380437
"best_substream": "rtsp://{user}:{pass}@{ip}:554/h264Preview_01_sub",
80434-
"notes": "Portrait 3:4 aspect ratio (white model 1920x2560, black model is 4:3 at 2560x1920). Set detect to 720x960 for white or 960x720 for black to maintain correct ratio. For two-way audio: use go2rtc as the RTSP proxy — Frigate does not natively handle talk-back. In go2rtc config add the camera as an RTSP source, then enable WebRTC with opus re-encoding for the back-channel: 'streams: doorbell: - rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main - ffmpeg:doorbell#audio=opus'. Button press events are not exposed via RTSP; use HA Reolink integration's Visitor binary_sensor or subscribe to ONVIF events via MQTT."
80438+
"notes": "Portrait 3:4 aspect ratio (white model 1920x2560, black model is 4:3 at 2560x1920). Set detect to 720x960 for white or 960x720 for black to maintain correct ratio. For two-way audio: use go2rtc as the RTSP proxy — Frigate does not natively handle talk-back. In go2rtc config add the camera as an RTSP source, then enable WebRTC with opus re-encoding for the back-channel: 'streams: doorbell: - rtsp://{user}:{pass}@{ip}:554/h264Preview_01_main - ffmpeg:doorbell#audio=opus'. Button press events are not exposed via RTSP; use HA Reolink integration's Visitor binary_sensor or subscribe to ONVIF events via MQTT.",
80439+
"verified": true,
80440+
"tested_by": "blakeblacksear",
80441+
"tested_version": "0.14",
80442+
"recommended_stream_type": "go2rtc"
8043580443
},
8043680444
"home_assistant": {
8043780445
"integration": "reolink",
80438-
"notes": "Native Reolink integration auto-discovers via ONVIF (port 8000). Doorbell button press is exposed as a 'Visitor' binary_sensor entity. Two-way audio works in the Reolink app; for HA dashboard intercom, use go2rtc WebRTC card with opus back-channel."
80446+
"notes": "Native Reolink integration auto-discovers via ONVIF (port 8000). Doorbell button press is exposed as a 'Visitor' binary_sensor entity. Two-way audio works in the Reolink app; for HA dashboard intercom, use go2rtc WebRTC card with opus back-channel.",
80447+
"connection_type": "local_push",
80448+
"doorbell_button": true,
80449+
"two_way_audio": true,
80450+
"onvif_events": true
8043980451
},
8044080452
"blue_iris": {
8044180453
"profile": "Reolink",
@@ -87615,7 +87627,6 @@
8761587627
"rtsp",
8761687628
"onvif"
8761787629
],
87618-
"ip_rating": null,
8761987630
"audio": {
8762087631
"microphone": true,
8762187632
"speaker": true,
@@ -87775,7 +87786,6 @@
8777587786
"rtsp",
8777687787
"onvif"
8777787788
],
87778-
"ip_rating": null,
8777987789
"audio": {
8778087790
"microphone": true,
8778187791
"speaker": true,

0 commit comments

Comments
 (0)