diff --git a/.gitignore b/.gitignore index 0dae662d7..3167e62a6 100644 --- a/.gitignore +++ b/.gitignore @@ -157,3 +157,4 @@ web/undef.log zm.conf zmconfgen.pl zmlinkcontent.sh +**/.DS_Store diff --git a/docs/_static/Icon_External_Link.png b/docs/_static/Icon_External_Link.png new file mode 100644 index 000000000..16f9b92db Binary files /dev/null and b/docs/_static/Icon_External_Link.png differ diff --git a/docs/_static/README.txt b/docs/_static/README.txt new file mode 100644 index 000000000..acc1d59d9 --- /dev/null +++ b/docs/_static/README.txt @@ -0,0 +1,2 @@ +The external link icon is GPL licensed. Original license link: +https://commons.wikimedia.org/wiki/Category:External_link_icons#/media/File:Icon_External_Link.png diff --git a/docs/_static/zmstyle.css b/docs/_static/zmstyle.css index b8f0235f3..986614fa6 100644 --- a/docs/_static/zmstyle.css +++ b/docs/_static/zmstyle.css @@ -1,3 +1,18 @@ img { border: 1px solid black !important; } + +.admonition-todo { + border-top: 2px solid red; + border-bottom: 2px solid red; + border-left: 2px solid red; + border-right: 2px solid red; + background-color: #ff6347; + } + + a.reference.external:link, + a.reference.external:visited{ + background: url('./Icon_External_Link.png') center right no-repeat; + padding-right: 13px; + + } \ No newline at end of file diff --git a/docs/api.rst b/docs/api.rst index b7a83c223..732e7c85e 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -21,12 +21,14 @@ The ZoneMinder API has evolved over time. Broadly speaking the iterations were a * Prior to version 1.29, there really was no API layer. Users had to use the same URLs that the web console used to 'mimic' operations, or use an XML skin * Starting version 1.29, a v1.0 CakePHP based API was released which continues to evolve over time. From a security perspective, it still tied into ZM auth and required client cookies for many operations. Primarily, two authentication modes were offered: - * You use cookies to maintain session state (`ZM_SESS_ID`) - * You use an authentication hash to validate yourself, which included encoding personal information and time stamps which at times caused timing validation issues, especially for mobile consumers -* Starting version 1.34, ZoneMinder has introduced a new "token" based system which is based JWT. We have given it a '2.0' version ID. These tokens don't encode any personal data and can be statelessly passed around per request. It introduces concepts like access tokens, refresh tokens and per user level API revocation to manage security better. The internal components of ZoneMinder all support this new scheme now and if you are using the APIs we strongly recommend you migrate to 1.34 and use this new token system (as a side note, 1.34 also moves from MYSQL PASSWORD to Bcrypt for passwords, which is also a good reason why you should migate). -* Note that as of 1.34, both versions of API access will work (tokens and the older auth hash mechanism), however we no longer use sessions by default. You will have to add a stateful=1 query parameter during login to tell ZM to set a COOKIE and store the required info in the session. This option is only available if OPT_USE_LEGACY_API_AUTH is set to ON. -.. NOTE:: + * You use cookies to maintain session state (``ZM_SESS_ID``) + * You use an authentication hash to validate yourself, which included encoding personal information and time stamps which at times caused timing validation issues, especially for mobile consumers + +* Starting version 1.34, ZoneMinder has introduced a new "token" based system which is based JWT. We have given it a '2.0' version ID. These tokens don't encode any personal data and can be statelessly passed around per request. It introduces concepts like access tokens, refresh tokens and per user level API revocation to manage security better. The internal components of ZoneMinder all support this new scheme now and if you are using the APIs we strongly recommend you migrate to 1.34 and use this new token system (as a side note, 1.34 also moves from MYSQL PASSWORD to Bcrypt for passwords, which is also a good reason why you should migate). +* Note that as of 1.34, both versions of API access will work (tokens and the older auth hash mechanism), however we no longer use sessions by default. You will have to add a ``stateful=1`` query parameter during login to tell ZM to set a COOKIE and store the required info in the session. This option is only available if ``OPT_USE_LEGACY_API_AUTH`` is set to ON. + +.. note:: For the rest of the document, we will specifically highlight v2.0 only features. If you don't see a special mention, assume it applies for both API versions. @@ -35,7 +37,9 @@ Enabling API ^^^^^^^^^^^^^ ZoneMinder comes with APIs enabled. To check if APIs are enabled, visit ``Options->System``. If ``OPT_USE_API`` is enabled, your APIs are active. -For v2.0 APIs, you have an additional option right below it - ``OPT_USE_LEGACY_API_AUTH`` which is enabled by default. When enabled, the `login.json` API (discussed later) will return both the old style (``auth=``) and new style (``token=``) credentials. The reason this is enabled by default is because any existing apps that use the API would break if they were not updated to use v2.0. (Note that zmNinja 1.3.057 and beyond will support tokens) +For v2.0 APIs, you have an additional option right below it: + + * ``OPT_USE_LEGACY_API_AUTH`` which is enabled by default. When enabled, the `login.json` API (discussed later) will return both the old style (``auth=``) and new style (``token=``) credentials. The reason this is enabled by default is because any existing apps that use the API would break if they were not updated to use v2.0. (Note that zmNinja 1.3.057 and beyond will support tokens) Enabling secret key ^^^^^^^^^^^^^^^^^^^ @@ -93,17 +97,14 @@ Once you have the keys (a.k.a credentials (v1.0, v2.0) or token (v2.0)) you shou :: + # v1.0 or 2.0 based API access (will only work if AUTH_HASH_LOGINS is enabled + # RECOMMENDED: v2.0 token based - curl -XPOST https://yourserver/zm/api/monitors.json&token= + curl -XGET https://yourserver/zm/api/monitors.json&token= - # or + # or, for legacy mode: - # v1.0 or 2.0 based API access (will only work if AUTH_HASH_LOGINS is enabled) - curl -XPOST -d "auth=" https://yourserver/zm/api/monitors.json - - # or - - curl -XGET https://yourserver/zm/api/monitors.json&auth= + curl -XGET https://yourserver/zm/api/monitors.json?auth= # or, if you specified -c cookies.txt in the original login request @@ -111,8 +112,8 @@ Once you have the keys (a.k.a credentials (v1.0, v2.0) or token (v2.0)) you shou .. NOTE:: - ZoneMinder's API layer allows API keys to be encoded either as a query parameter or as a data payload. If you don't pass keys, you could use cookies (not recommended as a general approach) + If you are using an ``HTTP GET`` request, the token/auth needs to be passed as a query parameter in the URL. If you are using an ``HTTP POST`` (like when you use the API to modify a monitor, for example), you can choose to pass the token as a data payload instead. The API layer discards data payloads for ``HTTP GET``. Finally, If you don't pass keys, you could also use cookies (not recommended as a general approach). Key lifetime (v1.0) ^^^^^^^^^^^^^^^^^^^^^ diff --git a/docs/conf.py b/docs/conf.py index 9bda5df7b..9de7bd820 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -31,7 +31,7 @@ def setup(app): # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. -extensions = [] +extensions = ['sphinx.ext.todo'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -265,3 +265,6 @@ texinfo_documents = [ # If true, do not generate a @detailmenu in the "Top" node's menu. #texinfo_no_detailmenu = False + +# Display todos by setting to True +todo_include_todos = True diff --git a/docs/faq.rst b/docs/faq.rst index 858408c71..56b67d082 100644 --- a/docs/faq.rst +++ b/docs/faq.rst @@ -1,8 +1,11 @@ FAQ ===== +.. todo:: needs to be reviewed - some entries may be old/invalid. I've done one round, but icOn needs to review. + This is the FAQ page. Feel free to contribute any FAQs that you think are missing. +.. note:: It is always a good idea to refer to the `ZoneMinder forums `__ for tips and tricks. While we try and make sure this FAQ is pruned/adjusted to align with the latest stable release, some of the entries may no longer be accurate (or there may be better suggestions in the forums). How can I stop ZoneMinder filling up my disk? --------------------------------------------- @@ -29,23 +32,22 @@ To delete events that are older than 7 days, create a new filter with "Date" set Save with 'Run Filter In Background' enabled to have it run automatically. Optional skip archived events: click on the plus sign next to -7 days to add another condition. "and" "archive status" equal to "unarchived only". -Optional slow delete: limit the number of results to 3. If you have a large backlog of events that would be deleted, this can hard spike the CPU usage for a long time. Limiting the number of results to only the first three each time the filter is run spreads out the delete processes over time, dramatically lessening the CPU load. +Optional slow delete: limit the number of results to a number, say ``10`` in the filter. If you have a large backlog of events that would be deleted, this can hard spike the CPU usage for a long time. Limiting the number of results to only the first three each time the filter is run spreads out the delete processes over time, dramatically lessening the CPU load. + + +.. warning:: We no longer recommend use enable ``OPT_FAST_DELETE`` or ``RUN_AUDIT`` anymore, unless you are using an old or low powered system to run Zoneminder. Please consider the remaining tips in this answer to be 'generally deprecated, use only if you must'. There are two methods for ZM to remove files when they are deleted that can be found in Options under the System tab ZM_OPT_FAST_DELETE and ZM_RUN_AUDIT. ZM_OPT_FAST_DELETE: -Normally an event created as the result of an alarm consists of entries in one or more database tables plus the various files associated with it. When deleting events in the browser it can take a long time to remove all of this if you are trying to do a lot of events at once. If you are running on an older or under-powered system, you may want to set this option which means that the browser client only deletes the key entries in the events table, which means the events will no longer appear in the listing, and leaves the zmaudit daemon to clear up the rest later. If you do so, disk space will not be freed immediately so you will need to run zmaudit more frequently. On modern systems, we recommend that you leave this off. - - +Normally an event created as the result of an alarm consists of entries in one or more database tables plus the various files associated with it. When deleting events in the browser it can take a long time to remove all of this if you are trying to do a lot of events at once. If you are running on an older or under-powered system, you may want to set this option which means that the browser client only deletes the key entries in the events table, which means the events will no longer appear in the listing, and leaves the zmaudit daemon to clear up the rest later. If you do so, disk space will not be freed immediately so you will need to run zmaudit more frequently. On modern systems, we recommend that you leave this **off**. ZM_RUN_AUDIT: The zmaudit daemon exists to check that the saved information in the database and on the file system match and are consistent with each other. If an error occurs or if you are using 'fast deletes' it may be that database records are deleted but files remain. In this case, and similar, zmaudit will remove redundant information to synchronize the two data stores. This option controls whether zmaudit is run in the background and performs these checks and fixes continuously. This is recommended for most systems however if you have a very large number of events the process of scanning the database and file system may take a long time and impact performance. In this case you may prefer to not have zmaudit running unconditionally and schedule occasional checks at other, more convenient, times. - - ZM_AUDIT_CHECK_INTERVAL: The zmaudit daemon exists to check that the saved information in the database and on the files system match and are consistent with each other. If an error occurs or if you are using 'fast deletes' it may be that database records are deleted but files remain. In this case, and similar, zmaudit will remove redundant information to synchronize the two data stores. The default check interval of 900 seconds (15 minutes) is fine for most systems however if you have a very large number of events the process of scanning the database and file system may take a long time and impact performance. In this case you may prefer to make this interval much larger to reduce the impact on your system. This option determines how often these checks are performed. @@ -64,12 +66,15 @@ In *general* a good estimate of memory required would be: Min Bits of Memory = 20% overhead * (image-width*image-height*image buffer size*target color space*number of cameras) Where: + * image-width and image-height are the width and height of images that your camera is configured for (in my case, 1280x960). This value is in the Source tab for each monitor * image buffer size is the # of images ZM will keep in memory (this is used by ZM to make sure it has pre and post images before detecting an alarm - very useful because by the time an alarm is detected, the reason for the alarm may move out of view and a buffer is really useful for this, including for analyzing stats/scores). This value is in the buffers tab for each monitor * target color space is the color depth - 8bit, 24bit or 32bit. It's again in the source tab of each monitor -The 1.2 at the start is basically adding 20% on top of the calculation to account for image/stream overheads (this is an estimate) + +The 20% overhead on top of the calculation to account for image/stream overheads (this is an estimate) The math breakdown for 4 cameras running at 1280x960 capture, 50 frame buffer, 24 bit color space: + :: 1280*960 = 1,228,800 (bytes) @@ -96,8 +101,6 @@ So a good rule of thumb is to make sure you have twice the memory as the calcula As it turns out, ZM uses mapped memory and by default, 50% of your physical memory is what this will grow to. When you reach that limit , ZM breaks down with various errors. -(**Note**: Mapped memory is applicable when you install ZoneMinder with mapped memory support, which is the default mode. If you have specifically disabled mapped memory then please see the next FAQ enty on how to increase shared memory) - A good way to know how much memory is allocated to ZM for its operation is to do a ``df -h`` A sample output on Ubuntu: @@ -116,138 +119,43 @@ For example, if you want to increase this limit to 70% of your memory, add the f where SHMPATH is the ``Mounted on`` path. Here, that would be ``/run/shm``. Other systems may be ``/dev/shm``. -What does a 'Can't shmget: Invalid argument' error in my logs mean? (and my camera does not display at higher resolutions) --------------------------------------------------------------------------------------------------------------------------------------- - -(*Note*: This is applicable for systems that have mapped memory disabled in ZoneMinder. By default, Mapped memory is enabled and unless you have disabled it manually, please refer to the "Math for Memory" question above and how to increase mapped memory limits) - -This error is discussed in the README in the following excerpt:- -''...this is caused by an attempt to allocate an amount of shared memory greater than your system can handle. The size it requests is based on the following formula, ``ring buffer size x image width x image height x 3 (for 24 bit images) + a bit of overhead``. - -So, for example: - -:: - - 384x288 capture resolution, that makes: 110 592 pixels - in 24 bit color that's x 3 = 331,776 bytes per frame - by 80 frames ring buffer x80 = 26,542,080 bytes per camera - by 4 cameras x4 = 106,168,320 bytes. - Plus 10% overhead = 116,785,152 bytes - Thats 114,048 kB, respectively 111.38 MB. - If my shared memory is set to 134,217,728, which is exactly 128MB, - that means I shouldn't have any problem. - (Note that 1kbyte = 1024bytes, 1MB = 1024 kB) - -If for instance you were using 24bit 640x480 then this would come to about 92Mb if you are using the default buffer size of 100. If this is too large then you can either reduce the image or buffer sizes or increase the maximum amount of shared memory available. If you are using RedHat then you can get details on how to change these settings `here `__ - -You should be able to use a similar procedure with other distributions to modify the shared memory pool without kernel recompilations though in some cases this may be necessary. Note, this error also sometimes occurs if you have an old shared memory segment lying around from a previous run that is too small. Use the ipcs and ipcrm system commands to check and remove it if necessary.'" - -You can often find out how many 4KB shared memory pages are available by typing the following :- - -:: - - # cat /proc/sys/kernel/shmall - 2097152 - -In recent kernels the shmall is set to 2097152 memory pages multiplied by 4096 bytes per page for a total of 8 GB of shared memory available. You only need to increase the shmall value if you have a computer with more than 8GB of memory and wish to use more of it for shared memory usage, such as large databases. - -The most shared memory bytes you can allocate in one go :- - -:: - - # cat /proc/sys/kernel/shmmax - 33554432 - -In recent kernels the shmmax is set to 33554432 bytes for only 32 MB of maximum shared memory allocatable at a time, hardly enough for ZoneMinder to go above 320 x 240 x 24-bit resolution at 40 frames in the buffer if it is using the /dev/shm shared memory device, so this value needs to be increased. If you are using ZoneMinder with the memory mapped (mmap) compile time option then this doesn't affect you. - -To change the value to 128 MB temporarily during this kernel execution type (for example) :- -``echo 536870912 >/proc/sys/kernel/shmmax`` - -*Be sure to restart ZoneMinder after this.* - -However be aware that sometimes you will only need to change the shmmax value as shmall is often large enough. Also changing these values in this way is only effective until your machine is rebooted. - -To change them permanently you will need to edit ``/etc/sysctl.conf`` and add the following lines (for example) :- -``kernel.shmmax = 536870912`` - -Or if your distribution has the ``/etc/sysctl.d/`` folder you can create a file in this folder without modifying the ``/etc/sysctl.d`` so you won't lose the changes during distro upgrades :- -```echo kernel.shmmax = 536870912 >/etc/sysctl.d/60-kernel-shm.conf``` - -To load these settings in the sysctl.conf file type: -``sysctl -p`` - -To check your shared memory settings type: -``ipcs -l`` - -Note that with Megapixel cameras like the Axis 207mw becoming cheaper and more attractive, the above memory settings are not adequate. To get Zoneminder working with a full 1280x1024 resolution camera in full color, increase ``134217728`` (128 MB) to, for example, ``268435456`` (256 MB) and multiple this value by each camera. - -These changes will now also be set the next time your machine is restarted. - -Versions 1.24.x of ZoneMinder also allows you to use an alternate method of shared memory allocation, `Mmap mapped memory `__ . This requires less configuration and can be simpler to use. Mapped memory allows you to use a special type of file as the placeholder for your memory and this file is 'mapped' into memory space for easy and fast access. - -To enable mapped memory in ZoneMinder you need add add the --enable--mmap=yes switch to your configure line. By default mapped memory files are created in /dev/shm which on most distributions is a dedicated pseudo-partition containing memory formatted as a filesystem. If your system uses a different path then this can be changed in ZoneMinder in Options->paths->PATH_MAP. It uses a filesystem type called `tmpfs `__. If you type ``df -h`` you should see this area and the size of memory it currently allows. To increase size for tmpfs you need to edit /etc/default/tmpfs. Search for: -``SHM_SIZE=128M`` -and change to something like -``SHM_SIZE=1G`` -then reboot the system. You could possibly need to change RUN_SIZE, too. - -It is important that you do not use a disk based filesystem for your memory mapped files as this will cause memory access to be extremely slow. ZoneMinder creates files called .zm.mmap. in the mapped memory filesystem. - -Mapped memory is subject to the same limitations in terms of total memory as using more traditional shared memory but does not require any configuration per allocation or chunk. In future versions of ZoneMinder this will be the default shared memory storage method. - -The essential difference was that the kernel.shmall setting is NOT in a direct memory setting in KB but in pages of memory. it is Max Pages of memory - -*For example:* If you want to allocate a maximum memory setting to 8GB you have to convert it to the number of pages (or segments). -with a page size of 4096. -kernel.shmall = 8000x1024x1024/4096 -``kernel.shmall = 2097152`` -NOT 8388608000 as would be suggested in the RedHat article linked above. - -shmmax is the max amount to allocate in one request - -this is is an actual memory size (as opposed to pages) set to 4GB -``kernel.shmmax = 4294967296`` - -The ``/etc/sysctl.conf`` would have these lines - -:: - - kernel.shmall = 2097152 - kernel.shmmax = 4294967296 - -As above, reload your sysctl.conf with ``sysctl -p`` and check that the settings are correct with ``ipcs -l``. I have enabled motion detection but it is not always being triggered when things happen in the camera view --------------------------------------------------------------------------------------------------------------- -ZoneMinder uses zones to examine images for motion detection. When you create the initial zones you can choose from a number of preset values for sensitivity etc. Whilst these are usually a good starting point they are not always suitable for all situations and you will probably need to tweak the values for your specific circumstances. The meanings of the various settings are described in the documentation (`here `__) however if you believe you have sensible settings configured then there are two diagnostic approaches you can use. +ZoneMinder uses zones to examine images for motion detection. When you create the initial zones you can choose from a number of preset values for sensitivity etc. Whilst these are usually a good starting point they are not always suitable for all situations and you will probably need to tweak the values for your specific circumstances. The meanings of the various settings are described in the documentation (`here `__). Another user contributed illustrated Zone definition guide can be found here: `An illustrated guide to Zones `__ + +However if you believe you have sensible settings configured then there are diagnostic approaches you can use. -Another user contributed illustrated Zone definition guide can be found here: `An illustrated guide to Zones `__ Event Statistics ^^^^^^^^^^^^^^^^^ -The first technique is to use event statistics. Firstly you should ensure they are switched on in Options->Logging->RECORD_EVENT_STATS. This will then cause the raw motion detection statistics for any subsequently generated events to be written to the DB. These can then be accessed by first clicking on the Frames or Alarm Frames values of the event from any event list view in the web gui. Then click on the score value to see the actual values that caused the event. Alternatively the stats can be accessed by clicking on the 'Stats' link when viewing any individual frame. The values displayed there correspond with the values that are used in the zone configuration and give you an idea of what 'real world' values are being generated. +The first technique is to use event statistics. Firstly you should ensure they are switched on in ``Options->Logging->RECORD_EVENT_STATS``. This will then cause the raw motion detection statistics for any subsequently generated events to be written to the DB. These can then be accessed by first clicking on the Frames or Alarm Frames values of the event from any event list view in the web gui. Then click on the score value to see the actual values that caused the event. Alternatively the stats can be accessed by clicking on the 'Stats' link when viewing any individual frame. The values displayed there correspond with the values that are used in the zone configuration and give you an idea of what 'real world' values are being generated. Note that if you are investigating why events 'do not' happen then these will not be saved and so won't be accessible. The best thing to do in that circumstance is to make your zone more sensitive so that it captures all events (perhap even ones you don't want) so you can get an idea of what values are being generated and then start to adjust back to less sensitive settings if necessary. You should make sure you test your settings under a variety of lighting conditions (e.g. day and night, sunny or dull) to get the best feel for that works and what doesn't. Using statistics will slow your system down to a small degree and use a little extra disk space in the DB so once you are happy you can switch them off again. However it is perfectly feasible to keep them permanently on if your system is able to cope which will allow you to review your setting periodically. -Diagnostic Images -^^^^^^^^^^^^^^^^^^^^ -The second approach is to use diagnostic images which are saved copies of the intermediate images that ZM uses when determining motion detection. These are switched on and off using Options->Logging->RECORD_DIAG_IMAGES. +Diagnostic Images along with FIFO +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +The second approach is to use diagnostic images which are saved copies of the intermediate images that ZM uses when determining motion detection. These are switched on and off using ``Options->Logging->RECORD_DIAG_IMAGES``. + +.. note:: In addition to the detailed explanation below, a recently added ``RECORD_DIAG_IMAGES_FIFO`` option, also available in ``Options->Logging`` can be an invaluable tool to see how your current motion settings are affecting motion detection. The ``delta`` stream along with the ``raw`` (json output) stream can be invaluable to see the effect in real time. Please refer to the explanation of this feature in :doc:`/userguide/options/options_logging` There are two kinds of diagnostic images which are and are written (and continuously overwritten) to the top level monitor event directory. If an event occurs then the files are additionally copied to the event directory and renamed with the appropriate frame number as a prefix. -The first set are produced by the monitor on the image as a whole. The diag-r.jpg image is the current reference image against which all individual frames are compared and the diag-d.jpg image is the delta image highlighting the difference between the reference image and the last analysed image. In this images identical pixels will be black and the more different a pixel is the whiter it will be. Viewing this image and determining the colour of the pixels is a good way of getting a feel for the pixel differences you might expect (often more than you think). +The first set are produced by the monitor on the image as a whole. The ``diag-r.jpg`` image is the current reference image against which all individual frames are compared and the ``diag-d.jpg`` image is the delta image highlighting the difference between the reference image and the last analysed image. In this images identical pixels will be black and the more different a pixel is the whiter it will be. Viewing this image and determining the colour of the pixels is a good way of getting a feel for the pixel differences you might expect (often more than you think). -The second set of diag images are labelled as diag--.jpg where zoneid is the id of the zone in question (Smile) and the stage is where in the alarm check process the image is generated from. So if you have several zones you can expect to see multiple files. Also these files are only interested in what is happening in their zone only and will ignore anything else outside of the zone. The stages that each number represents are as follows, +The second set of diag images are labelled as ``diag--.jpg`` where zoneid is the id of the zone in question (Smile) and the stage is where in the alarm check process the image is generated from. So if you have several zones you can expect to see multiple files. Also these files are only interested in what is happening in their zone only and will ignore anything else outside of the zone. The stages that each number represents are as follows, -# Alarmed Pixels - This image shows all pixels in the zone that are considered to be alarmed as white pixels and all other pixels as black. -# Filtered Pixels - This is as stage one except that all pixels removed by the filters are now black. The white pixels represent the pixels that are candidates to generate an event. -# Raw Blobs - This image contains all alarmed pixels from stage 2 but aggrageted into blobs. Each blob will have a different greyscale value (between 1 and 254) so they can be difficult to spot with the naked eye but using a colour picker or photoshop will make it easier to see what blob is what. -# Filtered Blobs - This image is as stage 3 but under (or over) sized blobs have been removed. This is the final step before determining if an event has occurred, just prior to the number of blobs being counted. Thus this image forms the basis for determining whether an event is generated and outlining on alarmed images is done from the blobs in this image. +* Alarmed Pixels - This image shows all pixels in the zone that are considered to be alarmed as white pixels and all other pixels as black. +* Filtered Pixels - This is as stage one except that all pixels removed by the filters are now black. The white pixels represent the pixels that are candidates to generate an event. +* Raw Blobs - This image contains all alarmed pixels from stage 2 but aggrageted into blobs. Each blob will have a different greyscale value (between 1 and 254) so they can be difficult to spot with the naked eye but using a colour picker or photoshop will make it easier to see what blob is what. +* Filtered Blobs - This image is as stage 3 but under (or over) sized blobs have been removed. This is the final step before determining if an event has occurred, just prior to the number of blobs being counted. Thus this image forms the basis for determining whether an event is generated and outlining on alarmed images is done from the blobs in this image. Using the above images you should be able to tell at all stages what ZM is doing to determine if an event should happen or not. They are useful diagnostic tools but as is mentioned elsewhere they will massively slow your system down and take up a great deal more space. You should never leave ZM running for any length of time with diagnostic images on. + Why can't ZoneMinder capture images (either at all or just particularly fast) when I can see my camera just fine in xawtv or similar? ---------------------------------------------------------------------------------------------------------------------------------------------- @@ -257,14 +165,14 @@ On average a card that can capture at 25fps per chip PAL for one input will do m When using xawtv etc to view the stream you are not looking at an image captured using the frame grabber but the card's video memory mapped onto your screen. This requires no capture or processing unless you do an explicit capture via the J or ctrl-J keys for instance. Some cards or drivers do not support the frame grabber interface at all so may not work with ZoneMinder even though you can view the stream in xawtv. If you can grab a still using the grab functionality of xawtv then in general your card will work with ZoneMinder. -Why can't I see streamed images when I can see stills in the Zone window etc? +Why can't I see streamed images when I can see stills in the zone window etc? ------------------------------------------------------------------------------------- This issue is normally down to one of two causes -1) You are using Internet Explorer and are trying to view multi-part jpeg streams. IE does not support these streams directly, unlike most other browsers. You will need to install Cambozola or another multi-part jpeg aware plugin to view them. To do this you will need to obtain the applet from the Downloads page and install the cambozola.jar file in the same directory as the ZoneMinder php files. Then find the ZoneMinder Options->Images page and enable ZM_OPT_CAMBOZOLA and enter the web path to the .jar file in ZM_PATH_CAMBOZOLA. This will ordinarily just be cambozola.jar. Provided (Options / B/W tabs) WEB_H_CAN_STREAM is set to auto and WEB_H_STREAM_METHOD is set to jpeg then Cambozola should be loaded next time you try and view a stream. +1) You are using Internet Explorer and are trying to view multi-part jpeg streams. IE does not support these streams directly, unlike most other browsers. You will need to install Cambozola or another multi-part jpeg aware plugin to view them. To do this you will need to obtain the applet from the Downloads page and install the cambozola.jar file in the same directory as the ZoneMinder php files. Then find the ZoneMinder Options->Images page and enable ``OPT_CAMBOZOLA`` and enter the web path to the .jar file in ``PATH_CAMBOZOLA``. This will ordinarily just be cambozola.jar. Provided (Options / B/W tabs) ``WEB_H_CAN_STREAM`` is set to auto and ``WEB_H_STREAM_METHOD`` is set to jpeg then Cambozola should be loaded next time you try and view a stream. -'''NOTE''': If you find that the Cambozola applet loads in IE but the applet just displays the version # of Cambozola and the author's name (as opposed to seeing the streaming images), you may need to chmod (''-rwxrwxr-x'') your (''usr/share/zoneminder/'') cambozola.jar: +**NOTE**: If you find that the Cambozola applet loads in IE but the applet just displays the version of Cambozola and the author's name (as opposed to seeing the streaming images), you may need to chmod (``-rwxrwxr-x``) your (``usr/share/zoneminder/``) cambozola.jar: :: @@ -272,9 +180,7 @@ This issue is normally down to one of two causes Once I did this, images started to stream for me. -2) The other common cause for being unable to view streams is that you have installed the ZoneMinder cgi binaries (zms and nph-zms) in a different directory than your web server is expecting. Make sure that the --with-cgidir option you use to the ZoneMinder configure script is the same as the CGI directory configure for your web server. If you are using Apache, which is the most common one, then in your httpd.conf file there should be a line like ``ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"`` where the last directory in the quotes is the one you have specified. If not then change one or the other to match. Be warned that configuring apache can be complex so changing the one passed to the ZoneMinder configure (and then rebuilding and reinstalling) is recommended in the first instance. If you change the apache config you will need to restart apache for the changes to take effect. If you still cannot see stream reliably then try changing Options->Paths->ZM_PATH_ZMS to just use zms if nph-zms is specified, or vice versa. Also check in your apache error logs. - -Also, please check the value of the ZM_PATH_ZMS setting under the Paths Options tab. It is where you configure the URL to the zms or nph-zms CGI executable. Under most Debian-based distros this value should be /zm/cgi-bin/nph-zms but in the past may have been /cgi-bin/nph-zms or you may have configured it to be something else. +2) The other common cause for being unable to view streams is that you have installed the ZoneMinder cgi binaries (zms and nph-zms) in a different directory than your web server is expecting. Make sure that the --with-cgidir option you use to the ZoneMinder configure script is the same as the CGI directory configure for your web server. If you are using Apache, which is the most common one, then in your httpd.conf file there should be a line like ``ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"`` where the last directory in the quotes is the one you have specified. If not then change one or the other to match. Be warned that configuring apache can be complex so changing the one passed to the ZoneMinder configure (and then rebuilding and reinstalling) is recommended in the first instance. If you change the apache config you will need to restart apache for the changes to take effect. If you still cannot see stream reliably then try changing ``ZM_PATH_ZMS`` in your ``/etc/zm/config`` directory to just use zms if nph-zms is specified, or vice versa. Also check in your apache error logs. Lastly, please look for errors created by the zmc processes. If zmc isn't running, then zms will not be able to get an image from it and will exit. @@ -300,6 +206,11 @@ change the 3 to a 1 network.http.max-persistent-connections-per-proxy -> 100 again network.http.max-persistent-connections-per-server -> 100 again + +I can't see more than 6 monitors in montage on my browser +--------------------------------------------------------- +Browsers such a Chrome and Safari only support upto 6 streams from the same domain. To work around that, take a look at the multi-port configuration discussed in the ``MIN_STREAMING_PORT`` configuration in :doc:`/userguide/options/options_network` + Why is ZoneMinder using so much CPU? --------------------------------------- @@ -313,8 +224,8 @@ The main causes are. * Big image sizes. A image of 640x480 requires at least four times the processing of a 320x240 image. Experiment with different sizes to see what effect it may have. Sometimes a large image is just two interlaced smaller frames so has no real benefit anyway. This is especially true for analog cameras/cards as image height over 320 (NTSC) or 352 PAL) are invariably interlaced. * Capture frame rates. Unless there's a compelling reason in your case there is often little benefit in running cameras at 25fps when 5-10fps would often get you results just as good. Try changing your monitor settings to limit your cameras to lower frame rates. You can still configure ZM to ignore these limits and capture as fast as possible when motion is detected. * Run function. Obviously running in Record or Mocord modes or in Modect with lots of events generates a lot of DB and file activity and so CPU and load will increase. - * Basic default detection zones. By default when a camera is added one detection zone is added which covers the whole image with a default set of parameters. If your camera covers a view in which various regions are unlikely to generate a valid alarm (ie the sky) then I would experiment with reducing the zone sizes or adding inactive zones to blank out areas you don't want to monitor. Additionally the actual settings of the zone themselves may not be optimal. When doing motion detection the number of changed pixels above a threshold is examined, then this is filter, then contiguous regions are calculated to see if an alarm is generated. If any maximum or minimum threshold is exceeded according to your zone settings at any time the calculation stops. If your settings always result in the calculations going through to the last stage before being failed then additional CPU time is used unnecessarily. Make sure your maximum and minimumzone thresholds are set to sensible values and experiment by switching RECORD_EVENT_STATS on and seeing what the actual values of alarmed pixels etc are during sample events. - * Optimise your settings. After you've got some settings you're happy with then switching off RECORD_EVENT_STATS will prevent the statistics being written to the database which saves some time. Other settings which might make a difference are ZM_FAST_RGB_DIFFS and the JPEG_xxx_QUALITY ones. + * Basic default detection zones. By default when a camera is added one detection zone is added which covers the whole image with a default set of parameters. If your camera covers a view in which various regions are unlikely to generate a valid alarm (ie the sky) then I would experiment with reducing the zone sizes or adding inactive zones to blank out areas you don't want to monitor. Additionally the actual settings of the zone themselves may not be optimal. When doing motion detection the number of changed pixels above a threshold is examined, then this is filter, then contiguous regions are calculated to see if an alarm is generated. If any maximum or minimum threshold is exceeded according to your zone settings at any time the calculation stops. If your settings always result in the calculations going through to the last stage before being failed then additional CPU time is used unnecessarily. Make sure your maximum and minimumzone thresholds are set to sensible values and experiment by switching ``RECORD_EVENT_STATS`` on and seeing what the actual values of alarmed pixels etc are during sample events. + * Optimise your settings. After you've got some settings you're happy with then switching off ``RECORD_EVENT_STATS`` will prevent the statistics being written to the database which saves some time. Other settings which might make a difference are ``ZM_FAST_RGB_DIFFS`` and the ``JPEG_xxx_QUALITY`` ones. I'm sure there are other things which might make a difference such as what else you have running on the box and memory sizes (make sure there's no swapping going on). Also speed of disk etc will make some difference during event capture and also if you are watching the whole time then you may have a bunch of zms processes running also. @@ -328,9 +239,11 @@ Using the timeline view is only recommended when using FireFox, however even the This function has from time to time been corrupted in the SVN release or in the stable releases, try and reinstall from a fresh download. +.. _disk_bw_faq: + How much Hard Disk Space / Bandwidth do I need for ZM? --------------------------------------------------------------- -Please see `this excel sheet `__ or `this online excel sheet `__ (both are user contributed excel sheets) +Please see `this online excel sheet `__. Note that this is just an estimate Or go to `this link `__ for the Axis bandwidth calculator. Although this is aimed at Axis cameras it still produces valid results for any kind of IP camera. @@ -351,38 +264,13 @@ Note that SELinux may cause errors other than those listed above. If you are in How do I enable ZoneMinder's security? ------------------------------------------- -In the console, click on Options. Check the box next to "ZM_OPT_USE_AUTH". You will immediately be asked to login. The default username is 'admin' and the password is 'admin'. +In the console, click on ``Options->System``. Check the box next to ``ZM_OPT_USE_AUTH``. You will immediately be asked to login. The default username is 'admin' and the password is 'admin'. To Manage Users: -In main console, go to Options->Users. +In main console, go to ``Options->Users``. -You may also consider to use the web server security, for example, htaccess files under Apache scope; You may even use this as an additional/redundant security on top of Zoneminders built-in security features; +You may also consider to use the web server security, for example, htaccess files under Apache scope; You may even use this as an additional/redundant security on top of Zoneminders built-in security features. Note that if you choose to enable webserver auth, zmNinja may have issues. Please read the `zmNinja FAQ on basic authentication `__ for more information. Also please note that zmNinja does not support digest authentication. -Why does ZM stop recording once I have 32000 events for my monitor? ------------------------------------------------------------------------- -Storing more than 32k files in a single folder is a limitation of some filesystems. To avoid this, enable USE_DEEP_STORAGE under Options. - -USE_DEEP_STORAGE is now the default for new ZoneMinder systems so this limitation should only apply to users upgrading from a previous version of ZoneMinder. - -Versions of ZM from 1.23.0 onwards allow you to have a deeper filesystem with fewer files per individual directory. As well as not being susceptible to the 32k limit, this is also somewhat faster. - -If you have upgraded from a previous version of ZoneMinder and this option is not already enabled, it is very important to follow the steps below to enable it on an existing system. Failure to properly follow these steps **WILL RESULT IN LOSS OF YOUR DATA!** - -:: - - # Stop ZoneMinder - # Backup your event data and the dB if you have the available storage - # Enable USE_DEEP_STORAGE under Options. - # From the command line, run "sudo zmupdate.pl --migrate-events" - # Monitor the output for any events that fail to convert. - # After the conversion completes, you can restart ZoneMinder - -Note that you can re-run the migrate-events command if any error messages scroll off the screen. - -You can read about the lack of a limit in the number of sub-directories in the ext4 filesystem at: `this link `__ -and see what tools may assist in your use of this filesystem `here `__ -If you search for ext3 or reiserfs on the forums you will find various threads on this issue with guidance on -how to convert. Managing system load (with IP Cameras in mind) ---------------------------------------------------- @@ -440,49 +328,14 @@ More expensive options: * Try building Zoneminder with processor specific instructions that are optimised to the system it will be running on, also increasing the optimisation level of GCC beyond -O2 will help. This topic is beyond the scope of this document. -Processor specific commands can be found in the GCC manual along with some more options that may increase performance. -``__ +Processor specific commands can be found in the `GCC manual `__ along with some more options that may increase performance. + What about disks and bandwidth? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ A typical 100mbit LAN will cope with most setups easily. If you're feeding from cameras over smaller or internet links, obviously fps will be much lower. -Disk and Bandwidth calculators are referenced on the Zoneminder wiki here: https://zoneminder.readthedocs.io/en/latest/faq.html#how-much-hard-disk-space-bandwidth-do-i-need-for-zm - - -Building ZoneMinder --------------------- - -When running configure I am getting a lot of messages about not being able to compile the ffmpeg libraries -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -If you see output from configure that looks like this - -:: - - checking libavcodec/avcodec.h usability... no - checking libavcodec/avcodec.h presence... yes - configure: WARNING: libavcodec/avcodec.h: present but cannot be compiled - configure: WARNING: libavcodec/avcodec.h: check for missing - prerequisite headers? - configure: WARNING: libavcodec/avcodec.h: see the Autoconf documentation - configure: WARNING: libavcodec/avcodec.h: section "Present But - Cannot Be Compiled" - configure: WARNING: libavcodec/avcodec.h: proceeding with the compiler's - result - configure: WARNING: ## ------------------------------------- ## - configure: WARNING: ## Report this to support@zoneminder.com ## - configure: WARNING: ## ------------------------------------- ## - -then it is caused not by the ZoneMinder build system but ffmpeg itself. However there is a workaround you can use which is to add ``CPPFLAGS=-D__STDC_CONSTANT_MACROS`` - -to the ZoneMinder ``./configure`` command which should solve the issue. However this is not a proper 'fix' as such, which can only come from the ffmpeg project itself. - -I cannot build ZoneMinder and am getting lots of undefined C++ template errors -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - - -This is almost certainly due to the 'ccache' package which attempts to speed up compilation by caching compiled objects. Unfortunately one of the side effects is that it breaks the GNU g++ template resolution method that ZoneMinder uses in building by prevent files getting recompiled. The simplest way around this is to remove the ccache package using your distros package manager. +Disk and Bandwidth calculators are referenced in :ref:`disk_bw_faq`. How do I build for X10 support? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -520,50 +373,10 @@ Although the example above describes changing states at different times of day, How can I use ZoneMinder to trigger something else when there is an alarm? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -ZoneMinder includes a perl API which means you can create a script to interact with the ZM shared memory data and use it in your own scripts to react to ZM alarms or to trigger ZM to generate new alarms. Full details are in the README or by doing ``perldoc ZoneMinder``, ``perldoc ZoneMinder::SharedMem`` etc. -Below is an example script that checks all monitors for alarms and when one occurs, prints a message to the screen. You can add in your own code to make this reaction a little more useful. +ZoneMinder includes a perl API which means you can create a script to interact with the ZM shared memory data and use it in your own scripts to react to ZM alarms or to trigger ZM to generate new alarms. Full details are in the README or by doing ``perldoc ZoneMinder`` etc. -:: +ZoneMinder provides a sample alarm script called `zmalarm.pl `__ that you can refer to as a starting point. - #!/usr/bin/perl -w - - use strict; - - use ZoneMinder; - - $| = 1; - - zmDbgInit( "myscript", level=>0, to_log=>0, to_syslog=>0, to_term=>1 ); - - my $dbh = DBI->connect( "DBI:mysql:database=".ZM_DB_NAME.";host=".ZM_DB_HOST, ZM_DB_USER, ZM_DB_PASS ); - - my $sql = "select M.*, max(E.Id) as LastEventId from Monitors as M left join Events as E on M.Id = E.MonitorId where M.Function != 'None' group by (M.Id)"; - my $sth = $dbh->prepare_cached( $sql ) or die( "Can't prepare '$sql': ".$dbh->errstr() ); - - my $res = $sth->execute() or die( "Can't execute '$sql': ".$sth->errstr() ); - my @monitors; - while ( my $monitor = $sth->fetchrow_hashref() ) - { - push( @monitors, $monitor ); - } - - while( 1 ) - { - foreach my $monitor ( @monitors ) - { - next if ( !zmMemVerify( $monitor ) ); - - if ( my $last_event_id = zmHasAlarmed( $monitor, $monitor->{LastEventId} ) ) - { - $monitor->{LastEventId} = $last_event_id; - print( "Monitor ".$monitor->{Name}." has alarmed\n" ); - # - # Do your stuff here - # - } - } - sleep( 1 ); - } Trouble Shooting ------------------- @@ -572,13 +385,9 @@ This is also how to obtain the info that we need to help you on the forums. What logs should I check for errors? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -ZoneMinder creates its own logs and are usually located in the ``/tmp`` directory. +ZoneMinder creates its own logs and are usually located in the ``/var/log/`` directory. Refer to the logging discussion in :doc:`/userguide/options/options_logging` for more details on where logs are stored and how to enable various log levels. -The ZoneMinder logs for the RPM packages are located in ``/var/log/zm``. - -Depending on your problem errors can show up in any of these logs but, usually the logs of interest are ``zmdc.log`` and ``zmpkg.log`` if ZM is not able to start. - -Now since ZM is dependent on other components to work, you might not find errors in ZM but in the other components. +Since ZM is dependent on other components to work, you might not find errors in ZM but in the other components. :: @@ -594,8 +403,6 @@ If ZM is not functioning, you should always be able to find an error in at least This will append any data entered to any of these logs to your console screen (``-f``). To exit, hit [ctrl -c]. -More verbose logging for the ZoneMinder binaries is available by enabling the debug option from the control panel and will be placed in the path you have configured for the debug logs. Output can be limited to a specific binary as described in the Debug options page under the "?" marks. - How can I trouble shoot the hardware and/or software? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -619,24 +426,28 @@ The apache web server needs to have the right permissions and configuration to b Why am I getting broken images when trying to view events? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Zoneminder and the Apache web server need to have the right permissions. Check this forum topic and similar ones: -https://forums.zoneminder.com/viewtopic.php?p=48754 +Zoneminder and the Apache web server need to have the right permissions. Check `this forum topic `__ and similar ones: + I can review events for the current day, but ones from yesterday and beyond error out ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -If you've checked that the `www-data` user has permissions to the storage folders, perhaps your php.ini's timezone setting is incorrect. They _must_ match for certain playback functions. +If you've checked that the ``www-data`` user has permissions to the storage folders, perhaps your php.ini's timezone setting is incorrect. They _must_ match for certain playback functions. -If you're using Linux, this can be found using the following command: :: +If you're using Linux, this can be found using the following command: + +:: timedatectl | grep "Time zone" -If using FreeBSD, you can use this one-liner: :: +If using FreeBSD, you can use this one-liner: + +:: cd /usr/share/zoneinfo/ && find * -type f -exec cmp -s {} /etc/localtime \; -print; -Once you know what timezone your system is set to, open `/etc/php.ini` and adjust ``date.timezone`` to the appropriate value. the PHP daemon may need to be restarted for changes to take effect. +Once you know what timezone your system is set to make sure you set the right time zone in ZM (Available in ``Options->System->TimeZone``) Why is the image from my color camera appearing in black and white? @@ -651,39 +462,17 @@ If this camera is attached to a capture card, then you may have selected the wro Why do I only see black screens with a timestamp when monitoring my camera? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -In the monitor windows where you see the black screen with a timestamp, select settings and enter the Brightness, Contrast, Hue, and Color settings reported for the device by '''zmu -d -q -v'''. 32768 may be appropriate values to try for these settings. After saving the settings, select Settings again to confirm they saved successfully. +In the monitor windows where you see the black screen with a timestamp, select settings and enter the Brightness, Contrast, Hue, and Color settings reported for the device by ``zmu -d -q -v``. 32768 may be appropriate values to try for these settings. After saving the settings, select Settings again to confirm they saved successfully. -I am getting messages about a backtrace in my logs, what do I do? -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -If you are seeing entries in your log like the following - -:: - - Jan 11 20:25:22 localhost zma_m2[19051]: ERR [Backtrace: /lib64/libc.so.6 [0x3347230210]] - Jan 11 20:25:22 localhost zma_m2[19051]: ERR [Backtrace: /lib64/libc.so.6(memset+0xce) [0x334727684e]] - Jan 11 20:25:22 localhost zma_m2[19051]: ERR [Backtrace: /usr/local/bin/zma [0x40ee9a]] - Jan 11 20:25:22 localhost zma_m2[19051]: ERR [Backtrace: /usr/local/bin/zma [0x419946]] - Jan 11 20:25:22 localhost zma_m2[19051]: ERR [Backtrace: /usr/local/bin/zma [0x4213cf]] - Jan 11 20:25:22 localhost zma_m2[19051]: ERR [Backtrace: /usr/local/bin/zma(cos+0x35c) [0x404674]] - Jan 11 20:25:22 localhost zma_m2[19051]: ERR [Backtrace: /lib64/libc.so.6(__libc_start_main+0xf4) [0x334721da44]] - Jan 11 20:25:22 localhost zma_m2[19051]: ERR [Backtrace: /usr/local/bin/zma(cos+0xd1) [0x4043e9]] - Jan 11 20:25:22 localhost zma_m2[19051]: INF [Backtrace complete] - -then you can help diagnose the problem by running a special command to translate the hex addresses into helpful information. This command is called addr2line and you can type 'man addr2line' for more information. -Basically addr2line takes two sets of parameters, the first is the name of the binary file, and the second is a list of addresses. Both of these pieces of information are displayed in the logs. The filename is the first part after the 'Backtrace:' tag, in this case /usr/local/bin/zma, though it may well be different in your case. Some of the lines refer to libraries rather than the zma executable but those can be ignored for now, the important part is noting which ZM binary is involved. The binary file is passed in following the -e flag. The addresses to pass to addr2line are those contained in the '[]' pairs. Again you can ignore those that are on a line that refers to a library but it will not hurt if you include them. -So in the example above, the command would be ``addr2line -e /usr/local/bin/zma 0x40ee9a 0x419946 0x4213cf 0x404674 0x4043e9`` -This should then dump out a more symbolic list containing source file names and line numbers, and it is this information which will be helpful if posted to the forums. Sometimes addr2line fails to produce useful output. This is usually because either the problem is so severe that it has corrupted the stack and prevented useful information from being displayed, or that you have either compiled ZM without the -g flag for debug, or you have stripped the binaries of symbol information after installation. This this case you would need to rebuild temporarily with debug enabled for the information to be useful. - - -This error some times happens when a linked camera looses its link or it is corrupted by the user or some other system event, try deleting the affected cameras and recreating them in the Zoneminder console. How do I repair the MySQL Database? ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ There is two ways to go about this. In most cases you can run from the command prompt -> -* mysqlcheck --all-databases --auto-repair -p'''your_database_password''' -u '''your_databse_user''' +``mysqlcheck --all-databases --auto-repair -p your_database_password -u your_databse_user`` -If that does not work then you will have to make sure that ZoneMinder is stopped then run the following (nothing should be using the database while running this and you will have to adjust for your correct path if it is different). -> -* myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /var/lib/mysql/*/*.MYI +If that does not work then you will have to make sure that ZoneMinder is stopped then run the following (nothing should be using the database while running this and you will have to adjust for your correct path if it is different): + +``myisamchk --silent --force --fast --update-state -O key_buffer=64M -O sort_buffer=64M -O read_buffer=1M -O write_buffer=1M /var/lib/mysql/*/*.MYI`` How do I repair the MySQL Database when the cli fails? @@ -743,3 +532,6 @@ Can I use ZoneMinder as part of my commercial product? The GPL license allows you produce systems based on GPL software provided your systems also adhere to that license and any modifications you make are also released under the same terms. The GPL does not permit you to include ZoneMinder in proprietary systems (see https://www.gnu.org/licenses/gpl-faq.html#GPLInProprietarySystem for details). If you wish to include ZoneMinder in this kind of system then you will need to license ZoneMinder under different terms. This is sometimes possible and you will need to contact me for further details in these circumstances. +I am having issues with zmNinja and/or Event Notification Server +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +zmNinja and the Event Notification Server are 3rd party solutions. The developer maintains exhaustive `documentation and FAQs `__. Please direct your questions there. \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 46da979cf..740e9ec26 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -10,7 +10,9 @@ ZoneMinder Documentation faq contributing -Welcome to ZoneMinder's documentation, the following resources are available +Welcome to ZoneMinder's documentation. Please navigate to one of the links below. + +If you are facing issues that are not covered in the documentation, please feel free to check the `ZoneMinder Forums `__ or join the `ZoneMinder-Chat Slack channel `__ if you prefer real time interaction. :doc:`installationguide/index` Many distribution repos only hold older versions of ZoneMinder, current versions contain many bug fixes and updated functionality. Instructions here for installing updated packages or compiling from source. @@ -27,6 +29,9 @@ Welcome to ZoneMinder's documentation, the following resources are available :doc:`contributing` How to contribute to ZoneMinder. As a community project we always need help, you don't need to be a coder to test or update documentation. +`Event Notification Server and Machine Learning hooks `__ + Documentation for the 3rd party Event Notification Server and Machine Learning for Object/People/Face detection. + Indices and tables diff --git a/docs/installationguide/easydocker.rst b/docs/installationguide/easydocker.rst new file mode 100644 index 000000000..899ce0e5d --- /dev/null +++ b/docs/installationguide/easydocker.rst @@ -0,0 +1,11 @@ +An Easy To Use Docker Image +=========================== +If you are interested in trying out ZoneMinder quickly, user Dan Landon maintains an easy to use docker image for ZoneMinder. With a few simple configuration changes, it also provides complete Event Notification Server and Machine Learning hook support. Please follow instructions in his repostory. He maintains two repositories: + +* If you want to run the latest stable release, please use his `zoneminder repository `__. +* If you want to run the latest zoneminder master, please use his `zoneminder master repository `__. + +In both cases, instructions are provided in the repo README files. + +If you are looking at building your own native (non docker) binary packages of ZoneMinder for your distro, please refer to the distro specific install guides or :doc:`packpack`. + diff --git a/docs/installationguide/images/zm_first_screen_post_install.png b/docs/installationguide/images/zm_first_screen_post_install.png index 568d7fcf5..59e2af6d3 100644 Binary files a/docs/installationguide/images/zm_first_screen_post_install.png and b/docs/installationguide/images/zm_first_screen_post_install.png differ diff --git a/docs/installationguide/index.rst b/docs/installationguide/index.rst index 4e2288de6..602632c94 100644 --- a/docs/installationguide/index.rst +++ b/docs/installationguide/index.rst @@ -1,14 +1,18 @@ Installation Guide ====================================== +.. todo:: This entire guide needs to be checked/updated as needed + Contents: .. toctree:: :maxdepth: 2 + easydocker packpack ubuntu debian redhat + windows_wsl multiserver dedicateddrive diff --git a/docs/installationguide/packpack.rst b/docs/installationguide/packpack.rst index dd54ef4b2..72fdf8661 100644 --- a/docs/installationguide/packpack.rst +++ b/docs/installationguide/packpack.rst @@ -1,6 +1,8 @@ All Distros - A Docker Way to Build ZoneMinder =============================================== +.. note:: If you are looking for an easy way to run ZoneMinder and not interested in building your own docker image, please refer to :doc:`easydocker`. + .. contents:: These instructions represent an alternative way to build ZoneMinder for any supported distro. @@ -124,4 +126,4 @@ More testing needs to be done for Redhat distros but it appears Fedora users can sudo systemctl start systemd-binfmt -TO-DO: Verify the details behind enabling qemu emulation on redhat distros. Pull requests are welcome. +.. todo:: Verify the details behind enabling qemu emulation on redhat distros. Pull requests are welcome. diff --git a/docs/installationguide/windows_wsl.rst b/docs/installationguide/windows_wsl.rst new file mode 100644 index 000000000..6861f522e --- /dev/null +++ b/docs/installationguide/windows_wsl.rst @@ -0,0 +1,10 @@ +Windows 10+ using WSL +======================= + +With Windows 10, Microsoft released the `Window Subsystem for Linux (WSL) `__ that enables you to run native Linux tools directly on Windows, alongside your traditional Windows desktop and modern store apps. To install WSL, please refer to the +`installation guide from Microsoft `__. + +ZoneMinder now runs on Windows 10+ systems which have WSL enabled. This guide will explain how to go about installing an Ubuntu ZM image on Windows 10+. + +.. todo:: Isaac to add instructions. + diff --git a/docs/userguide/components.rst b/docs/userguide/components.rst index ed148af89..064e27d5f 100644 --- a/docs/userguide/components.rst +++ b/docs/userguide/components.rst @@ -72,6 +72,9 @@ Finally some perl scripts in the scripts directory. These scripts all have some **zm** This is the (optional) ZoneMinder init script, see below for details. +**zmeventnotification.pl** + This is an optional 3rd party real time event notification server that also provides push notifications for zmNinja as well as machine learning powered object/face-detection. Please see `Event Notification Server Documentation `__ for more details (Note that the machine learning components are optional, and are developed in Python3) + Finally, there are also a number of ZoneMinder perl modules included. These are used by the scripts above, but can also be used by your own or 3rd party scripts. Full documentation for most modules is available in ‘pod’ form via ‘perldoc’ but the general purpose of each module is as follows. **ZoneMinder.pm** diff --git a/docs/userguide/configfiles.rst b/docs/userguide/configfiles.rst new file mode 100644 index 000000000..879d181fd --- /dev/null +++ b/docs/userguide/configfiles.rst @@ -0,0 +1,47 @@ +Configuration Files +-------------------- +This section describes configuration files that ZoneMinder uses beyond the various Web UI options. + +.. _replacement_for_options_path: + +System Path Configurations +~~~~~~~~~~~~~~~~~~~~~~~~~~ +At one point of time, ZoneMinder stored various system path configurations under the Web UI (``Options->Paths``). This was removed a few versions ago and now resides in a configuration file. The motivation for this change can be read in `this discussion `__. + +Typically, path configurations now reside in ``/etc/zm``. + +Here is an example of the file hierarchy: + +:: + + /etc/zm + ├── conf.d + │   ├── 01-system-paths.conf + │   ├── 02-multiserver.conf + | ├── 03-custom.conf #optional + │   └── README + ├── objectconfig.ini # optional + ├── zm.conf + └── zmeventnotification.ini #optional + +The roles of the files are as follows: + +* ``zm.conf`` contains various base configuration entries. You should not edit this file as it may be overwritten on an upgrade. +* ``zmeventnotification.ini`` is only present if you have installed the ZoneMinder Event Notification Server. +* ``objectconfig.ini`` is only present if you have installed the machine learning hooks for the Event Notification Server. +* ``conf.d`` contains additional configuration items as follows: + + * ``01-system-paths.conf`` contains all the paths that were once part of ``Options->Paths`` in the Web UI. You should not edit this file as it may be overwritten on an upgrade + * ``02-multiserver.conf`` file consists of custom variables if you are deploying ZoneMinder in a multi-server configuration (see :doc:`/installationguide/multiserver`) + * ``03-custom.conf`` is an custom config file that I created to override specific variables in the path files. **This is the recommended way to customize entries**. Anything that you want to change should be in a new file inside ``conf.d``. Note that ZoneMinder will sort all the files alphabetically and run their contents in ascending order. So it doesn't really matter what you name them, as long as you make sure your changes are not overwritten by another file in the sorting sequence. It is therefore good practice to prefix your file names by ``nn-`` where ``nn`` is a monotonically increasing numerical sequence ``01-`` ``02-`` ``03-`` and so forth, so you know the order they will be processed. + +Timezone Configuration +~~~~~~~~~~~~~~~~~~~~~~~ +Earlier versions of ZoneMinder relied on ``php.ini`` to set Date/Time Zone. This is no longer the case. You can (and must) set the Timezone via the Web UI, starting ZoneMinder version 1.34. See :ref:`here `. + +Database Specific Configuration +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. todo:: do we really need to have this section? Not sure if its generic and not specific to ZM + +While the ZoneMinder specific database config entries reside in ``/etc/zm/zm.conf`` and related customizations discussed above, general database configuration items can be tweaked in ``/etc/mysql`` (or whichever path your DB server is installed) \ No newline at end of file diff --git a/docs/userguide/definemonitor.rst b/docs/userguide/definemonitor.rst index a850c8c92..a5b622872 100644 --- a/docs/userguide/definemonitor.rst +++ b/docs/userguide/definemonitor.rst @@ -46,6 +46,10 @@ Linked Monitors This field allows you to select other monitors on your system that act as triggers for this monitor. So if you have a camera covering one aspect of your property you can force all cameras to record while that camera detects motion or other events. You can either directly enter a comma separated list of monitor ids or click on ‘Select’ to choose a selection. Be very careful not to create circular dependencies with this feature however you will have infinitely persisting alarms which is almost certainly not what you want! To unlink monitors you can ctrl-click. Maximum FPS + + .. warning:: + Unless you know what you are doing, please leave this field empty, especially if you are configuring a network camera. More often than not, putting a value here adversely affects recording. + On some occasions you may have one or more cameras capable of high capture rates but find that you generally do not require this performance at all times and would prefer to lighten the load on your server. This option permits you to limit the maximum capture rate to a specified value. This may allow you to have more cameras supported on your system by reducing the CPU load or to allocate video bandwidth unevenly between cameras sharing the same video device. This value is only a rough guide and the lower the value you set the less close the actual FPS may approach it especially on shared devices where it can be difficult to synchronise two or more different capture rates precisely. This option controls the maximum FPS in the circumstance where no alarm is occurring only. This feature is limited and will only work under the following conditions: @@ -56,6 +60,11 @@ Maximum FPS Using this field for video streams from IP cameras will cause undesirable results when the value is equal to or less than the frame rate from the camera. Note that placing a value higher than the camera's frame rate is allowed and can help prevent cpu spikes when communication from the camera is lost. Alarm Maximum FPS + + .. warning:: + Unless you know what you are doing, please leave this field empty, especially if you are configuring a network camera. More often than not, putting a value here adversely affects recording. + + If you have specified a Maximum FPS it may be that you don’t want this limitation to apply when your monitor is recording motion or other event. This setting allows you to override the Maximum FPS value if this circumstance occurs. As with the Maximum FPS setting leaving this blank implies no limit so if you have set a maximum fps in the previous option then when an alarm occurs this limit would be ignored and ZoneMinder would capture as fast as possible for the duration of the alarm, returning to the limited value after the alarm has concluded. Equally you could set this to the same, or higher (or even lower) value than Maximum FPS for more precise control over the capture rate in the event of an alarm. **IMPORTANT:** This field is subject to the same limitations as the Maximum FPS field. Ignoring these limitations will produce undesriable results. @@ -71,15 +80,15 @@ Source Tab FFmpeg ^^^^^^ - This is the recommended source type for most modern ip cameras. + This is the **recommended** source type for most modern ip cameras. Source Path Use this field to enter the full URL of the stream or file your camera supports. This is usually an RTSP url. There are several methods to learn this: * Check the documentation that came with your camera - * Look for your camera in the hardware compatibilty list in the wiki https://wiki.zoneminder.com/Hardware_Compatibility_List + * Look for your camera in the hardware compatibilty list in the `hardware compatibility wiki `__ * Try ZoneMinder's new ONVIF probe feature - * Download and install the ONVIF Device Manager onto a Windows machine https://sourceforge.net/projects/onvifdm/ + * Download and install the `ONVIF Device Manager `__ onto a Windows machine * Use Google to find third party sites, such as ispy, which document this information Source Colours Specify the amount of colours in the captured image. 32 bit is the preferred choice here. Unlike with local cameras changing this has no controlling effect on the remote camera itself so ensure that your camera is actually capturing to this palette beforehand. @@ -271,3 +280,7 @@ Default Scale If your monitor has been defined with a particularly large or small image size then you can choose a default scale here with which to view the monitor so it is easier or more visible from the web interface. Web Colour Some elements of ZoneMinder now use colours to identify monitors on certain views. You can select which colour is used for each monitor here. Any specification that is valid for HTML colours is valid here, e.g. ‘red’ or ‘#ff0000’. A small swatch next to the input box displays the colour you have chosen. +Embed EXIF data into image: + Embeds EXIF data into each jpeg frame + + .. todo:: what about mp4s? diff --git a/docs/userguide/filterevents.rst b/docs/userguide/filterevents.rst index e33e15cab..8359aaf89 100644 --- a/docs/userguide/filterevents.rst +++ b/docs/userguide/filterevents.rst @@ -8,10 +8,7 @@ Filters allow you to define complex conditions with associated actions in ZoneMi And many more. -The filter window can be accessed from various views, one of which is to simply tap on the filter button in the main web view: - -.. image:: images/filter-button.png - :width: 600px +The filter window can be accessed by tapping on the top level filter menu You can use the filter window to create your own filters or to modify existing ones. You can even save your favourite filters to re-use at a future date. Filtering itself is fairly simple; you first choose how many expressions you'd like your filter to contain. Changing this value will cause the window to redraw with a corresponding row for each expression. You then select what you want to filter on and how the expressions relate by choosing whether they are 'and' or 'or' relationships. For filters comprised of many expressions you will also get the option to bracket parts of the filter to ensure you can express it as desired. Then if you like choose how you want your results sorted and whether you want to limit the amount of events displayed. @@ -22,18 +19,30 @@ Here is what the filter window looks like :width: 800px * *A*: This is a dropdown list where you can select pre-defined filters. You will notice that ZoneMinder comes with a PurgeWhenFull filter that is configured to delete events if you reach 95% of disk space. -* *B* and *C*: This is where you specify conditions that need to match before the filter is executed. You use the "+" and "-" buttons to add/delete conditions -* *D*: This is where you specify what needs to happen when the conditions match: +* *B*: If you are creating a new filter, you can type in a name for your filter here +* *C*: This is where you specify conditions that need to match before the filter is executed. You use the "+" and "-" buttons to add/delete conditions +* *D*: This allows you to perform sorting and limiting operations on the output before you take an action +* *E*: This is where you specify what needs to happen when the conditions match: + * Archive all matches: sets the archive field to 1 in the Database for the matched events. Think of 'archiving' as grouping them under a special category - you can view archived events later and also make sure archived events don't get deleted, for example - * Email details of all matches: Sends an email to the configured address with details about the event. - The email can be customized as per TBD - * Execute command on all matches: Allows you to execute any arbitrary command on the matched events. You can use replacement tokens as subsequent arguents to the command, the last argument will be the absolute path to the event, preceeded by replacement arguents. eg: /usr/bin/script.sh %MN% will excecute as /usr/bin/script.sh MonitorName /path/to/event. - * Delete all matches: Deletes all the matched events -* *E*: Use 'Submit' to 'test' your matching conditions. This will just match and show you what filters match. Use 'Execute' to actually execute the action after matching your conditions. Use 'Save' to save the filter for future use and 'Reset' to clear your settings + + .. todo :: + fill in what update used disk space, copy all matches, move all matches do. For the "create video" filter, put in more details on how it works, any dependencies etc. -.. NOTE:: More details on filter conditions: + * Update used disk space: + * Create video for all matches: creates a video file of all the events that match + * Execute command on all matches: Allows you to execute any arbitrary command on the matched events. You can use replacement tokens as subsequent arguents to the command, the last argument will be the absolute path to the event, preceeded by replacement arguents. eg: /usr/bin/script.sh %MN% will excecute as /usr/bin/script.sh MonitorName /path/to/event. + * Delete all matches: Deletes all the matched events. + * Copy all matches: + * Move all matches: + * Run filter in background: When checked, ZoneMinder will make sure the filter is checked regularly. For example, if you want to be notified of new events by email, you should make sure this is checked. Filters that are configured to run in the background have a “*” next to it. + * Run filter concurrently: Allows this filter to run in its own thread thereby letting other filters run in parallel. + +* *F*: Use 'List Matches' to 'test' your matching conditions. This will just match and show you what filters match. Use 'Execute' to actually execute the action after matching your conditions. Use 'Save' to save the filter for future use and 'Reset' to clear your settings + +.. note:: More details on filter conditions: There are several different elements to an event that you can filter on, some of which require further explanation. These are as follows, * 'Date/Time' which must evaluate to a date and a time together, @@ -46,38 +55,39 @@ Here is what the filter window looks like If you do this then the subsequent dialog will also allow you specify whether you want this filter automatically applied in order to delete events or upload events via ftp to another server and mail notifications of events to one or more email accounts. Emails and messages (essentially small emails intended for mobile phones or pagers) have a format defined in the Options screen, and may include a variety of tokens that can be substituted for various details of the event that caused them. This includes links to the event view or the filter as well as the option of attaching images or videos to the email itself. Be aware that tokens that represent links may require you to log in to access the actual page, and sometimes may function differently when viewed outside of the general ZoneMinder context. The tokens you can use are as follows. - * %EI% Id of the event - * %EN% Name of the event - * %EC% Cause of the event - * %ED% Event description - * %ET% Time of the event - * %EL% Length of the event - * %EF% Number of frames in the event - * %EFA% Number of alarm frames in the event - * %EST% Total score of the event - * %ESA% Average score of the event - * %ESM% Maximum score of the event - * %EP% Path to the event - * %EPS% Path to the event stream - * %EPI% Path to the event images - * %EPI1% Path to the first alarmed event image - * %EPIM% Path to the (first) event image with the highest score - * %EI1% Attach first alarmed event image - * %EIM% Attach (first) event image with the highest score - * %EV% Attach event mpeg video - * %MN% Name of the monitor - * %MET% Total number of events for the monitor - * %MEH% Number of events for the monitor in the last hour - * %MED% Number of events for the monitor in the last day - * %MEW% Number of events for the monitor in the last week - * %MEM% Number of events for the monitor in the last month - * %MEA% Number of archived events for the monitor - * %MP% Path to the monitor window - * %MPS% Path to the monitor stream - * %MPI% Path to the monitor recent image - * %FN% Name of the current filter that matched - * %FP% Path to the current filter that matched - * %ZP% Path to your ZoneMinder console + * %EI% Id of the event + * %EN% Name of the event + * %EC% Cause of the event + * %ED% Event description + * %ET% Time of the event + * %EL% Length of the event + * %EF% Number of frames in the event + * %EFA% Number of alarm frames in the event + * %EST% Total score of the event + * %ESA% Average score of the event + * %ESM% Maximum score of the event + * %EP% Path to the event + * %EPS% Path to the event stream + * %EPI% Path to the event images + * %EPI1% Path to the first alarmed event image + * %EPIM% Path to the (first) event image with the highest score + * %EI1% Attach first alarmed event image + * %EIM% Attach (first) event image with the highest score + * %EV% Attach event mpeg video + * %MN% Name of the monitor + * %MET% Total number of events for the monitor + * %MEH% Number of events for the monitor in the last hour + * %MED% Number of events for the monitor in the last day + * %MEW% Number of events for the monitor in the last week + * %MEM% Number of events for the monitor in the last month + * %MEA% Number of archived events for the monitor + * %MOD% Path to image containing object detection + * %MP% Path to the monitor window + * %MPS% Path to the monitor stream + * %MPI% Path to the monitor recent image + * %FN% Name of the current filter that matched + * %FP% Path to the current filter that matched + * %ZP% Path to your ZoneMinder console Finally you can also specify a script which is run on each matched event. This script should be readable and executable by your web server user. It will get run once per event and the relative path to the directory containing the event in question. Normally this will be of the form / so from this path you can derive both the monitor name and event id and perform any action you wish. Note that arbitrary commands are not allowed to be specified in the filter, for security the only thing it may contain is the full path to an executable. What that contains is entirely up to you however. @@ -87,15 +97,8 @@ Here is what the filter window looks like Saving filters ----------------- -.. image:: images/filter-save.png - :width: 400px - When saving filters, if you want the filter to run in the background make sure you select the "Run filter in background" option. When checked, ZoneMinder will make sure the filter is checked regularly. For example, if you want to be notified of new events by email, you should make sure this is checked. Filters that are configured to run in the background have a "*" next to it. -For example: - -.. image:: images/filter-choosefilter.png - :width: 400px How filters actually work -------------------------- diff --git a/docs/userguide/gettingstarted.rst b/docs/userguide/gettingstarted.rst index 896cdb99f..509f413a2 100644 --- a/docs/userguide/gettingstarted.rst +++ b/docs/userguide/gettingstarted.rst @@ -5,32 +5,144 @@ Having followed the :doc:`/installationguide/index` for your distribution you sh .. image:: ../installationguide/images/zm_first_screen_post_install.png +.. _timezone_config: + +Setting Timezone +^^^^^^^^^^^^^^^^^ +Previous versions of ZoneMinder required the user to set up Timezone correctly in ``php.ini``. This is no longer the case. Starting 1.34, ZoneMinder allows you to specify the TimeZone in the UI. Please make sure it is set up correctly. The Timezone can be changed by selecting ``Options->System->Timezone`` + +.. image:: images/getting-started-timezone.png Enabling Authentication ^^^^^^^^^^^^^^^^^^^^^^^ We strongly recommend enabling authentication right away. There are some situations where certain users don't enable authentication, such as instances where the server is in a LAN not directly exposed to the Internet, and is only accessible via VPN etc., but in most cases, authentication should be enabled. So let's do that right away. -* Click on the Options link on the top right corner of the web interface -* You will now be presented with a screen full of options. Click on the "System" tab +* Click on the Options link on the top bar of the web interface +* You will now be presented with a sidebar full of options. Click on the "System" link .. image:: images/getting-started-enable-auth.png * The relevant portions to change are marked in red above * Enable OPT_USE_AUTH - this automatically switches to authentication mode with a default user (more on that later) * Select a random string for AUTH_HASH_SECRET - this is used to make the authentication logic more secure, so - please generate your own string and please don't use the same value in the example. + please generate your own string and make sure it is sufficiently randomized and long. Note that if you plan to use APIs with ZoneMinder (needed by zmNinja/other apps), it is mandatory that you have this field populated * The other options highlighed above should already be set, but if not, please make sure they are +* Note that if you are planning to use zmNinja and plan to use ZM authentication, you must also: + + * set ``AUTH_RELAY`` to hashed + * Enable ``AUTH_HASH_LOGINS`` + * Click on Save at the bottom and that's it! The next time you refresh that page, you will now be presented with a login screen. Job well done! .. image:: images/getting-started-login.png -.. NOTE:: The default login/password is "admin/admin" +.. note:: The default login/password is "admin/admin" -Switching to flat theme -^^^^^^^^^^^^^^^^^^^^^^^ -What you see is what is called a "classic" skin. Zoneminder has a host of configuration options that you can customize over time. This guide is meant to get you started the easiest possible way, so we will not go into all the details. However, it is worthwhile to note that Zoneminder also has a 'flat' theme that depending on your preferences may look more modern. So let's use that as an example of introducing you to the Options menu +Understanding the Web Console +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Before we proceed, lets spend a few minutes understanding the key functions of the web console. +For the sake of illustration, we are going to use a populated zoneminder configuration with several monitors and events. + +.. image:: images/getting-started-understand-console.png + +This screen is called the "console" screen in ZoneMinder and shows a summary of your monitors, associated events and more information. + +* **A**: The options menu lets you configure many aspects of ZoneMinder. Refer to :doc:`options`. +* **B**: This brings up a color coded log window that shows various system and component level logs. This window is useful if you are trying to diagnose issues. Refer to :doc:`logging`. +* **C**: ZoneMinder allows you to group monitors gor logical separation. This option lets you create new groups, associate monitors to them and edit/delete existing groups. +* **D**: Filters are a powerful mechanism to perform actions when certain conditions are met. ZoneMinder comes with some preset filters that keep a tab of disk space and others. Many users create their own filters for more advanced actions like sending emails when certain events occur and more. Refer to :doc:`filterevents`. +* **E**: The Cycle option allows you to rotate between live views of each cofigured monitor. +* **F**: The Montage option shows a collage of your monitors. You can customize them including moving them around. +* **G**: Montage Review allows you to simultaneously view past events for different monitors. Note that this is a very resource intensive page and its performance will vary based on your system capabilities. +* **H**: Audit Events Report is more of a power user feature. This option looks for recording gaps in events and recording issues in mp4 files. +* **I**: This is the user you are currently logged in as. +* **J**: ZoneMinder allows you to maintain "run states". If you click on the "Running" text, ZoneMinder brings up a popup that allows you to define additional "states" (referred to as runstates). A runstate is essentially a snapshot that records the state of each monitor and you can switch between states easily. For example, you might have a run state defined that switches all monitors to "monitor" mode in which they are not recording anything while another state that sets some of the monitors to "modect". Why would you want this? A great example is to disable recording when you are at home and enable when you are away, based on time of day or other triggers. You can switch states by selecting an appropriate state manually, or do it automatically via cron jobs, for example. An example of using cron to automatically switch is provided in the :ref:`FAQ `. More esoteric examples of switching run states based on phone location can be found `here `__. + + +Here is an example of multiple run states that I've defined. Each one of these runstates changes the mode of specific monitors depending on time of day and other conditions. Use your imagination to decide which conditions require state changes. + +.. image:: images/runstates.png + +* **K**: This line shows you system health information +* **L**: This defines how Zoneminder will record events. There are various modes. In brief Modect == record if a motion is detected,Record = always record 24x7, Mocord = always record PLUS detect motion, Monitor = just provide a live view but don't record anytime, Nodect = Don't record till an external entity via zmtrigger tells Zoneminder to (this is advanced usage). +* **M**: This is the "source" column that tells you the type of the camera - if its an IP camera, a USB camera or more. In this example, they are all IP cameras. Green means the monitor is running. Red means there is something wrong with that camera. +* **N**: This is the core of ZoneMinder - recording events. It gives you a count of how many events were recorded over the hour, day, week, month. +* **O**: These are the "Zones". Zones are areas within the camera that you mark as 'hotspots' for motion detection. Simply put, when you first configure your monitors (cameras), by default Zoneminder uses the entire field of view of the camera to detect motion. You may not want this. You may want to create "zones" specifically for detecting motion and ignore others. For example, lets consider a room with a fan that spins. You surely don't want to consider the fan moving continuously a reason for triggering a record? Probably not - in that case, you'd leave the fan out while making your zones. +* **P**: This is a "visual filter" which lets you 'filter' the console display based on text you enter. While this may not be particularly useful for small systems, ZoneMinder is also used in mega-installations will well over 200+ cameras and this visual filter helps reduce the monitors you are seeing at one time. + +Adding Monitors +^^^^^^^^^^^^^^^ +Now that we have a basic understanding of the web console, lets go about adding a new camera (monitor). For this example, lets assume we have an IP camera that streams RTSP at LAN IP address 192.168.1.33. + +.. sidebar:: Note + + This is meant to be a simple example. For a more detailed explanation of other options available when creating a monitor, please see :doc:`/userguide/definemonitor` + +The first thing we will need to know is how to access that camera's video feed. You will need to consult your camera's manual or check their forum. Zoneminder community users also have a frequently updated list right `here `__ that lists information about many cameras. If you don't find your list there and can't seem to find it elsewhere, feel free to register and ask in the `user forums `__. + +The camera we are using as an example here is a Foscam 9831W which is a 1280x960 RTSP camera, and the URL to access it's feed is *username:password@IPADDRESS:PORT/videoMain* + +Let's get started: + +Click on the "Add" button below: + +.. image:: images/getting-started-modern-look.png + :width: 600px + +This brings up the new monitor window: + +.. image:: images/getting-started-add-monitor-general.png + :width: 600px + +* We've given it a name of 'Garage', because, well, its better than Monitor-1 and this is my Garage camera. + +* There are various source types. As a brief introduction you'd want to use 'Local' if your camera is physically attached to your ZM server (like a USB camera, for example), and one of 'Remote', 'FFMpeg', 'Libvlc' or 'cURL' for a remote camera (not necessarily, but usually). For this example, let's go with 'FFMpeg'. + +.. note:: + As a thumb rule, if you have a camera accessible via IP and it does HTTP or RTSP, + start with FFMpeg first and libvlc if it doesn't work (:doc:`/userguide/definemonitor` + covers other modes in more details). If you are wondering what 'File' does, well, ZoneMinder was + built with compatibility in mind. Take a look at `this post + `__ to see how file can be used for leisure reading. + +* In this example, the Function is 'Modect', which means it will start recording if motion is detected on that camera feed. The parameters for what constitutes motion detected is specific in :doc:`definezone` + +* In Analytis FPS, we've put in 5FPS here. Note that you should not put an FPS that is greater than the camera FPS. In my case, 5FPS is sufficient for my needs + +.. note:: + Leave Maximum FPS and Alarm Maximum FPS **empty** if you are configuring an IP camera. In older versions of ZoneMinder, you were encouraged to put a value here, but that is no longer recommended. Infact, if you see your feed going much slower than the feed is supposed to go, or you get a lot of buffering/display issues, make sure this is empty. If you need to control camera FPS, please do it directly on the camera (via its own web interface, for example) + + +* We are done for the General tab. Let's move to the next tab + +.. image:: images/getting-started-add-monitor-source.png + :width: 800px + +* Let's select a protocol of RTSP and a remote method of RTP/RTSP (this is an RTSP camera) +* Note that starting ZM 1.34, GPUs are supported. In my case, I have an NVIDIA GeForce GTX1050i. These ``cuda`` and ``cuvid`` parameters are what my system supports to use the NVIDIA hardware decoder and GPU resources. If you don't have a GPU, or don't know how to configure your ffmpeg to support it, leave it empty for now. In future, we will add a section on how to set up a GPU + +.. todo:: + add GPU docs + +That's pretty much it. Click on Save. We are not going to explore the other tabs in this simple guide. + +You now have a configured monitor: + +.. image:: images/getting-started-add-monitor-modect-ready.png + + +And then, finally, to see if everything works, if you click on the garage monitor you just added, you should be able to see its live feed. If you don't, inspect your webserver logs and your ZoneMinder logs to see what is going on. + + +Switching to another theme +^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. todo:: + Fix theme text after I clearly understand that System->CSS is doing + +When you first install ZoneMinder, you see is what is called a "classic" skin. Zoneminder has a host of configuration options that you can customize over time. This guide is meant to get you started the easiest possible way, so we will not go into all the details. However, it is worthwhile to note that Zoneminder also has a 'flat' theme that depending on your preferences may look more modern. So let's use that as an example of introducing you to the Options menu * Click on the Options link on the top right of the web interface in the image above * This will bring you to the options window as shown below. Click on the "System" tab and then select the @@ -51,98 +163,6 @@ Congratulations! You now have a modern looking interface. .. image:: images/getting-started-modern-look.png -Understanding the Web Console -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Before we proceed, lets spend a few minutes understanding the key functions of the web console. -For the sake of illustration, we are going to use a populated zoneminder configuration with several monitors and events. -Obviously, this does not reflect your current web console - which is essentially void of any useful information till now, -as we are yet to add things. Let's take a small break and understand what the various functions are before we configure our -own empty screen. - -.. image:: images/getting-started-understand-console.png - -* **A**: This is the username that is logged in. You are logged in as 'admin' here -* **B**: Click here to explore the various options of ZoneMinder and how to configure them. You already used this to enable authentication and change style above. Over time, you will find this to have many other things you will want to customize. -* **C**: This link, when clicked, opens up a color coded log window of what is going on in Zoneminder and often gives you good insight into what is going wrong or right. Note that the color here is red - that is an indication that some error occurred in ZoneMinder. You should click it and investigate. -* **D**: This is the core of ZoneMinder - recording events. It gives you a count of how many events were recorded over the hour, day, week, month. -* **E**: These are the "Zones". Zones are areas within the camera that you mark as 'hotspots' for motion detection. Simply put, when you first configure your monitors (cameras), by default Zoneminder uses the entire field of view of the camera to detect motion. You may not want this. You may want to create "zones" specifically for detecting motion and ignore others. For example, lets consider a room with a fan that spins. You surely don't want to consider the fan moving continuously a reason for triggering a record? Probably not - in that case, you'd leave the fan out while making your zones. -* **F**: This is the "source" column that tells you the type of the camera - if its an IP camera, a USB camera or more. In this example, they are all IP cameras. Note the color red on item F ? Well that means there is something wrong with that camera. No wonder the log also shows red. Good indication for you to tap on logs and investigate -* **G**: This defines how Zoneminder will record events. There are various modes. In brief Modect == record if a motion is detected,Record = always record 24x7, Mocord = always record PLUS detect motion, Monitor = just provide a live view but don't record anytime, Nodect = Don't record till an external entity via zmtrigger tells Zoneminder to (this is advanced usage). -* **H**: If you click on these links you can view a "Montage" of all your configured monitors or cycle through each one -* **I**: One of the most often missed features is the ability of ZoneMinder to maintain "run states". If you click on the "Running" text, ZoneMinder brings up a popup that allows you to define additional "states" (referred to as runstates). A runstate is essentially a snapshot that records the state of each monitor and you can switch between states easily. For example, you might have a run state defined that switches all monitors to "monitor" mode in which they are not recording anything while another state that sets some of the monitors to "modect". Why would you want this? A great example is to disable recording when you are at home and enable when you are away, based on time of day or other triggers. You can switch states by selecting an appropriate state manually, or do it automatically via cron jobs, for example. An example of using cron to automatically switch is provided in the :ref:`FAQ `. More esoteric examples of switching run states based on phone location can be found `here `__. - -Here is an example of multiple run states that I've defined. Each one of these runstates changes the mode of specific monitors depending on time of day and other conditions. Use your imagination to decide which conditions require state changes. - -.. image:: images/runstates.png - - - -Adding Monitors -^^^^^^^^^^^^^^^ -Now that we have a basic understanding of the web console, lets go about adding a new camera (monitor). For this example, lets assume we have an IP camera that streams RTSP at LAN IP address 192.168.1.33. - -The first thing we will need to know is how to access that camera's video feed. You will need to consult your camera's manual or check their forum. Zoneminder community users also have a frequently updated list right `here `__ that lists information about many cameras. If you don't find your list there and can't seem to find it elsewhere, feel free to register and ask in the `user forums `__. - -The camera we are using as an example here is a Foscam 9831W which is a 1280x960 RTSP camera, and the URL to access it's feed is *username:password@IPADDRESS:PORT/videoMain* - -Let's get started: - -Click on the "Add new monitor" button below: - -.. image:: images/getting-started-modern-look.png - -This brings up the new monitor window: - -.. image:: images/getting-started-add-monitor-general.png - :width: 800px - -* We've given it a name of 'Garage', because, well, its better than Monitor-1 and this is my Garage camera. - -* There are various source types. As a brief introduction you'd want to use 'Local' if your camera is physically attached to your ZM server (like a USB camera, for example), and one of 'Remote', 'FFMpeg', 'Libvlc' or 'cURL' for a remote camera (not necessarily, but usually). For this example, let's go with 'Remote'. - -.. NOTE:: - As a thumb rule, if you have a camera accessible via IP and it does HTTP or RTSP, - start with Remote, then try FFMpeg and libvlc if it doesn't work (:doc:`/userguide/definemonitor` - covers other modes in more details). If you are wondering what 'File' does, well, ZoneMinder was - built with compatibility in mind. Take a look at `this post - `__ to see how file can be used for leisure reading. - -* Let's leave the Function as 'Monitor' just so we can use this as an example to change it later another way. Practically, feel free to select your mode right now - Modect, Record etc depending on what you want ZoneMinder to do with this camera - -* We've put in MaxFPS and AlarmFPS as 20 here. **You can leave this empty too**. Whatever you do here, *it's important to make sure these values are higher than the FPS of the camera*. The reason we've added a value here is that as of Aug 2015, if a camera goes offline, ZoneMinder eats up a lot of CPU trying to reach it and putting a larger value here than the actual FPS helps in that specific situation. - -.. NOTE:: - We strongly recommend not putting in a lower FPS here that the one configured inside your camera. - Zoneminder should not be used to manage camera frame rate. That always causes many problems. It's - much better you set the value directly in-camera and either leave this blank or specify a higher FPS - here. In this case, our actual camera FPS is 3 and we've set this value here to 10. - -* We are done for the General tab. Let's move to the next tab - -.. image:: images/getting-started-add-monitor-source.png - :width: 800px - -* Let's select a protocol of RTSP and a remote method of RTP/RTSP (this is an RTSP camera) -* The other boxes are mostly self-explanatory - -That's pretty much it. Click on Save. We are not going to explore the other tabs in this simple guide. - -You now have a configured monitor: - -.. image:: images/getting-started-add-monitor-orange.png - -If you want to change its mode from Monitor to say, Modect (Motion Detect), later all you need to do is click on the Function column that says 'Monitor' and change it to 'Modect' like so: - - -.. image:: images/getting-started-add-monitor-modect.png - -and we now have: - -.. image:: images/getting-started-add-monitor-modect-ready.png - -And then, finally, to see if everything works, lets click on the monitor name ('Garage' in this example) and that should bring up a live feed just like this: - -.. image:: images/getting-started-add-monitor-live.png Conclusion diff --git a/docs/userguide/images/filter-button.png b/docs/userguide/images/filter-button.png deleted file mode 100644 index a480b1900..000000000 Binary files a/docs/userguide/images/filter-button.png and /dev/null differ diff --git a/docs/userguide/images/filter-filterview.png b/docs/userguide/images/filter-filterview.png index 561996668..e09f34b4d 100644 Binary files a/docs/userguide/images/filter-filterview.png and b/docs/userguide/images/filter-filterview.png differ diff --git a/docs/userguide/images/filter-save.png b/docs/userguide/images/filter-save.png deleted file mode 100644 index 96db574c6..000000000 Binary files a/docs/userguide/images/filter-save.png and /dev/null differ diff --git a/docs/userguide/images/getting-started-add-monitor-general.png b/docs/userguide/images/getting-started-add-monitor-general.png index 9b722907d..cf4c93487 100644 Binary files a/docs/userguide/images/getting-started-add-monitor-general.png and b/docs/userguide/images/getting-started-add-monitor-general.png differ diff --git a/docs/userguide/images/getting-started-add-monitor-live.png b/docs/userguide/images/getting-started-add-monitor-live.png deleted file mode 100644 index a1d7f4100..000000000 Binary files a/docs/userguide/images/getting-started-add-monitor-live.png and /dev/null differ diff --git a/docs/userguide/images/getting-started-add-monitor-modect-ready.png b/docs/userguide/images/getting-started-add-monitor-modect-ready.png index 338a0e097..fcac21140 100644 Binary files a/docs/userguide/images/getting-started-add-monitor-modect-ready.png and b/docs/userguide/images/getting-started-add-monitor-modect-ready.png differ diff --git a/docs/userguide/images/getting-started-add-monitor-modect.png b/docs/userguide/images/getting-started-add-monitor-modect.png deleted file mode 100644 index bc6795b37..000000000 Binary files a/docs/userguide/images/getting-started-add-monitor-modect.png and /dev/null differ diff --git a/docs/userguide/images/getting-started-add-monitor-orange.png b/docs/userguide/images/getting-started-add-monitor-orange.png deleted file mode 100644 index 9d5e227aa..000000000 Binary files a/docs/userguide/images/getting-started-add-monitor-orange.png and /dev/null differ diff --git a/docs/userguide/images/getting-started-add-monitor-source.png b/docs/userguide/images/getting-started-add-monitor-source.png index e8b19925e..a3b9324f5 100644 Binary files a/docs/userguide/images/getting-started-add-monitor-source.png and b/docs/userguide/images/getting-started-add-monitor-source.png differ diff --git a/docs/userguide/images/getting-started-audit-event.png b/docs/userguide/images/getting-started-audit-event.png new file mode 100644 index 000000000..91e1386d8 Binary files /dev/null and b/docs/userguide/images/getting-started-audit-event.png differ diff --git a/docs/userguide/images/getting-started-enable-auth.png b/docs/userguide/images/getting-started-enable-auth.png index 9160ffecc..ec376c478 100644 Binary files a/docs/userguide/images/getting-started-enable-auth.png and b/docs/userguide/images/getting-started-enable-auth.png differ diff --git a/docs/userguide/images/getting-started-login.png b/docs/userguide/images/getting-started-login.png index d981048c0..6b6c8e05d 100644 Binary files a/docs/userguide/images/getting-started-login.png and b/docs/userguide/images/getting-started-login.png differ diff --git a/docs/userguide/images/getting-started-modern-look.png b/docs/userguide/images/getting-started-modern-look.png index 34dbcdfc8..6cb62718c 100644 Binary files a/docs/userguide/images/getting-started-modern-look.png and b/docs/userguide/images/getting-started-modern-look.png differ diff --git a/docs/userguide/images/getting-started-timezone.png b/docs/userguide/images/getting-started-timezone.png new file mode 100644 index 000000000..e372eb8b0 Binary files /dev/null and b/docs/userguide/images/getting-started-timezone.png differ diff --git a/docs/userguide/images/getting-started-understand-console.png b/docs/userguide/images/getting-started-understand-console.png index f332b4977..89c735992 100644 Binary files a/docs/userguide/images/getting-started-understand-console.png and b/docs/userguide/images/getting-started-understand-console.png differ diff --git a/docs/userguide/images/viewevents-stream.png b/docs/userguide/images/viewevents-stream.png index 672a74e4d..a1448e0bc 100644 Binary files a/docs/userguide/images/viewevents-stream.png and b/docs/userguide/images/viewevents-stream.png differ diff --git a/docs/userguide/images/viewmonitor-main.png b/docs/userguide/images/viewmonitor-main.png index 74354f0b0..80791ebb6 100644 Binary files a/docs/userguide/images/viewmonitor-main.png and b/docs/userguide/images/viewmonitor-main.png differ diff --git a/docs/userguide/images/viewmonitor-stream.png b/docs/userguide/images/viewmonitor-stream.png index 126a67bb2..58c35952c 100644 Binary files a/docs/userguide/images/viewmonitor-stream.png and b/docs/userguide/images/viewmonitor-stream.png differ diff --git a/docs/userguide/images/zm-system-overview.jpg b/docs/userguide/images/zm-system-overview.jpg index 32f281b2a..61594a337 100644 Binary files a/docs/userguide/images/zm-system-overview.jpg and b/docs/userguide/images/zm-system-overview.jpg differ diff --git a/docs/userguide/images/zm-system-overview.xml b/docs/userguide/images/zm-system-overview.xml index 27eec2631..8cbd3b3ca 100644 --- a/docs/userguide/images/zm-system-overview.xml +++ b/docs/userguide/images/zm-system-overview.xml @@ -1 +1 @@ -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 \ No newline at end of file +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 \ No newline at end of file diff --git a/docs/userguide/index.rst b/docs/userguide/index.rst index 35bfcf39d..905a87292 100644 --- a/docs/userguide/index.rst +++ b/docs/userguide/index.rst @@ -15,4 +15,5 @@ User Guide cameracontrol mobile logging + configfiles diff --git a/docs/userguide/logging.rst b/docs/userguide/logging.rst index 4256079ae..a6dfdb0c0 100644 --- a/docs/userguide/logging.rst +++ b/docs/userguide/logging.rst @@ -1,18 +1,33 @@ Logging ======= -Most components of ZoneMinder can emit informational, warning, error and debug messages in a standard format. These messages can be logged in one or more locations. By default all messages produced by scripts are logged in