Difference between revisions of "SMS Notifications"

From ZoneMinder Wiki
Jump to navigationJump to search
 
(47 intermediate revisions by 2 users not shown)
Line 1: Line 1:
These instructions are to assist with email or text message setup.
These are general email instructions. Eventually I will merge them to the Email page.


For SMS, You setup email to point to a [https://en.wikipedia.org/wiki/List_of_SMS_gateways text gateway]. Setup a filter that monitors the cameras for alarms, and when an alarm
For SMS, You setup email to point to a [https://en.wikipedia.org/wiki/List_of_SMS_gateways text gateway]. Setup a filter that monitors the cameras for alarms, and when an alarm
Line 6: Line 6:
You can get images from the alarm embedded in the text (covered in install steps).
You can get images from the alarm embedded in the text (covered in install steps).


The following is tested for 1.30, and 1.34.
The following is used in 1.36 / Debian 10 and newer.


== Installation ==
== Installation ==
Line 13: Line 13:


There are two ways to send emails in options - email. One is sending a short email, and one is designed for longer messages. In the code (as of 1.30 lines 818 and 918), in zmfilter.pl these are correspondingly sub SendEmail and sub SendMessage. They are distinct functions. SSMTP/MSMTP support is in SendEmail but not in SendMessage.
There are two ways to send emails in options - email. One is sending a short email, and one is designed for longer messages. In the code (as of 1.30 lines 818 and 918), in zmfilter.pl these are correspondingly sub SendEmail and sub SendMessage. They are distinct functions. SSMTP/MSMTP support is in SendEmail but not in SendMessage.
=== MSMTP Specific Install ===
Debian 10 and newer should use MSMTP.
apt-get install msmtp msmtp-mta mutt


=== Testing the email ===
=== Testing the email ===
Line 18: Line 22:
First test via terminal outside of ZM. Confirm it is working there. Example configurations and calls can be found at: https://wiki.debian.org/msmtp and https://wiki.archlinux.org/index.php/MSMTP (for msmtp).
First test via terminal outside of ZM. Confirm it is working there. Example configurations and calls can be found at: https://wiki.debian.org/msmtp and https://wiki.archlinux.org/index.php/MSMTP (for msmtp).


Once you get a working /etc/msmtprc configuration, try:
echo "hello" | msmtp -a default user@email.com
Watch out for the following:
* Make sure app-armor is disabled for msmtp. The following commands will help: apt install apparmor-utils and then aa-disable /etc/apparmor.d/usr.bin.msmtp
=== Testing the email in Zoneminder ===
Then:
Then:
# run a filter in the background (see tips below) or execute.  
# run a filter in the background (see tips below) or execute.  
Line 28: Line 39:
=== Tips ===
=== Tips ===


* Free email services limit how many emails you are allowed to send through SMTP. It helps to disable cron emails.
* Free email services may limit how many emails you are allowed to send.


* Always make filters for 1 (or low number) results. If you fail to do this, you could try to send dozens of emails.
* Always make filters for 1 (or low number) results. If you fail to do this, you could try to send dozens of emails.
Line 36: Line 47:
* If when testing the filter execute, the 'execute' button becomes unclickable, uncheck then recheck the email option.
* If when testing the filter execute, the 'execute' button becomes unclickable, uncheck then recheck the email option.


<pre>
* If you send email as someone other than root you may need to include the user in revaliases.
#watch "tail -n 30000 /var/log/syslog | grep sSMTP | tail"
</pre>


* When testing use a background filter, and watch the logs. Filters run every 60 seconds by default.
* test email attachments with one of these:
 
* If you send email as someone other than root, make sure he is in /etc/ssmtp/revaliases
 
* test emails with  
<pre>
<pre>
cat file | mail -s "subject" destination@email.com
OR
echo "some text" | mail -s "subject destination@email.com
FOR ATTACHMENTS:
echo hello | mail -A /dir/to/attachment.log -s "email with file" destination@email.com
echo hello | mail -A /dir/to/attachment.log -s "email with file" destination@email.com
OR
Also try mutt (slightly different)
mutt -a /dir/to/attachment.log -s "email with file" -- destination@email.com
mutt -a /dir/to/attachment.log -s "email with file" -- destination@email.com
echo "test" | mutt -d 5 -s "Test Email" user@email.com -a /tmp/file_attachment
</pre>
</pre>


* make sure email is checked off in filters. It gets unchecked easily.
* make sure email is checked off in filters.  
 
* service zoneminder restart after changes (NOTE: this wasn't required for just setting email settings in ZM options 07/2020).


* test setting off alarms by clicking 'force alarm' in the monitor view, then unclick to remove alarm.
* service zoneminder restart may be needed after changes (depends upon ZM version)


* make one dedicated email alert account if you want multiple users to receive alerts. There is a patch in the forums to add multiple recipients.
* test setting off alarms by clicking 'force alarm' in the camera monitor view, then unclick to remove alarm.


* It's tough to use Motion detection for alerts with IR active.. You might be best off using a device with ZMTrigger, or the cameras built in motion detection if night IR is used... False alerts appear when a camera switches from Day lens to IR.
* If you find false alerts with motion detection, consider using either ZMES, or passing the event to an object detection based script.


* Always double check the filters are right, AFTER you save them.
* Always double check the filters are right, AFTER you save them.
Line 70: Line 68:
* Once an email has been sent for an event, that event is marked and an email for it '''won't be sent again'''[https://forums.zoneminder.com/viewtopic.php?f=8&t=7774&p=27386&].
* Once an email has been sent for an event, that event is marked and an email for it '''won't be sent again'''[https://forums.zoneminder.com/viewtopic.php?f=8&t=7774&p=27386&].


====SSMTP Specific Tips====
* Cron may require setting an environment variable of EMAIL=sendingaddress@email.com in the crontab. When testing this from the shell, you must do the same but with export, e.g. "export EMAIL=sendingaddress@email.com"
 
=== Example Filter ===


* ssmtp.conf has issues with special characters in AuthPass. Do not use special characters for your password.
See [[Filters]]


* Add DEBUG=yes to ssmtp.conf to see full email logs in syslog
=== Send email if only on a certain runstate (Filter on Run States) ===


* If SSMTP is unable to connect, there may be a two minute timeout before it reports unable to connect. If it seems like ssmtp has frozen, wait before closing out of it, if you want its logs.
Notifications are easy if you want alarms emailed between a static time, for example between 12AM and 6AM. If you have a situation where you may not want the alarms to send you text messages on occasion, you can filter on run states.  


* Don't forget to change revaliases as needed. it should match ssmtp.conf
Starting from [http://www.github.com/zoneminder/zoneminder/issues/1750 (ZM > 1.30.4)]  you can set filters based on run states, which means you can change the run state at any desired time (using [[Cron]], or manually), and only if a runstate matches the filter will SMS be sent.  


* Expert: Manually test email server connections with something like
Note that in the author's opinion, run states can become unwieldy for large installations. It's best used with smaller setups only.
 
== Examples of Emails for Monitoring ==
=== Send Email if ZM is Not Running ===
Here is a minimal script to check that Zoneminder is running. Note that this does not check for mysql errors or hard drive errors (which are possible). Do not put any spaces in the subject or email. Also, you may want to monitor that the server is actually powered on, from another computer (as if the server shuts down for any reason, this will obviously not run).
<pre>
<pre>
openssl s_client -debug -starttls smtp -crlf -connect smtp.emailprovider.com:465
#!/bin/bash
then continue with
 
EHLO hostname
 
AUTH
SUBJECT="Name_of_server_ZM"
etc...
EMAIL="emailaddress"
 
/etc/init.d/zoneminder status 2> /dev/null
if test $? -ne 0 ; then
        echo "Detected ZM not running"
        echo "ZM is not running" | mutt -s $SUBJECT $EMAIL
else
        echo "ZM is running, do nothing"
fi
</pre>
</pre>


* ssmtp supports only auth login, and cram-md5. If you have digest-md5 or auth plain at your email server it will likely not work. Test manually using the commands above to verify this.
alt.
<pre>
#usage: feed $1 subject
zmdc.pl check | grep stopped
if [ $? -eq 0 ]; then
#send email
  echo "ZM is not running" | mutt -s $1 email@address.com
else
  echo "do nothing"
fi
</pre>
===Send Email if MySQL is Not Running===
<pre>
#usage: feed $1 subject
mysqladmin processlist | grep zmuser
#returns 0 if zmuser detected
if [ $? -eq 0 ]; then
#send email
  echo "do nothing"
else
  echo "mysql is not running" | mutt -s $1 user@address.com
fi


* Test ssmtp manually with $ssmtp -vvvvv email@address.com < msg.txt ([https://wiki.archlinux.org/index.php/SSMTP#Sending_email example message]) (though DEBUG=yes has more information)
</pre>


* SSMTP is lacking some authentication methods and is abandoned as of 07/2020, therefore MSMTP is recommended.
=== Send Email if HDD Fails ===
<br>
This script will give you 1 email an hour, if a hdd has an error. This is an alternative way of checking hdd status instead of S.M.A.R.T. .
<br>
<pre>
<br>
#!/bin/bash
# 20 * * * *  root /root/hdderror.sh (this script, and the root assumes you are using /etc/crontab)
# must run as root for access to dmesg in debian
# chmod +x


====MSMTP Specific Tips====
LOGFILE=/root/file.log
SUBJECT="e.g._Home_Camera_System_HDD_Error"


* MSMTP has been tested to work as an alternative to SSMTP (but configured identically) in Debian Buster / Devuan 3.
echo "" > $LOGFILE
* Apparmor can impede msmtp logging on Buster (07/2020).
* msmtp can use mutt to send attachments. (ssmtp above was setup with mailutils). See below:


Compare these cronjobs
# any text of "error" with regards to sda,sdb, etc that isn't a remount
dmesg | grep -e sda -e sdb -e sdc -e sdd -e sde | grep -i error | grep -v remount >> $LOGFILE
#returns 1 if nothing


'''ssmtp/mailutils:'''
if [ $? -eq 0 ]; then
<code>0 1 1 * * echo hello  | mail -A /cameras/report.log -s "ZM Report Log"  user@email.com</code>
#send email
  echo "HDD Error..." | mutt -s $SUBJECT destination@email.com -a $LOGFILE
  echo "email sent"
else
  echo "do nothing"
fi
</pre>


'''msmtp/mutt:'''
=== Send Email if Camera is Offline ===
<code>0 1 1 * * echo hello  | mutt -a /cameras/report.log -s "ZM Report Log" -- user@email.com</code>
This script will ping an ip address 10 times, then if there is an error, it will try again 10 more times. If it still cannot connect, an email will be sent. There is a lock file, so that only one email is sent every couple hours.
<br>
<pre>
<br>
#!/bin/bash
<br>


=== Example Filter ===
SERVERIP=$1
LOGFILE=$1_$(date +%A)_LOG
HISTORYFILE=$1_$(date +%A)_LOCKFILE
NOTIFYEMAIL=email_address


For monitoring on the weekend you might have
#setup this script in cron once an hour (or as frequent as you want), and also
#crontab requires historyfile / lockfile to be blanked (echo "" > file) each day or each hour, whatever you prefer.
#make the log directory:
#mkdir /var/log/networkalerts
#this script will run like this:
#e.g. $ test_up.sh <ipaddress> (test_up is this script)
# in /etc/crontab
#0 * * * *  root /root/test_up.sh 192.168.1.1
#0 */5 * * * root rm /var/log/networkalerts/*LOCKFILE
#0 0 * * *  root rm /var/log/networkalerts/*$(date +%A)*LOG


<pre>
#check for lock file
date/time greater than or equal to -1 minute AND
if test -s /var/log/networkalerts/$HISTORYFILE
alarm frames greather than or equal to 1 AND
then
Weekday equal to Saturday OR
exit
Weekday equal to Sunday AND
fi
alarm frames greater than or equal to 1 AND
date/time greater than or equal to -1 minute
</pre>


Notice that you must include all parameters for each group/set individually when there is an OR.
#keep track of time
date >> /var/log/networkalerts/$LOGFILE
ping -c 10 $SERVERIP >> /var/log/networkalerts/$LOGFILE
#if return val is error 1 (but not 2) (see man on ping regarding count and deadline)(success return is zero)
if test $? == 1
  then
  sleep 60
else
exit
fi


== Send email if only on a certain runstate (Filter on Run States) ==
#reduce false alerts, run it once again to be certain.
ping -c 10 $SERVERIP >> /var/log/networkalerts/$LOGFILE
  if test $? == 1
  then
    echo "$SERVERIP is down" | msmtp -a default $NOTIFYEMAIL
    #lock file / history file
    echo "alertsent" > /var/log/networkalerts/$HISTORYFILE
else
exit
fi


Notifications are easy if you want alarms emailed between a static time, for example between 12AM and 6AM. If you have a situation where you may not want the alarms to send you text messages on occasion, you can filter on run states.
</pre>


Starting from [http://www.github.com/zoneminder/zoneminder/issues/1750 (ZM > 1.30.4)]  you can set filters based on run states, which means you can change the run state at any desired time (using [[Cron]], or manually), and only if a runstate matches the filter will SMS be sent.
</pre>


Note that in the author's opinion, run states can become unwieldy for large installations. It's best used with smaller setups only.
=== Basic Server Monitor ===
These would go in /etc/crontab. You might run this once a week, to monitor a server.
<pre>
1 0 * * 1 root dmesg | tail -10 > /tmp/hdd_report
2 0 * * 1 root lsblk  >> /tmp/hdd_report
3 0 * * 1 root ls -lt /videos/ >> /tmp/hdd_report
4 0 * * 1 root df -h >> /tmp/hdd_report
5 0 * * 1 root echo "zm server" | mutt -s "zm server" user@email.com -a /tmp/hdd_report
</pre>
==Troubleshooting==
===Error sending message, child exited 127 (Exec error.).===
If when sending something like the following you get the above error:
echo "message" | mutt  -s "cameras_email" user@email -a /tmp/attachment.txt
Error sending message, child exited 127 (Exec error.).
You need to install msmtp-mta.


==Resources==
==Resources==


 
* [[Email]]
* [http://zoneminder.readthedocs.io/en/latest/faq.html#how-can-i-get-zm-to-do-different-things-at-different-times-of-day-or-week ZM FAQ: How can I get ZM to do different things at different times of day or week]
* [http://zoneminder.readthedocs.io/en/latest/faq.html#how-can-i-get-zm-to-do-different-things-at-different-times-of-day-or-week ZM FAQ: How can I get ZM to do different things at different times of day or week]
* [http://wiki.zoneminder.com/Instant_Notification Instant Notification]
* [http://wiki.zoneminder.com/Instant_Notification Instant Notification]
Line 149: Line 232:
* [https://forums.zoneminder.com/viewtopic.php?f=9&t=12646 Receive Email on Runstate change]
* [https://forums.zoneminder.com/viewtopic.php?f=9&t=12646 Receive Email on Runstate change]
* [https://forums.zoneminder.com/viewtopic.php?f=40&t=29755&p=116634#p116634]
* [https://forums.zoneminder.com/viewtopic.php?f=40&t=29755&p=116634#p116634]
* https://linux.die.net/man/8/logcheck - logcheck / logfile scanner.
[[Category:Dummies_Guide]]

Latest revision as of 02:54, 10 December 2024

These are general email instructions. Eventually I will merge them to the Email page.

For SMS, You setup email to point to a text gateway. Setup a filter that monitors the cameras for alarms, and when an alarm is set off you have it send an email to the text gateway (or email address). Simple.

You can get images from the alarm embedded in the text (covered in install steps).

The following is used in 1.36 / Debian 10 and newer.

Installation

Follow How to get ssmtp working with Zoneminder.

There are two ways to send emails in options - email. One is sending a short email, and one is designed for longer messages. In the code (as of 1.30 lines 818 and 918), in zmfilter.pl these are correspondingly sub SendEmail and sub SendMessage. They are distinct functions. SSMTP/MSMTP support is in SendEmail but not in SendMessage.

MSMTP Specific Install

Debian 10 and newer should use MSMTP.

apt-get install msmtp msmtp-mta mutt

Testing the email

First test via terminal outside of ZM. Confirm it is working there. Example configurations and calls can be found at: https://wiki.debian.org/msmtp and https://wiki.archlinux.org/index.php/MSMTP (for msmtp).

Once you get a working /etc/msmtprc configuration, try:

echo "hello" | msmtp -a default user@email.com

Watch out for the following:

  • Make sure app-armor is disabled for msmtp. The following commands will help: apt install apparmor-utils and then aa-disable /etc/apparmor.d/usr.bin.msmtp

Testing the email in Zoneminder

Then:

  1. run a filter in the background (see tips below) or execute.
  2. Enable logging on /var/log/zm folder.
  3. tail the ZMFilter log and syslog.
  4. to initiate an alarm (if alarms are used to test emails), use 'force alarm' on the monitor screen. That is, view a camera, and click force alarm.

You should see SSMTP send an email on the syslog (or try) and the zmfilter log will report the trigger.

Tips

  • Free email services may limit how many emails you are allowed to send.
  • Always make filters for 1 (or low number) results. If you fail to do this, you could try to send dozens of emails.
  • When you make the filter you want the 'current' alarms. You don't want old events. This is accomplished with a Date/Time greater than or equal to -1 minute.
  • If when testing the filter execute, the 'execute' button becomes unclickable, uncheck then recheck the email option.
  • If you send email as someone other than root you may need to include the user in revaliases.
  • test email attachments with one of these:
echo hello | mail -A /dir/to/attachment.log -s "email with file" destination@email.com
mutt -a /dir/to/attachment.log -s "email with file" -- destination@email.com
echo "test" | mutt -d 5 -s "Test Email" user@email.com -a /tmp/file_attachment
  • make sure email is checked off in filters.
  • service zoneminder restart may be needed after changes (depends upon ZM version)
  • test setting off alarms by clicking 'force alarm' in the camera monitor view, then unclick to remove alarm.
  • If you find false alerts with motion detection, consider using either ZMES, or passing the event to an object detection based script.
  • Always double check the filters are right, AFTER you save them.
  • Once an email has been sent for an event, that event is marked and an email for it won't be sent again[1].
  • Cron may require setting an environment variable of EMAIL=sendingaddress@email.com in the crontab. When testing this from the shell, you must do the same but with export, e.g. "export EMAIL=sendingaddress@email.com"

Example Filter

See Filters

Send email if only on a certain runstate (Filter on Run States)

Notifications are easy if you want alarms emailed between a static time, for example between 12AM and 6AM. If you have a situation where you may not want the alarms to send you text messages on occasion, you can filter on run states.

Starting from (ZM > 1.30.4) you can set filters based on run states, which means you can change the run state at any desired time (using Cron, or manually), and only if a runstate matches the filter will SMS be sent.

Note that in the author's opinion, run states can become unwieldy for large installations. It's best used with smaller setups only.

Examples of Emails for Monitoring

Send Email if ZM is Not Running

Here is a minimal script to check that Zoneminder is running. Note that this does not check for mysql errors or hard drive errors (which are possible). Do not put any spaces in the subject or email. Also, you may want to monitor that the server is actually powered on, from another computer (as if the server shuts down for any reason, this will obviously not run).

#!/bin/bash


SUBJECT="Name_of_server_ZM"
EMAIL="emailaddress"

/etc/init.d/zoneminder status 2> /dev/null
if test $? -ne 0 ; then
        echo "Detected ZM not running"
        echo "ZM is not running" | mutt -s $SUBJECT $EMAIL
else
        echo "ZM is running, do nothing"
fi

alt.

#usage: feed $1 subject 
zmdc.pl check | grep stopped
if [ $? -eq 0 ]; then
#send email
  echo "ZM is not running" | mutt -s $1 email@address.com
else
  echo "do nothing"
fi

Send Email if MySQL is Not Running

#usage: feed $1 subject 
mysqladmin processlist | grep zmuser
#returns 0 if zmuser detected
if [ $? -eq 0 ]; then
#send email
  echo "do nothing"
else
  echo "mysql is not running" | mutt -s $1 user@address.com
fi

Send Email if HDD Fails

This script will give you 1 email an hour, if a hdd has an error. This is an alternative way of checking hdd status instead of S.M.A.R.T. .

#!/bin/bash
# 20 * * * *   root /root/hdderror.sh (this script, and the root assumes you are using /etc/crontab)
# must run as root for access to dmesg in debian
# chmod +x 

LOGFILE=/root/file.log
SUBJECT="e.g._Home_Camera_System_HDD_Error"

echo "" > $LOGFILE

# any text of "error" with regards to sda,sdb, etc that isn't a remount
dmesg | grep -e sda -e sdb -e sdc -e sdd -e sde | grep -i error | grep -v remount >> $LOGFILE
#returns 1 if nothing

if [ $? -eq 0 ]; then
#send email
  echo "HDD Error..." | mutt -s $SUBJECT destination@email.com -a $LOGFILE
  echo "email sent"
else
  echo "do nothing"
fi

Send Email if Camera is Offline

This script will ping an ip address 10 times, then if there is an error, it will try again 10 more times. If it still cannot connect, an email will be sent. There is a lock file, so that only one email is sent every couple hours.

#!/bin/bash 

SERVERIP=$1
LOGFILE=$1_$(date +%A)_LOG
HISTORYFILE=$1_$(date +%A)_LOCKFILE
NOTIFYEMAIL=email_address

#setup this script in cron once an hour (or as frequent as you want), and also
#crontab requires historyfile / lockfile to be blanked (echo "" > file) each day or each hour, whatever you prefer.
#make the log directory:
#mkdir /var/log/networkalerts
#this script will run like this:
#e.g. $ test_up.sh <ipaddress> (test_up is this script)
# in /etc/crontab
#0 * * * *   root /root/test_up.sh 192.168.1.1
#0 */5 * * * root rm /var/log/networkalerts/*LOCKFILE
#0 0 * * *   root rm /var/log/networkalerts/*$(date +%A)*LOG

#check for lock file
if test -s /var/log/networkalerts/$HISTORYFILE
 then
 exit
fi

#keep track of time
date >> /var/log/networkalerts/$LOGFILE
ping -c 10 $SERVERIP >> /var/log/networkalerts/$LOGFILE
#if return val is error 1 (but not 2) (see man on ping regarding count and deadline)(success return is zero)
if test $? == 1
  then
  sleep 60
 else
exit
fi

#reduce false alerts, run it once again to be certain.
ping -c 10 $SERVERIP >> /var/log/networkalerts/$LOGFILE
   if test $? == 1
   then
    echo "$SERVERIP is down" | msmtp -a default $NOTIFYEMAIL
    #lock file / history file
    echo "alertsent" > /var/log/networkalerts/$HISTORYFILE
 else
 exit
fi

Basic Server Monitor

These would go in /etc/crontab. You might run this once a week, to monitor a server.

1 0 * * 1 root dmesg | tail -10 > /tmp/hdd_report
2 0 * * 1 root lsblk  >> /tmp/hdd_report
3 0 * * 1 root ls -lt /videos/ >> /tmp/hdd_report
4 0 * * 1 root df -h >> /tmp/hdd_report
5 0 * * 1 root echo "zm server" | mutt -s "zm server" user@email.com -a /tmp/hdd_report

Troubleshooting

Error sending message, child exited 127 (Exec error.).

If when sending something like the following you get the above error:

echo "message" | mutt  -s "cameras_email" user@email -a /tmp/attachment.txt
Error sending message, child exited 127 (Exec error.).

You need to install msmtp-mta.

Resources