reolink adapter for ioBroker
Adapter for ioBroker Plattform to get Reolink camera information.
In general, all newer Reolink cameras support API commands. They just differ in their supported commands.
One reminder to the password. Try with or without URI encoding, when you have only one special char. Better use no special char and simply a longer password for the same security. Check with http://cam.ip.add.ress/api.cgi?cmd=GetDevInfo&channel=0&user=username&password=yoursecurity if your credentials are working.
If you wish to have any specific API command included...just let me know.
Implemented functions
SET
- PTZ Control / PTZ Guard
- Push Notification
- Set Autofocus values: 0,1
- Set IR light values: Auto, Off
- Set LED light
- Set Mail Notification values: 0, 1
- Play Audio Alarm
- Zoom Focus
Functions can be triggert by changing reolink..settings states.
GET
- Device Info
- PTZ Info
- Drive Info
- Network Info
- Motion Detection
- Auto Focus
- Snapshot
- IR Light
- LED Light
- Mail Notification
Push notification settings
Push notifications to a phone will only be provided if the following conditions are met:
- The Push notifications switch in the adapter is ON.
- For NVRs, both the global and channel switch are ON.
- The Push-notification in the Reolink App of that phone is ON.
The Push-notification in the Reolink app is independent of the adapter setting. It is also independent of the settings on other phones connected to the same camera. Reolink does this so you have an independent way of turning off push notifications per phone. This means deactivating push at iobroker does not touch the toggle button in the app at all.
Example Usage of get image:
sendTo("reolink.0",{action: "snap"}, function(result){
sendTo("matrix-org.0",{file:result});
});
// content from result is JSON :
{ "type": "image/png","base64": "iVBORw....askldfj" }
for telegram this is working
sendTo("reolink.0",{action: "snap"}, function(result){
const buffer =Buffer.from(result.base64, "base64");
sendTo('telegram.0', {
text: buffer,
type: "photo",
caption: 'the image'
});
});
Battery-Powered Cameras
Battery cameras (Argus PT, Argus 3 Pro, ...) use a proprietary protocol and are supported via neolink — an open-source tool that is downloaded automatically on first use.
Quick Setup
- Enable in Config: ✅ "Battery-powered camera"
- Enter Camera UID: Find in Reolink app → Device Info
- Install Dependency (Linux):
sudo apt install gstreamer1.0-rtsp - Start Adapter → RTSP streams available at
rtsp://<server-ip>:8554/<CameraName>/mainStream
The server IP is detected automatically.
<CameraName>is the name set in the adapter config.
Battery Saving
Battery drains fast when active! The adapter uses an auto-disable strategy:
-
streams.enable(boolean) — Enable/disable RTSP streaming- Default:
false(off = battery saving) - Auto-disables after 30 s (configurable)
- Stream pauses automatically when no client is connected
- Default:
-
mqtt.enable(boolean) — Enable MQTT integration for motion/battery/floodlight/PIR- Required for status updates and floodlight/PIR control
- Auto-disables after configurable timeout (battery protection)
- Configure broker in adapter settings
Battery Camera States
| State | Type | R/W | Description |
|---|---|---|---|
streams.enable | boolean | R/W | Start/stop RTSP stream |
streams.mainStream | string | R | RTSP URL for main stream |
streams.subStream | string | R | RTSP URL for sub stream |
mqtt.enable | boolean | R/W | Start/stop MQTT integration |
floodlight | boolean | R/W | Floodlight on/off — status via MQTT, control via MQTT (auto-starts MQTT) |
pir | boolean | R/W | PIR sensor on/off — status via MQTT, control via MQTT (auto-starts MQTT) |
snapshot | button | W | Capture snapshot via RTSP |
query.battery | button | W | Query battery level via neolink CLI |
query.preview | button | W | Capture snapshot via RTSP |
ptz.preset | number | R/W | Move camera to saved preset position (0–9) |
ptz.up/down/left/right | boolean | R/W | Hold-to-move (true=start, false=stop) |
ptz.speed | number | R/W | PTZ movement speed (1–100, default 32) |
status.motion | boolean | R | Motion detected (via MQTT) |
status.battery_level | number | R | Battery level in % (via neolink CLI, periodic) |
snapshotImage | string | R | Last snapshot image (base64, data URI) |
snapshotStatus | string | R | Snapshot status: idle / capturing / success / error |
info.neolink_status | string | R | neolink process state: stopped / running |
PTZ Control
PTZ works via neolink CLI — no MQTT needed.
Directional movement (ptz.up/down/left/right):
- Set to
true→ camera starts moving, auto-stops after 5 s - Set to
false→ camera stops immediately - In VIS: configure a button with
mousedown=true/mouseup=falsefor hold-to-move - Adjust speed with
ptz.speed(1–100)
Presets (ptz.preset): Set to a preset number (0–9) to move to that saved position.
Features
✅ RTSP streams (main + sub)
✅ Snapshot capture (requires ffmpeg)
✅ Floodlight control (status + control via MQTT)
✅ PIR sensor control (status + control via MQTT)
✅ Motion detection (via MQTT)
✅ Battery level (periodic via neolink CLI)
✅ Preview image (auto-updated via MQTT)
✅ PTZ control — directional movement + presets (via neolink CLI)
✅ Multi-platform — neolink binary downloaded automatically (Linux x64/ARM/ARM64, macOS)
MQTT Setup
Configure in adapter settings:
- Broker Host (default:
127.0.0.1) - Broker Port (default:
1883) - Username / Password (optional)
- Auto-disable timeout (default:
30s, battery protection)
MQTT is used for camera status updates and control. The adapter subscribes automatically when mqtt.enable is set to true.
Status topics (published by camera via neolink):
neolink/<camera>/status/motionneolink/<camera>/status/battery_levelneolink/<camera>/status/floodlightneolink/<camera>/status/pirneolink/<camera>/status/preview
Control topics (published by adapter to camera):
neolink/<camera>/control/floodlightneolink/<camera>/control/pir
Troubleshooting
| Problem | Solution |
|---|---|
| "Camera UID required" | Enter UID from Reolink app → Device Info |
| "libgstrtspserver not found" | sudo apt install gstreamer1.0-rtsp |
| Stream won't connect | Enable streams.enable, wait ~5 s for neolink to start |
| Snapshot fails | Install ffmpeg: sudo apt install ffmpeg |
| Floodlight/PIR doesn't react | MQTT starts automatically — wait ~3 s after toggling |
MQTT NotAuthorized | Check broker credentials; neolink uses credentials = ["user", "pass"] format |
| Battery drains fast | Disable streaming when not in use; use MQTT only for motion |
| PTZ unresponsive | Each PTZ command needs ~2 s (P2P camera login) — this is normal |
Doorbell Cameras
Wired Reolink doorbells use the standard HTTP API plus ONVIF for ring detection. Enable "Doorbell camera" in the adapter config to add doorbell-specific states. (This is independent of the battery-camera option.)
| State | Type | R/W | Description |
|---|---|---|---|
sensor.visitor.state | boolean | R | Doorbell button pressed (ring) — delivered via ONVIF event (auto-clears after 10 s) |
sensor.visitor.support | boolean | R | Whether the camera reports a visitor AI type via HTTP (model-dependent) |
doorbell.audioFileList | string | R | JSON list of stored audio files (id, fileName, ...) for quick/auto reply |
doorbell.quickReplyPlay | number | W | Write an audio file id to make the doorbell play that message |
doorbell.autoReplyEnabled | boolean | R/W | Enable/disable automatic reply when the doorbell rings |
doorbell.autoReplyFileId | number | R/W | Audio file id played as auto reply (see doorbell.audioFileList) |
doorbell.autoReplyTimeout | number | R/W | Seconds after the ring before the auto reply is triggered |
Look up the available file ids in doorbell.audioFileList, then use that id for doorbell.quickReplyPlay or doorbell.autoReplyFileId.
Ring detection (ONVIF)
On most Reolink doorbells the button press is not available through the HTTP polling API (GetAiState has no visitor field). The adapter therefore opens an ONVIF PullPoint subscription and listens for the visitor event — when someone rings, sensor.visitor.state is set to true (and auto-clears after 10 s). React to that state change in your scripts/automations.
- Requires ONVIF enabled on the camera (Reolink app → Settings → Network → Advanced → ONVIF).
- Set the ONVIF Port in the adapter config (Reolink default:
8000). - No inbound port / webhook on the ioBroker host is needed — the adapter long-polls the camera.
Known Working Cameras
HTTP API (Standard)
RLC-420-5MP, E1 Outdoor, E1 Zoom, RLC-522, RLC-810A, RLC-823A, Duo 3 PoE
Battery Cameras (via Neolink)
Reolink Argus PT, Reolink Argus 3 Pro
Doorbells (HTTP API + ONVIF ring detection)
Reolink Video Doorbell PoE (D340P)
Changelog
1.4.3 (2026-10-27)
- (@GermanBluefox) Doorbell support: ring detection via ONVIF events (
sensor.visitor.state), quick reply and auto reply (enable via "Doorbell camera" in config; requires ONVIF enabled on the camera) - (oelison) Adapter requires node.js >= 22 now
1.4.2 (2026-03-16)
- (oelison) fast fix for issue #230
1.4.1 (2026-03-15)
- (oelison) fix issue #187
1.4.0 (2026-03-13)
- (bloop16) Battery camera support via neolink
- (oelison) Adapter requires node.js >= 20 now.
1.3.0 (2025-12-20)
- (agross) AiCfg config
- (oelison) bump some libs #202
- (bluefox) migration to ts
- (bot) revoking classic token #204
- (oelison) state changes from info log to debug #206
License
MIT License
Copyright (c) 2026 Andy Grundt andygrundt@gmail.com
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.