Forked from Dmitri Farkov's original project. Modifications made to support ONVIF AI events for TAPO cameras, but can be easily extended for other devices.
This package aims to implement a transformation layer between the ONVIF event stream (sourced from IP cameras / camera doorbells) and MQTT (a messaging protocol largely used in home automation).
Any number of ONVIF devices is supported.
After acquiring an EzViz DB1 camera doorbell, I was happy to find a PIR sensor on it. I was then dismayed to find out that there is no open API to consume the triggered status of it. This project was written to scratch that itch, but it should work for any other ONVIF compliant devices with built-in sensors.
- Docker (unless running Baremetal)
- MQTT Broker
- At least one ONVIF compatible device implementing events.
- EZViz DB-1 Doorbell (flashed with LaView firmware) - TESTED
- EZViz DB-1 Doorbell (flashed with HikVision 200321 firmware) - TESTED
- Nelly's Security Doorbell (NSC-DB2) (flashed with Nelly's v5.2.4 191216 firmware) - TESTED
- Laview Halo One Doorbell - TESTED
- SV3C SV-B01POE-5MPL-A - TESTED
- IMOU cue 2 - TESTED
- Provision ISR I3-340IP536+ - TESTED
- Provision ISR I4-340IP5MVF - TESTED
- RCA HSDB2A Doorbell (flashed with LaView firmware)
- Reolink E1 Pro - TESTED
- Hikvision DB2 - Does not work, TODO: implement push point subscriptions.
- Annke C800 (1. generation - turret with separate lens and IR LED) - TESTED (all motion areas are combined)
- Wansview W4 (firmware 07.26100.07.12) - TESTED
- Besder 50H20L - TESTED
- Besder XM530 - TESTED
- Besder HI3516EV100 - TESTED
- TAPO C120 - TESTED
- Any other ONVIF compliant IP Camera - if it works for you please let me know so that this list can be updated.
- Motion Sensor
- Person Detection
- Line Cross
- Vehicle Detection
- Pet Detection
Anything other than Motion Sensor has only been tested with a TAPO C120 on the latest firmware.
Your ONVIF compatible camera may support similar events but may not be supported out of the box.
You can enable debug logging in the config file log: debug and then check the log output for the ONVIF event and then add the event into SubscriberGroup.js:EVENTS section.
name=ONVIF msg=ONVIF received {"subscriberName":"backyard","eventType":"RuleEngine/LineCrossDetector/LineCross","eventValue":{"IsLineCross":true}} v=1
The recommended method.
Pull the image from docker registry.
docker pull kosdk/onvif2mqtt:latestRun the image, mounting a config volume containing your configuration (config.yml)
docker run -v PATH_TO_CONFIGURATION_FOLDER:/config dfarkov/onvif2mqttThis method requires an installation of NodeJS / NPM. This is the recommended installation method for development purposes.
Clone this repo
git clone https://github.com/dmitrif/onvif2mqttNavigate to the repo folder.
cd ./onvif2mqttInstall dependencies
npm installCreate and fill out a configuration file:
touch config.dev.ymlRun the app:
# For development
npm run dev
# For production build
npm run build
CONFIG_FILE=./config.dev.yml npm run startConfiguration can be placed into a config.yml file, containing valid YAML.
This file should be placed into the host-mounted config volume; if another location is preferred then the file path can be provided as an environment variable CONFIG_PATH.
By default this package publishes events to an topic onvif2mqtt/$ONVIF_DEVICE/$EVENT_TYPE/ with a value of on | off for each captured event type.
However, by using the api.templates option in configuration, one can define a custom subtopic and specify a custom template.
The following tokens will be interpolated in both the subtopic and the template values:
${onvifDeviceId}- name of the ONVIF device (e.g.doorbell)${eventType}- type of event captured (e.g.motion)${eventState}- boolean state of the event (if applicable)
The messages will be sent to a topic of the following format: onvif2mqtt/$ONVIF_DEVICE/$SUBTOPIC.
api:
templates:
#Subtopics can be nested with `/` and are interpolated
- subtopic: ${eventType}/json
# Should this message be retained by MQTT
# Defaults to true
retain: false
# Template that should be published to the topic,
# values are interpolated
template: >-
{
"device": "${onvifDeviceId}",
"eventType": "${eventType}",
"state": "${eventState}"
}
# You can specify any number of custom subtopics.
- subtopic: hello_world
template: hello from ${onvifDeviceId}
# MQTT Broker configuration,
# required due to nature of project.
mqtt:
host: 192.168.0.57
port: 1883
username: user
password: password
clientId: clientId
# All of your ONVIF devices
onvif:
# Name for the device (used in MQTT topic)
- name: doorbell
hostname: localhost
port: 80
username: admin
password: admin- Configure Shinobi.video to use
mqtt - Configure a shinobi monitor to trigger motion detector on API events.
- Add custom subtopic for shinobi:
...
api:
templates:
- subtopic: shinobi
retain: false
template: >-
{
"plug": "${onvifDeviceId}",
"reason": "${eventType}",
"name": "${onvifDeviceId}"
}
...- Install the MQTT HomeAssistant integration.
- Define custom
binary_sensorin HomeAssistant'sconfiguration.yaml:
binary_sensor doorbell_motion:
- platform: mqtt
name: doorbell_motion
state_topic: "onvif2mqtt/doorbell/motion"Simplest way forward is to base your configuration off config.sample.yml.
Thanks goes to these wonderful people (emoji key):
Michael Bogatyrev 💻 |
Dmitri Farkov 💻 📖 🚧 |
Domenico Casillo 💻 |
brilthor 💻 |
Brad Gilmer 📖 |
DJTim 📖 |
Roman 💻 |
This project follows the all-contributors specification. Contributions of any kind welcome!