Repository navigation
Connecting Other Software
PicoCam speaks the standard languages, so most programs work without special setup. Replace <ip> with the camera's address,
user / password with an account from System > Users (viewer is enough for watching).
| What | Address |
|---|---|
| Web portal |
http://<ip>/ (also https://<ip>/) |
| Video, full resolution | rtsp://user:password@<ip>/live/main |
| Video, light (sub stream) | rtsp://user:password@<ip>/live/sub |
| Still picture (JPEG) |
http://<ip>/snapshot.jpg (login required) |
| ONVIF |
http://<ip>/onvif/device_service (also found by automatic discovery) |
| Event stream (WebSocket) | ws://<ip>/ws/events |
Aliases for software that expects another brand's address: /Streaming/Channels/101 and 102, /h264/ch1/main/av_stream,
/cam/realmonitor?channel=1&subtype=0 and subtype=1, /live/0 and /live/1.
Special characters in the password (
@ : / ? #) must be written as%40 %3A %2F %3F %23inside a URL. Or pick a password without them for the camera accounts you use in URLs.
VLC. Media > Open Network Stream, paste the RTSP address. VLC buffers one second by default; for a snappier picture open Tools > Preferences > Show all > Input/Codecs > Network caching and set 150-300 ms.
ffplay (lowest delay).
ffplay -fflags nobuffer -flags low_delay -rtsp_transport tcp rtsp://user:password@<ip>/live/subPhone. Any RTSP viewer app. Or just use the web portal: it is built for phones.
Choosing a stream. Main is for recording and NVRs. Sub (960x540 by default) is for live viewing, phones and AI. If a player cannot show H.265, set the stream to H.264 in Video & Audio.
Add the camera as an ONVIF device (address <ip>, port 80, an account from System > Users), or paste the RTSP address as a
generic camera. Works with Synology Surveillance Station, Blue Iris, Milestone, Hikvision/Dahua NVRs and similar. Motion alarms are
sent as ONVIF events.
cameras:
gate:
ffmpeg:
inputs:
- path: rtsp://user:password@<ip>/live/main
roles: [record]
- path: rtsp://user:password@<ip>/live/sub
roles: [detect]
detect: { width: 960, height: 540, fps: 5 }The camera can also do detection itself on its NPU; Frigate then only records. Use whichever you prefer.
- Quickest: Settings > Devices > Add integration > ONVIF, enter the camera's address, port 80 and an account.
- With events: in the camera under Integrations > MQTT, point it at your broker and switch on Home Assistant discovery. The camera then appears as a device with motion, person, last event, last plate and line-counter sensors.
-
Picture only: the Generic Camera integration with still URL
http://<ip>/snapshot.jpg(use an API key, see below) and stream URLrtsp://user:password@<ip>/live/sub.
| Where | How |
|---|---|
| Telegram | Create a bot with @BotFather, add it to your chat, paste its token and chat id under Integrations > Telegram
|
| Integrations > Email (SMTP): server, port, account, recipient. Use an app password for Gmail | |
| Webhook |
Integrations > Webhooks: any http(s):// address gets a JSON POST for every event |
| MQTT |
Integrations > MQTT: topics <topic>/events, <topic>/events/<type> and a retained <topic>/state (online/offline) |
| FTP | Snapshots uploaded to an FTP server |
| Relay | A GPIO pin pulses when a rule fires (open a gate, switch a lamp). Pin numbers depend on your board |
Every target has its own queue stored on the camera: if the network is down, events wait and are retried for up to 24 hours, even across a reboot.
Webhook example.
{"event": {"id": "20261021-190555-8f10", "ts": 1792589755683, "time": "2026-10-21T19:05:55",
"type": "track", "rule": "Vehicle log", "label": "car", "track_id": 12, "score": 0.81,
"box": [0.31, 0.42, 0.58, 0.77], "attributes": {"plate_text": "MH00PC0000"},
"images": {"snapshot": "...jpg", "plate": "...jpg"}},
"device": {"id": "picocam-743224", "name": "Gate", "location": "", "ip": "192.168.1.64"}}The request carries X-PicoCam-Event-Id (use it to ignore duplicates after a retry). With a secret set, X-PicoCam-Signature: sha256=HMAC(secret, timestamp + "." + body) lets you verify that it really came from your camera.
Create an API key under Integrations > API & keys and send it as Authorization: Bearer pk_... (or use normal account login).
| Call | Returns |
|---|---|
GET /api/status |
health, versions, board details |
GET /api/snapshot.jpg |
a picture now |
GET /api/events?type=&label=&q=&date=&limit= |
events |
GET /api/events/export.csv |
events as CSV |
GET /api/events/<id>/<image>.jpg |
an event picture |
| `GET | PUT /api/config/` |
GET /api/recordings?date=YYYY-MM-DD |
recordings of a day (files support range requests) |
A short script:
curl -H "Authorization: Bearer pk_yourkey" http://<ip>/api/status
curl -H "Authorization: Bearer pk_yourkey" -o now.jpg http://<ip>/snapshot.jpgserver/ in this repository is a small optional program (Go) that receives events from several cameras and shows them in one
dashboard. Point each camera's Integrations > EdgeAI server at it. It is not needed for normal use.
| Port | Use | Change in |
|---|---|---|
| 80 / 443 | web (HTTP / HTTPS) | Security |
| 554 | RTSP | Integrations |
| 3702 (UDP) | ONVIF discovery | switch off in Integrations |
| 22 | SSH | Security |
If a port is already taken PicoCam falls back to 80, then 8080 for the web page, so the portal is never lost.
This wiki is generated from the files in the repository (docs/). To fix a page, send a pull request against the matching file.
PicoCam
Getting started
Going further
Project