Comments (18)
Hi,
when looking at logs, do you see zmeventserver being triggered for each alarm ?
There are two areas of investigation:
- Check if zmeventserver is being triggered - if not, your client won't receive messages. This may be a zmeventserver issue
- If zmeventserver is being triggered and the client is not receiving messages, then its a socket issue
from zmeventnotification.
Not sure what you mean by zmeventserver, is this your code? if so then No I dont see it being trigger, or some other server?
Addtional info, im running ZM 1.30.0
from zmeventnotification.
I mean zmeventnotification
I see
Oct 4 16:50:11 virgo zmeventnotification[7857]: INF [Total event client connections: 1]
Oct 4 16:50:11 virgo zmeventnotification[7857]: INF [Reloading Monitors...]
Oct 4 16:50:11 virgo zmeventnotification[7857]: INF [Loading monitors]
But I don't see any logs of zmeventnotification being invoked when the alarm happens in what you posted
from zmeventnotification.
thats right, I see the zmeventnotification load the montors, and detect my client, but never see any events being sent..
Do I need to set a filter so that messages are immediately sent?
e.g. {"event":"control","data":{"type":"filter","monlist":"1,2", "intlist":"0,0"}}
Im sure I tried this and your docs indicate this is optional
from zmeventnotification.
bit more info, I tried setting the filter, I only have two cameras 1 & 6 but I set everything from 1-8 to zero (immediate). Well when I did this I got ONE response to an alert and then its all quiet again
Oct 4 22:31:00 virgo zmeventnotification[9860]: INF [Contrl: Storing token ...,monlist:1,2,3,4,5,6,7,8,intlist:0,0,0,0,0,0,0,0,pushstate:]
Oct 4 22:31:27 virgo zma_m6[1894]: INF [CarCam: 907581 - Gone into alarm state]
Oct 4 22:31:27 virgo zmeventnotification[9860]: INF [New event 31724 reported for CarCam]
Oct 4 22:31:27 virgo zmeventnotification[9860]: INF [Broadcasting new events to all 1 websocket clients]
Oct 4 22:31:27 virgo zmeventnotification[9860]: INF [Checking alarm rules for 192.168.0.18:39044]
Oct 4 22:31:27 virgo zmeventnotification[9860]: INF [Monitor 6 event: last time not found, so sending]
Oct 4 22:31:27 virgo zmeventnotification[9860]: INF [192.168.0.18-sending over websockets]
Oct 4 22:31:39 virgo zma_m6[1894]: INF [CarCam: 907672 - Gone into alert state]
Oct 4 22:31:42 virgo zma_m6[1894]: INF [CarCam: 907697 - Left alarm state (31724) - 788(91) images]
Oct 4 22:31:45 virgo zma_m6[1894]: INF [CarCam: 907725 - Gone into alarm state]
Oct 4 22:31:54 virgo zma_m6[1894]: INF [CarCam: 907790 - Gone into alert state]
Oct 4 22:31:57 virgo zma_m6[1894]: INF [CarCam: 907815 - Left alarm state (31724) - 906(156) images]
Oct 4 22:32:02 virgo zmeventnotification[9860]: INF [Total event client connections: 1]
Oct 4 22:32:02 virgo zmeventnotification[9860]: INF [Reloading Monitors...]
Oct 4 22:32:02 virgo zmeventnotification[9860]: INF [Loading monitors]
Oct 4 22:32:21 virgo zma_m6[1894]: INF [CarCam: 908000 - Analysing at 7.69 fps]
Oct 4 22:32:55 virgo zma_m6[1894]: INF [CarCam: 908262 - Gone into alarm state]
Oct 4 22:33:04 virgo zmc_dvideo0[1891]: INF [CarCam: 922000 - Capturing at 7.75 fps]
Oct 4 22:33:06 virgo zma_m6[1894]: INF [CarCam: 908347 - Gone into alert state]
Oct 4 22:33:09 virgo zma_m6[1894]: INF [CarCam: 908372 - Left alarm state (31724) - 1463(241) images]
Oct 4 22:33:54 virgo zma_m6[1894]: INF [CarCam: 908717 - Gone into alarm state]
Oct 4 22:34:12 virgo zma_m6[1894]: INF [CarCam: 908853 - Gone into alert state]
Oct 4 22:34:15 virgo zma_m6[1894]: INF [CarCam: 908878 - Left alarm state (31724) - 1969(377) images]
Oct 4 22:34:31 virgo zma_m6[1894]: INF [CarCam: 909000 - Analysing at 7.69 fps]
Oct 4 22:35:04 virgo zmc_m1[1893]: INF [Kitchencam: 146000 - Capturing at 3.62 fps]
Oct 4 22:35:06 virgo zma_m1[1941]: INF [Kitchencam: 146000 - Analysing at 3.61 fps]
Oct 4 22:35:14 virgo zmc_dvideo0[1891]: INF [CarCam: 923000 - Capturing at 7.69 fps]
Can we add debug code to the zmeventnotification.pl?
from zmeventnotification.
Right so the core issue seems to be that zmeventnotification is not getting event updates from shared memory. I'll add some debug logs.
from zmeventnotification.
thank you, appreciate it.
I think I mentioned Im running with SSL off
from zmeventnotification.
I left my PC websocket client running lastnight and then today compared the websocket responses with a filter.. and it "appears" to be working 90% of the time..
Strange that forcing an alarm doesnt work, but its gotten almost all of the events
Some data.
Filter (alarmFrames>0)
Event data from the websocket
{"event":"alarm","events":[{"Name":"CarCam","EventId":"31740","MonitorId":"6"}],"type":"","status":"Success"}
{"event":"alarm","events":[{"EventId":"31750","MonitorId":"6","Name":"CarCam"}],"type":"","status":"Success"}
{"status":"Success","type":"","events":[{"EventId":"31802","MonitorId":"6","Name":"CarCam"}],"event":"alarm"}
{"event":"alarm","events":[{"MonitorId":"6","EventId":"31832","Name":"CarCam"}],"type":"","status":"Success"}
{"event":"alarm","events":[{"Name":"CarCam","EventId":"31834","MonitorId":"6"}],"type":"","status":"Success"}
{"event":"alarm","events":[{"EventId":"31840","MonitorId":"6","Name":"CarCam"}],"type":"","status":"Success"}
{"event":"alarm","events":[{"Name":"CarCam","MonitorId":"6","EventId":"31844"}],"type":"","status":"Success"}
{"event":"alarm","events":[{"Name":"CarCam","EventId":"31866","MonitorId":"6"}],"type":"","status":"Success"}
So I note that most/all the events are there except events 31864 & 31770
Also uploaded my syslog..
syslog.txt
One thing I need to sort out is why my emailer has stopped working.. could that be the cause of it???
from zmeventnotification.
Filters are separate from the event notification server.
Its good that most events are being caught. I think I should anyway add code for Debug and see why 2 events were missed.
from zmeventnotification.
thanks just saw this, will upgrade and see if I can work out which filters are being missed out
from zmeventnotification.
been running this for a while and it appears to work 80% of the time..
It does miss out events which ZM displays on the main pages...Im wondering is this because Im running in MOCORD mode? I also cant appear to figure out which events are being missed..
I'll post some data later today/tomorrow
from zmeventnotification.
do those events in mocord have alarm frames? zmeventserver will only show events with at least one alarm frame (otherwise they are not really alarmed events, just the "record" part of "mocord")
from zmeventnotification.
Yes they do have alarm frames, I was wondering if it was a "minimum" number of frames required but ive noticed events missed which have 10 alarm frames and some with 200 alarm frames.. I'll have some data for us to look at tomorrow..
from zmeventnotification.
ok got some data
zonemnder alerts
ID NAME MONITOR CAUSE TIME(^) DURATION FRAMES ALARM
FRAMES TOTAL
SCORE AVG.
SCORE MAX.
SCORE
37035 Event-37035 CarCam Continuous 10/23 10:20:00 00:10:00 14903 17 335 19 26
37037 Event-37037 CarCam Continuous 10/23 10:30:00 00:10:00 14563 110 2002 18 44
37045 Event-37045 CarCam Continuous 10/23 11:10:00 00:10:00 13985 376 7336 19 67
37053 Event-37053 CarCam Continuous 10/23 11:50:00 00:10:00 14921 4 41 10 11
37057 Event-37057 CarCam Continuous 10/23 12:10:00 00:10:00 14917 4 43 10 11
37063 Event-37063 CarCam Continuous 10/23 12:40:00 00:10:00 14898 18 338 18 26
37079 Event-37079 CarCam Continuous 10/23 14:00:00 00:10:00 14910 3 40 13 14
37089 Event-37089 CarCam Continuous 10/23 14:50:00 00:10:00 14906 7 86 12 16
37092 Event-37092 CarCam Continuous 10/23 15:00:00 00:10:00 14923 5 55 11 13
37099 Event-37099 CarCam Continuous 10/23 15:40:00 00:10:00 14918 4 51 12 15
37104 Event-37104 CarCam Continuous 10/23 16:00:00 00:10:00 14804 2 24 12 13
37105 Event-37105 CarCam Continuous 10/23 16:10:00 00:10:00 14915 4 43 10 11
37117 Event-37117 CarCam Continuous 10/23 17:10:00 00:10:00 14905 8 87 10 12
37119 Event-37119 CarCam Continuous 10/23 17:20:00 00:10:00 14905 8 118 14 17
37129 Event-37129 CarCam Continuous 10/23 18:10:00 00:10:00 4628 2 34 17 17
and the websocket output is
Msg Received: '{"type":"","version":"0.91","status":"Success","event":"auth","reason":""}'^M
Msg Received: '{"events":[{"MonitorId":"6","EventId":"37035","Name":"CarCam"}],"type":"","status":"Success","event":"alarm"}'^M
Msg Received: '{"status":"Success","event":"alarm","events":[{"Name":"CarCam","EventId":"37037","MonitorId":"6"}],"type":""}'^M
Msg Received: '{"status":"Success","event":"alarm","events":[{"MonitorId":"6","EventId":"37045","Name":"CarCam"}],"type":""}'^M
Msg Received: '{"events":[{"EventId":"37063","Name":"CarCam","MonitorId":"6"}],"type":"","status":"Success","event":"alarm"}'^M
Msg Received: '{"type":"","events":[{"EventId":"37079","Name":"CarCam","MonitorId":"6"}],"event":"alarm","status":"Success"}'^M
Msg Received: '{"type":"","events":[{"MonitorId":"6","Name":"CarCam","EventId":"37089"}],"event":"alarm","status":"Success"}'^M
Msg Received: '{"event":"alarm","status":"Success","type":"","events":[{"Name":"CarCam","EventId":"37099","MonitorId":"6"}]}'^M
Msg Received: '{"events":[{"MonitorId":"6","EventId":"37105","Name":"CarCam"}],"type":"","status":"Success","event":"alarm"}'^M
Msg Received: '{"event":"alarm","status":"Success","events":[{"MonitorId":"6","Name":"CarCam","EventId":"37117"}],"type":""}'^M
Msg Received: '{"type":"","events":[{"EventId":"37129","Name":"CarCam","MonitorId":"6"}],"event":"alarm","status":"Success"}'^M
and comparing the two I see the following events missing 37053, 37057,37081, 37092, 37104, 37119,37125,
Ive attached a copy of the syslog during this time, I did notice a few colord failed to get sessionIDs but I dont think they're related..
Any ideas?
from zmeventnotification.
Please upgrade to the latest version of the event server (0.93) - there were problems in the old version that resulted in notifications getting lost.
from zmeventnotification.
closing as no response. Please re-open if the issue persists
from zmeventnotification.
Version : 2.5
Hi there, been a while. I kinda abandoned this for a while as other things kept me busy but Im back on the case..
Pretty much the same behaviour. ZmeventServer is installed and I can connect to it but I dont reliably see events being sent out.....
So R&D So far
- connecting WS to 9002 (my address) works fine, I can check status version etc.
- Within the ZM Log file I do not see any zmeventnotification messages, but using zmdc.pl I can confirm it is running
``
root@36e98e013b2b:/var/log# zmdc.pl status zmeventnotification.pl
'zmeventnotification.pl' running since 19/01/04 00:09:45, pid = 323
Im baffled...
from zmeventnotification.
Did someone find solution for this problem? I got all the events in ZMNinja but any notification. Even for forced events with many alarm frames I got only this. Below you can find my config files.
Regardless if I use hooks or not, zmeventserver never catched any events from zoneminder. I have only one Monitor in Mocord mode.
zoneadmin@nkzoneminder:/etc/zm$ sudo tail -f /var/log/syslog | grep zmeventnotification
Feb 11 19:51:11 nkzoneminder zmeventnotification[1444]: DBG [PARENT: ---------->Tick START (active forks:0, total forks:0)<--------------]
Feb 11 19:51:11 nkzoneminder zmeventnotification[1444]: DBG [PARENT: After tick: TOTAL: 1, ES_CONTROL: 0, FCM+WEB: 0, FCM: 1, WEB: 0, MQTT:0, invalid WEB: 0, PENDING: 0]
Feb 11 19:51:11 nkzoneminder zmeventnotification[1444]: DBG [PARENT: There are 0 active child forks...]
Feb 11 19:51:11 nkzoneminder zmeventnotification[1444]: DBG [zmMemAttach already attached at 139890479206400 for 1]
Feb 11 19:51:11 nkzoneminder zmeventnotification[1444]: DBG [Shared data appears valid for monitor 1: 1]
Feb 11 19:51:11 nkzoneminder zmeventnotification[1444]: DBG [PARENT: checkEvents() new events found=0]
Feb 11 19:51:11 nkzoneminder zmeventnotification[1444]: DBG [PARENT: There are 0 new Events to process]
Feb 11 19:51:11 nkzoneminder zmeventnotification[1444]: DBG [PARENT: ---------->Tick END (active forks:0, total forks:0)<--------------]
Feb 11 19:51:16 nkzoneminder zmeventnotification[1444]: DBG [PARENT: ---------->Tick START (active forks:0, total forks:0)<--------------]
Feb 11 19:51:16 nkzoneminder zmeventnotification[1444]: DBG [PARENT: After tick: TOTAL: 1, ES_CONTROL: 0, FCM+WEB: 0, FCM: 1, WEB: 0, MQTT:0, invalid WEB: 0, PENDING: 0]
Feb 11 19:51:16 nkzoneminder zmeventnotification[1444]: DBG [PARENT: There are 0 active child forks...]
Feb 11 19:51:16 nkzoneminder zmeventnotification[1444]: DBG [zmMemAttach already attached at 139890479206400 for 1]
Feb 11 19:51:16 nkzoneminder zmeventnotification[1444]: DBG [Shared data appears valid for monitor 1: 1]
Feb 11 19:51:16 nkzoneminder zmeventnotification[1444]: DBG [PARENT: checkEvents() new events found=0]
Feb 11 19:51:16 nkzoneminder zmeventnotification[1444]: DBG [PARENT: There are 0 new Events to process]
Feb 11 19:51:16 nkzoneminder zmeventnotification[1444]: DBG [PARENT: ---------->Tick END (active forks:0, total forks:0)<--------------]
^C
zoneadmin@nkzoneminder:/etc/zm$ more zmeventnotification.ini
Configuration file for zmeventnotification.pl
[general]
secrets = /etc/zm/secrets.ini
base_data_path=/var/lib/zmeventnotification
The ES now supports a means for a special kind of
websocket connection which can dynamically control ES
behaviour
Default is no
use_escontrol_interface=no
this is where all escontrol admin overrides
will be stored.
escontrol_interface_file=/var/lib/zmeventnotification/misc/escontrol_interface.dat
the password for accepting control interfaces
escontrol_interface_password=!ESCONTROL_INTERFACE_PASSWORD
If you see the ES getting 'stuck' after several hours
see https://rt.cpan.org/Public/Bug/Display.html?id=131058
You can use restart_interval to have it automatically restart
every X seconds. (Default is 7200 = 2 hours) Set to 0 to disable this.
restart_interval = 432000
restart_interval = 0
list of monitors which ES will ignore
Note that there is an attribute later that does
not process hooks for specific monitors. This one is different
It can be used to completely skip ES processing for the
monitors defined
skip_monitors = 2,3,4
[network]
Port for Websockets connection (default: 9000).
port = 9000
Address for Websockets server (default: [::]).
If you are facing connection issues or SSL issues, put in your IP here
If you want to listen to multiple interfaces try 0.0.0.0
#address = 1.2.3.4
[auth]
Check username/password against ZoneMinder database (default: yes).
enable = yes
Authentication timeout, in seconds (default: 20).
timeout = 20
[push]
This is to enable sending push notifications via any 3rd party service.
Typically, if you enable this, you might want to turn off fcm
Note that zmNinja will only receive notifications via FCM, but other 3rd
party services have their own apps to get notifications
use_api_push = no
This is the script that will send the notification
Some sample scripts are provided, write your own
Each script gets:
arg1 - event ID
arg2 - Monitor ID
arg3 - Monitor Name
arg4 - alarm cause
arg5 - Type of event (event_start or event_end)
arg6 (optional) - image path
api_push_script=/var/lib/zmeventnotification/bin/pushapi_pushover.py
[fcm]
Use FCM for messaging (default: yes).
enable = yes
Use the new FCM V1 protocol (recommended)
use_fcmv1 = yes
if yes, will replace notifications with the latest one
default: no
replace_push_messages = no
Custom FCM API key. Uncomment if you are using
your own API key (most people will not need to uncomment)
api_key =
Auth token store location (default: /var/lib/zmeventnotification/push/tokens.txt).
token_file = {{base_data_path}}/push/tokens.txt
Date format to use when sending notification
over push (FCM)
See https://metacpan.org/pod/POSIX::strftime::GNU
For example, a 24 hr format would be
#date_format = %H:%M, %d-%b
date_format = %I:%M %p, %d-%b
Set priority for android push. Default is default.
You can set it to default, min, low, high or max
There is weird foo going on here. If you set it to high,
and don't interact with push, users report after a while they
get delayed by Google. I haven't quite figured out what is the precise
value to put here to make sure it always reaches you. Also make sure
you read the zmES faq on delayed push
fcm_android_priority = default
Use MQTT for messaging (default: no)
[mqtt]
enable = no
Allow you to set a custom MQTT topic name
default: zoneminder
#topic = my topic name
MQTT server (default: 127.0.0.1)
server = 127.0.0.1
Authenticate to MQTT server as user
username = !MQTT_USERNAME
Password
password = !MQTT_PASSWORD
Set retain flag on MQTT messages (default: no)
retain = no
MQTT over TLS
Location to MQTT broker CA certificate. Uncomment this line will enable MQTT over TLS.
tls_ca = /config/certs/ca.pem
To enable 2-ways TLS, add client certificate and private key
Location to client certificate and private key
tls_cert = /config/es-pub.pem
tls_key = /config/es-key.pem
To allow insecure TLS (disable peer verifier), (default: no)
tls_insecure = yes
[ssl]
Enable SSL (default: yes)
enable = yes
cert = !ES_CERT_FILE
key = !ES_KEY_FILE
#cert = /etc/apache2/ssl/zoneminder.crt
#key = /etc/apache2/ssl/zoneminder.key
Location to SSL cert (no default).
cert = /etc/apache2/ssl/yourportal/zoneminder.crt
Location to SSL key (no default).
key = /etc/apache2/ssl/yourportal/zoneminder.key
[customize]
Link to json file that has rules which can be customized
es_rules=/etc/zm/es_rules.json
Display messages to console (default: no).
Note that you can keep this to no and just
use --debug when running from CLI too
console_logs = no
debug level for ES messages. Default 4. Note that this is
not controllable by ZM LOG_DEBUG_LEVEL as in Perl, ZM doesn't
support debug levels
es_debug_level = 4
Interval, in seconds, after which we will check for new events (default: 5).
event_check_interval = 5
Interval, in seconds, to reload known monitors (default: 300).
monitor_reload_interval = 300
Read monitor alarm cause (Requires ZoneMinder >= 1.31.2, default: no)
Enabling this to 1 for lower versions of ZM will result in a crash
read_alarm_cause = yes
Tag event IDs with the alarm (default: no).
tag_alarm_event_id = yes
Use custom notification sound (default: no).
use_custom_notification_sound = no
include picture in alarm (default: no).
include_picture = yes
send event start notifications (default: yes)
If no, starting notifications will not be sent out
send_event_start_notification = yes
send event end notifications (default: no)
Note that if you are using hooks for end notifications, they may change
the final decision. This needs to be yes if you want end notifications with
or without hooks
send_event_end_notification = yes
URL to access the event image
This URL can be anything you want
What I've put here is a way to extract an image with the highest score given an eventID (even one that is recording)
This requires the latest version of index.php which was merged on Oct 9, 2018 and may only work in ZM 1.32+
https://github.com/ZoneMinder/zoneminder/blob/master/web/index.php
If you use this URL as I've specified below, keep the EVENTID phrase intact.
The notification server will replace it with the correct eid of the alarm
BESTMATCH should be used only if you are using bestmatch for FID in detect_wrapper.sh
objdetect is ONLY available in ZM 1.33+
objdetect_mp4 and objdetect_gif is ONLY available
in ZM 1.35+
picture_url = !ZMES_PICTURE_URL
picture_portal_username=!ZM_USER
picture_portal_password=!ZM_PASSWORD
This is a master on/off setting for hooks. If it is set to no
hooks will not be used no matter what is set in the [hook] section
This makes it easy for folks not using hooks to just turn this off
default:no
use_hooks = no
[hook]
NOTE: This entire section is only valid if use_hooks is yes above
Shell script name here to be called every time an alarm is detected
the script will get passed $1=alarmEventID, $2=alarmMonitorId
$3 monitor Name, $4 alarm cause
script needs to return 0 to send alarm (default: none)
This script is called when an event first starts. If the script returns "0"
(success), then a notification is sent to channels specified in
event_start_notify_on_hook_success. If the script returns "1" (fail)
then a notification is sent to channels specified in
event_start_notify_on_hook_fail
event_start_hook = '{{base_data_path}}/bin/zm_event_start.sh'
#This script is called after event_start_hook completes. You can do
your housekeeping work here
#event_start_hook_notify_userscript = '{{base_data_path}}/contrib/example.py'
This script is called when an event ends. If the script returns "0"
(success), then a notification is sent to channels specified in
event_end_notify_on_hook_success. If the script returns "1" (fail)
then a notification is sent to channels specified in
event_end_notify_on_hook_fail
event_end_hook = '{{base_data_path}}/bin/zm_event_end.sh'
#This script is called after event_end_hook completes. You can do
your housekeeping work here
#event_end_hook_notify_userscript = '{{base_data_path}}/contrib/example.py'
Possible channels = web,fcm,mqtt,api
all is short for web,fcm,mqtt,api
use none for no notifications, or comment out the attribute
When an event starts and hook returns 0, send notification to all. Default: none
event_start_notify_on_hook_success = all
When an event starts and hook returns 1, send notification only to desktop. Default: none
event_start_notify_on_hook_fail = none
When an event ends and hook returns 0, send notification to fcm,web,api. Default: none
event_end_notify_on_hook_success = fcm,web,api
When an event ends and hook returns 1, don't send notifications. Default: none
event_end_notify_on_hook_fail = fcm,web,api
#event_end_notify_on_hook_fail = web
Since event_end and event_start are two different hooks, it is entirely possible
that you can get an end notification but not a start notification. This can happen
if your start script returns 1 but the end script returns 0, for example. To avoid
this, set this to yes (default:yes)
event_end_notify_if_start_success = yes
If yes, the text returned by the script
overwrites the alarm header
useful if your script is detecting people, for example
and you want that to be shown in your notification (default:yes)
use_hook_description = yes
If yes will will append an [a] for alarmed frame match
[s] for snapshot match or [x] if not using bestmatch
really only a debugging feature but useful to know
where object detection is working or failing
keep_frame_match_type = yes
list of monitors for which hooks will not run
hook_skip_monitors = 2
if enabled, will pass the right folder for the hook script
to store the detected image, so it shows up in ZM console view too
Requires ZM >=1.33. Don't enable this if you are running an older version
Note: you also need to set write_image_to_zm=yes in objectconfig.ini
default: no
hook_pass_image_path = yes
zoneadmin@nkzoneminder:/etc/zm$ more objectconfig.ini
Configuration file for object detection
NOTE: ALL parameters here can be overriden
on a per monitor basis if you want. Just
duplicate it inside the correct [monitor-] section
You can create your own custom attributes in the [custom] section
[general]
Please don't change this. It is used by the config upgrade script
version=1.2
You can now limit the # of detection process
per target processor. If not specified, default is 1
Other detection processes will wait to acquire lock
cpu_max_processes=3
tpu_max_processes=1
gpu_max_processes=1
Time to wait in seconds per processor to be free, before
erroring out. Default is 120 (2 mins)
cpu_max_lock_wait=100
tpu_max_lock_wait=100
gpu_max_lock_wait=100
#pyzm_overrides={'conf_path':'/etc/zm','log_level_debug':0}
pyzm_overrides={'log_level_debug':5}
This is an optional file
If specified, you can specify tokens with secret values in that file
and onlt refer to the tokens in your main config file
secrets = /etc/zm/secrets.ini
portal/user/password are needed if you plan on using ZM's legacy
auth mechanism to get images
portal=!ZM_PORTAL
user=!ZM_USER
password=!ZM_PASSWORD
api portal is needed if you plan to use tokens to get images
requires ZM 1.33 or above
api_portal=!ZM_API_PORTAL
allow_self_signed=yes
if yes, last detection will be stored for monitors
and bounding boxes that match, along with labels
will be discarded for new detections. This may be helpful
in getting rid of static objects that get detected
due to some motion.
match_past_detections=no
The max difference in area between the objects if match_past_detection is on
can also be specified in px like 300px. Default is 5%. Basically, bounding boxes of the same
object can slightly differ ever so slightly between detection. Contributor @neillbell put in this PR
to calculate the difference in areas and based on his tests, 5% worked well. YMMV. Change it if needed.
past_det_max_diff_area=5%
max_detection_size=90%
sequence of models to run for detection
detection_sequence=object,face,alpr
if all, then we will loop through all models
if first then the first success will break out
detection_mode=all
If you need basic auth to access ZM
#basic_user=user
#basic_password=password
base data path for various files the ES+OD needs
we support in config variable substitution as well
base_data_path=/var/lib/zmeventnotification
global settings for
bestmatch, alarm, snapshot OR a specific frame ID
frame_id=bestmatch
this is the to resize the image before analysis is done
resize=800
set to yes, if you want to remove images after analysis
setting to yes is recommended to avoid filling up space
keep to no while debugging/inspecting masks
Note this does NOT delete debug images later
delete_after_analyze=yes
If yes, will write an image called -bbox.jpg as well
which contains the bounding boxes. This has NO relation to
write_image_to_zm
Typically, if you enable delete_after_analyze you may
also want to set write_debug_image to no.
write_debug_image=no
if yes, will write an image with bounding boxes
this needs to be yes to be able to write a bounding box
image to ZoneMinder that is visible from its console
write_image_to_zm=yes
Adds percentage to detections
hog/face shows 100% always
show_percent=yes
color to be used to draw the polygons you specified
poly_color=(255,255,255)
poly_thickness=2
#import_zm_zones=yes
only_triggered_zm_zones=no
This section gives you an option to get brief animations
of the event, delivered as part of the push notification to mobile devices
Animations are created only if an object is detected
NOTE: This will DELAY the time taken to send you push notifications
It will try to first creat the animation, which may take upto a minute
depending on how soon it gets access to frames. See notes below
[animation]
If yes, object detection will attempt to create
a short GIF file around the object detection frame
that can be sent via push notifications for instant playback
Note this required additional software support. Default:no
create_animation=no
Format of animation burst
valid options are "mp4", "gif", "mp4,gif"
Note that gifs will be of a shorter duration
as they take up much more disk space than mp4
animation_types='mp4,gif'
default width of animation image. Be cautious when you increase this
most mobile platforms give a very brief amount of time (in seconds)
to download the image.
Given your ZM instance will be serving the image, it will anyway be slow
Making the total animation size bigger resulted in the notification not
getting an image at all (timed out)
animation_width=640
When an event is detected, ZM it writes frames a little late
On top of that, it looks like with caching enabled, the API layer doesn't
get access to DB records for much longer (around 30 seconds), at least on my
system. animation_retry_sleep refers to how long to wait before trying to grab
frame information if it failed. animation_max_tries defines how many times it
will try and retrieve frames before it gives up
animation_retry_sleep=15
animation_max_tries=4
if animation_types is gif then when can generate a fast preview gif
every second frame is skipped and the frame rate doubled
to give quick preview, Default (no)
fast_gif=no
[remote]
You can now run the machine learning code on a different server
This frees up your ZM server for other things
To do this, you need to setup https://github.com/pliablepixels/mlapi
on your desired server and confiure it with a user. See its instructions
once set up, you can choose to do object/face recognition via that
external serer
URL that will be used
#ml_gateway=http://192.168.1.183:5000/api/v1
#ml_gateway=http://10.6.1.13:5000/api/v1
#ml_gateway=http://192.168.1.21:5000/api/v1
#ml_gateway=http://10.9.0.2:5000/api/v1
#ml_fallback_local=yes
API/password for remote gateway
ml_user=!ML_USER
ml_password=!ML_PASSWORD
config for object
[object]
If you are using legacy format (use_sequence=no) then these parameters will
be used during ML inferencing
object_detection_pattern=(person|car|motorbike|bus|truck|boat)
object_min_confidence=0.3
object_framework=opencv
object_processor=cpu
object_weights={{base_data_path}}/models/yolov3/yolov3.weights
object_labels={{base_data_path}}/models/yolov3/coco.names
#object_weights={{base_data_path}}/models/coral_edgetpu/ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite
#object_labels={{base_data_path}}/models/coral_edgetpu/coco_indexed.names
If you are using the new ml_sequence format (use_sequence=yes) then
you can fiddle with these parameters and look at ml_sequence later
Note that these can be named anything. You can add custom variables, ad-infinitum
Google Coral
The mobiledet model came out in Nov 2020 and is supposed to be faster and more accurate but YMMV
tpu_object_weights_mobiledet={{base_data_path}}/models/coral_edgetpu/ssdlite_mobiledet_coco_qat_postprocess_edgetpu.tflite
tpu_object_weights_mobilenet={{base_data_path}}/models/coral_edgetpu/ssd_mobilenet_v2_coco_quant_postprocess_edgetpu.tflite
tpu_object_labels={{base_data_path}}/models/coral_edgetpu/coco_indexed.names
tpu_object_framework=coral_edgetpu
tpu_object_processor=tpu
tpu_min_confidence=0.6
Yolo v4 on GPU (falls back to CPU if no GPU)
yolo4_object_weights={{base_data_path}}/models/yolov4/yolov4.weights
yolo4_object_labels={{base_data_path}}/models/yolov4/coco.names
yolo4_object_config={{base_data_path}}/models/yolov4/yolov4.cfg
yolo4_object_framework=opencv
yolo4_object_processor=gpu
Yolo v3 on GPU (falls back to CPU if no GPU)
yolo3_object_weights={{base_data_path}}/models/yolov3/yolov3.weights
yolo3_object_labels={{base_data_path}}/models/yolov3/coco.names
yolo3_object_config={{base_data_path}}/models/yolov3/yolov3.cfg
yolo3_object_framework=opencv
yolo3_object_processor=gpu
Tiny Yolo V4 on GPU (falls back to CPU if no GPU)
tinyyolo_object_config={{base_data_path}}/models/tinyyolov4/yolov4-tiny.cfg
tinyyolo_object_weights={{base_data_path}}/models/tinyyolov4/yolov4-tiny.weights
tinyyolo_object_labels={{base_data_path}}/models/tinyyolov4/coco.names
tinyyolo_object_framework=opencv
tinyyolo_object_processor=gpu
[face]
face_detection_pattern=.*
known_images_path={{base_data_path}}/known_faces
unknown_images_path={{base_data_path}}/unknown_faces
save_unknown_faces=yes
save_unknown_faces_leeway_pixels=100
face_detection_framework=dlib
read https://github.com/ageitgey/face_recognition/wiki/Face-Recognition-Accuracy-Problems
read https://github.com/ageitgey/face_recognition#automatically-find-all-the-faces-in-an-image
and play around
quick overview:
num_jitters is how many times to distort images
upsample_times is how many times to upsample input images (for small faces, for example)
model can be hog or cnn. cnn may be more accurate, but I haven't found it to be
face_num_jitters=1
face_model=cnn
face_upsample_times=1
This is maximum distance of the face under test to the closest matched
face cluster. The larger this distance, larger the chances of misclassification.
face_recog_dist_threshold=0.6
When we are first training the face recognition model with known faces,
by default we use hog because we assume you will supply well lit, front facing faces
However, if you are planning to train with profile photos or hard to see faces, you
may want to change this to cnn. Note that this increases training time, but training only
happens once, unless you retrain again by removing the training model
face_train_model=cnn
#if a face doesn't match known names, we will detect it as 'unknown face'
you can change that to something that suits your personality better ;-)
#unknown_face_name=invader
[alpr]
alpr_detection_pattern=.*
alpr_use_after_detection_only=yes
Many of the ALPR providers offer both a cloud version
and local SDK version. Sometimes local SDK format differs from
the cloud instance. Set this to local or cloud. Default cloud
alpr_api_type=cloud
-----| If you are using plate recognizer | ------
alpr_service=plate_recognizer
#alpr_service=open_alpr_cmdline
If you want to host a local SDK https://app.platerecognizer.com/sdk/
#alpr_url=http://192.168.1.21:8080/alpr
Plate recog replace with your api key
alpr_key=!PLATEREC_ALPR_KEY
if yes, then it will log usage statistics of the ALPR service
platerec_stats=yes
If you want to specify regions. See http://docs.platerecognizer.com/#regions-supported
#platerec_regions=['us','cn','kr']
minimal confidence for actually detecting a plate
platerec_min_dscore=0.1
minimal confidence for the translated text
platerec_min_score=0.2
----| If you are using openALPR |-----
#alpr_service=open_alpr
#alpr_key=!OPENALPR_ALPR_KEY
For an explanation of params, see http://doc.openalpr.com/api/?api=cloudapi
#openalpr_recognize_vehicle=1
#openalpr_country=us
#openalpr_state=ca
openalpr returns percents, but we convert to between 0 and 1
#openalpr_min_confidence=0.3
----| If you are using openALPR command line |-----
openalpr_cmdline_binary=alpr
Do an alpr -help to see options, plug them in here
like say '-j -p ca -c US' etc.
keep the -j because its JSON
Note that alpr_pattern is honored
For the rest, just stuff them in the cmd line options
openalpr_cmdline_params=-j -d
openalpr_cmdline_min_confidence=0.3
Monitor specific settings
Examples:
Let's assume your monitor ID is 999
[monitor-999]
my driveway
match_past_detections=no
wait=5
object_detection_pattern=(person)
Advanced example - here we want anything except potted plant
exclusion in regular expressions is not
as straightforward as you may think, so
follow this pattern
object_detection_pattern = ^(?!object1|object2|objectN)
the characters in front implement what is
called a negative look ahead
object_detection_pattern=^(?!potted plant|pottedplant|bench|broccoli)
#alpr_detection_pattern=^(.x11)
#delete_after_analyze=no
#detection_pattern=.
#import_zm_zones=yes
polygon areas where object detection will be done.
You can name them anything except the keywords defined in the optional
params below. You can put as many polygons as you want per [monitor-]
(see examples).
my_driveway=306,356 1003,341 1074,683 154,715
You are now allowed to specify detection pattern per zone
the format is _zone_detection_pattern=
So if your polygon is called my_driveway, its associated
detection pattern will be my_driveway_zone_detection_pattern
If none is specified, the value in object_detection_pattern
will be used
This also applies to ZM zones. Let's assume you have
import_zm_zones=yes and let's suppose you have a zone in ZM
called Front_Door. In that case, all you need to do is put in a
front_door_zone_detection_pattern=(person|car) here
NOTE: ZM Zones are converted to lowercase, and spaces are replaced
with underscores@3
my_driveway_zone_detection_pattern=(person)
some_other_area=0,0 200,300 700,900
use license plate recognition for my driveway
see alpr section later for more data needed
resize=no
detection_sequence=object,alpr
[monitor-1]
my driveway
match_past_detections=yes
wait=5
detect_pattern=(car|motorbike|bus|truck|boat|person)
#alpr__detection_pattern=^(.x11)
poly_color=(255,0,0)
resize=1200
#delete_after_analyze=no
#detect_pattern=.
#import_zm_zones=yes
[ml]
When enabled, you can specify complex ML inferencing logic in ml_sequence
Anything specified in ml_sequence will override any other ml attributes
Also, when enabled, stream_sequence will override any other frame related
attributes
use_sequence = yes
if enabled, will not grab exclusive locks before running inferencing
locking seems to cause issues on some unique file systems
disable_locks= no
Chain of frames
See https://zmeventnotification.readthedocs.io/en/latest/guides/hooks.html#understanding-detection-configuration
Also see https://pyzm.readthedocs.io/en/latest/source/pyzm.html#pyzm.ml.detect_sequence.DetectSequence.detect_stream
Very important: Make sure final ending brace is indented
stream_sequence = {
'frame_strategy': 'most_models',
'frame_set': 'snapshot,alarm',
'contig_frames_before_error': 5,
'max_attempts': 3,
'sleep_between_attempts': 4,
'resize':800
}
Chain of ML models to use
See https://zmeventnotification.readthedocs.io/en/latest/guides/hooks.html#understanding-detection-configuration
Also see https://pyzm.readthedocs.io/en/latest/source/pyzm.html#pyzm.ml.detect_sequence.DetectSequence
Very important: Make sure final ending brace is indented
ml_sequence= {
'general': {
'model_sequence': 'object,face,alpr',
'disable_locks': '{{disable_locks}}',
},
'object': {
'general':{
'pattern':'{{object_detection_pattern}}',
'same_model_sequence_strategy': 'first' # also 'most', 'most_unique's
},
'sequence': [{
#First run on TPU with higher confidence
'object_weights':'{{tpu_object_weights_mobiledet}}',
'object_labels': '{{tpu_object_labels}}',
'object_min_confidence': {{tpu_min_confidence}},
'object_framework':'{{tpu_object_framework}}',
'tpu_max_processes': {{tpu_max_processes}},
'tpu_max_lock_wait': {{tpu_max_lock_wait}},
'max_detection_size':'{{max_detection_size}}'
},
{
# YoloV4 on GPU if TPU fails (because sequence strategy is 'first')
'object_config':'{{yolo4_object_config}}',
'object_weights':'{{yolo4_object_weights}}',
'object_labels': '{{yolo4_object_labels}}',
'object_min_confidence': {{object_min_confidence}},
'object_framework':'{{yolo4_object_framework}}',
'object_processor': '{{yolo4_object_processor}}',
'gpu_max_processes': {{gpu_max_processes}},
'gpu_max_lock_wait': {{gpu_max_lock_wait}},
'cpu_max_processes': {{cpu_max_processes}},
'cpu_max_lock_wait': {{cpu_max_lock_wait}},
'max_detection_size':'{{max_detection_size}}'
}]
},
'face': {
'general':{
'pattern': '{{face_detection_pattern}}',
'same_model_sequence_strategy': 'first'
},
'sequence': [{
'save_unknown_faces':'{{save_unknown_faces}}',
'save_unknown_faces_leeway_pixels':{{save_unknown_faces_leeway_pixels}},
'face_detection_framework': '{{face_detection_framework}}',
'known_images_path': '{{known_images_path}}',
'unknown_images_path': '{{unknown_images_path}}',
'face_model': '{{face_model}}',
'face_train_model': '{{face_train_model}}',
'face_recog_dist_threshold': '{{face_recog_dist_threshold}}',
'face_num_jitters': '{{face_num_jitters}}',
'face_upsample_times':'{{face_upsample_times}}',
'gpu_max_processes': {{gpu_max_processes}},
'gpu_max_lock_wait': {{gpu_max_lock_wait}},
'cpu_max_processes': {{cpu_max_processes}},
'cpu_max_lock_wait': {{cpu_max_lock_wait}},
'max_size':800
}]
},
'alpr': {
'general':{
'same_model_sequence_strategy': 'first',
'pre_existing_labels':['car', 'motorbike', 'bus', 'truck', 'boat'],
'pattern': '{{alpr_detection_pattern}}'
},
'sequence': [{
'alpr_api_type': '{{alpr_api_type}}',
'alpr_service': '{{alpr_service}}',
'alpr_key': '{{alpr_key}}',
'platrec_stats': '{{platerec_stats}}',
'platerec_min_dscore': {{platerec_min_dscore}},
'platerec_min_score': {{platerec_min_score}},
'max_size':1600
}]
}
}
zoneadmin@nkzoneminder:/etc/zm$
from zmeventnotification.
Related Issues (20)
- Issue configuring rules HOT 5
- ZMLog (No Attribute) Error after upgrading Ubuntu from 18.04 to 20.04 HOT 4
- Need help with the "cause_has" field HOT 4
- Not receiving notifications since the EOL announcement HOT 7
- past_det_max_diff_area was not being picked up when specified in ml_config structure HOT 1
- raise ValueError(f'malformed node or string: {node!r}') HOT 2
- Python Future problem HOT 11
- zm_detect.py eats cpu with mlapi enabled
- Bug on FCM server HOT 2
- Not work with opencv HOT 13
- zmeventnotification continues to look for memory map file when zoneminder is shutting down HOT 2
- Unable to send FCM notification (500 Server Error) HOT 1
- Install.sh throwing errors at the end HOT 2
- Eventserver only triggering for Monitor #1 HOT 12
- End event not being send after Start event HOT 2
- End hook not skipped when monitor is in hook skip list
- HandleQueuedBulkIn transfer in failed. Not found: USB transfer error 5 [LibUsbDataInCallback] when multiple zm_detect.py processes are run at once with the edgetpu. HOT 2
- [Net::WebSocket::Server missing] although installed HOT 10
- Execution zmeventnotification and python 3.11 and workaround
- zmesdetect fails to authenticate with zoneminder API HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from zmeventnotification.