Giter VIP home page Giter VIP logo

Comments (18)

pliablepixels avatar pliablepixels commented on September 22, 2024

Hi,
when looking at logs, do you see zmeventserver being triggered for each alarm ?
There are two areas of investigation:

  1. Check if zmeventserver is being triggered - if not, your client won't receive messages. This may be a zmeventserver issue
  2. If zmeventserver is being triggered and the client is not receiving messages, then its a socket issue

from zmeventnotification.

asantaga avatar asantaga commented on September 22, 2024

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.

pliablepixels avatar pliablepixels commented on September 22, 2024

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.

asantaga avatar asantaga commented on September 22, 2024

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.

asantaga avatar asantaga commented on September 22, 2024

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.

pliablepixels avatar pliablepixels commented on September 22, 2024

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.

asantaga avatar asantaga commented on September 22, 2024

thank you, appreciate it.
I think I mentioned Im running with SSL off

from zmeventnotification.

asantaga avatar asantaga commented on September 22, 2024

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)

image

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.

pliablepixels avatar pliablepixels commented on September 22, 2024

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.

asantaga avatar asantaga commented on September 22, 2024

thanks just saw this, will upgrade and see if I can work out which filters are being missed out

from zmeventnotification.

asantaga avatar asantaga commented on September 22, 2024

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.

pliablepixels avatar pliablepixels commented on September 22, 2024

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.

asantaga avatar asantaga commented on September 22, 2024

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.

asantaga avatar asantaga commented on September 22, 2024

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?

syslog.1.txt

from zmeventnotification.

pliablepixels avatar pliablepixels commented on September 22, 2024

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.

pliablepixels avatar pliablepixels commented on September 22, 2024

closing as no response. Please re-open if the issue persists

from zmeventnotification.

asantaga avatar asantaga commented on September 22, 2024

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

  1. connecting WS to 9002 (my address) works fine, I can check status version etc.
  2. 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.

bartbk avatar bartbk commented on September 22, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.