-
-
Notifications
You must be signed in to change notification settings - Fork 59
Tutorial AlertClientRaspberryPi Siren
(For version 1.000)
This tutorial describes the basic configuration of the AlertR Alert Client Raspberry Pi with a connected siren. It can be used as foundation to develop an own AlertR system setup. This tutorial assumes you have set up the AlertR Server according to the provided Server Tutorial.
The client is described as the following by the installation:
sqall@towel:~$ ./alertRinstaller.py -l
[...]
AlertR Alert Client Raspberry Pi
--------------------------------
Instance:
alertClientRaspberryPi
Type:
alert
Version:
0.901-0
Dependencies:
1: requests (pip packet: requests) (lowest version: 2.20.0)
2: RPi.GPIO (pip packet: RPi.GPIO) (lowest version: 0.5.2)
Description:
This client handles triggered alerts and is written to set/unset GPIO pins of a Raspberry Pi. This means it gets notified by the server if a sensor was triggered and can set/unset configured GPIO pins, for example, to activate a siren. However, the sensor can also just be used as a switch and the configured alert can switch on and off the configured GPIO pins.
[...]
In order to install the AlertR Alert Client Raspberry Pi, we first have to fulfill all prerequisites. On a Debian/Ubuntu Linux you can install everything with the following commands:
root@towel:/home/sqall# apt-get install python3-pip
root@towel:/home/sqall# pip install RPi.GPIO requests
Obviously, the AlertR Alert Client Raspberry Pi should be installed on a Raspberry Pi. Please note that older versions of the Raspberry Pi packages need root
permissions in order to access the GPIO pins. If you are installing the AlertR instance on an older Raspberry Pi operating system with older packages, make sure it works without root
permissions before creating a new user account for the AlertR instance. If it only works with root
permissions, please omit all steps that use the new alertr
user and instead use the root
user account.
It is always a good idea to have an own user for a daemon. Therefore, we create a user that runs the AlertR Alert Client Raspberry Pi called alertr
:
root@towel:/home/sqall# adduser --disabled-password alertr
Adding user `alertr' ...
Adding new group `alertr' (1002) ...
Adding new user `alertr' (1002) with group `alertr' ...
Creating home directory `/home/alertr' ...
Copying files from `/etc/skel' ...
Changing the user information for alertr
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
Additionally, the user has to be in the group gpio
in order to access the GPIO pins:
root@towel:/home/sqall# addgroup alertr gpio
To switch into this user in the terminal you can use the following command:
root@towel:/home/sqall# su alertr
Please note that this is only possible as root user. If you are trying this command as another user you will get a password prompt for the user alertr, which does not have a password.
Afterwards, you can use the installation script provided by AlertR to install the client.
alertr@towel:~$ wget https://raw.githubusercontent.com/sqall01/alertR/master/alertRinstaller.py
alertr@towel:~$ mkdir alertClientRaspberryPi
alertr@towel:~$ chmod 755 alertRinstaller.py
alertr@towel:~$ ./alertRinstaller.py -i alertClientRaspberryPi -t ./alertClientRaspberryPi/
This tutorial connects a homemade siren to the Raspberry Pi. This can be useful if you want a loud alarm sound if some sensors are triggered, for example, an intruder tries to break in.
The circuit diagram to connect a relay to the Raspberry Pi which switches on a siren looks like this:
When soldering everything to a board, it looks something like this:
When you connect everything to the Raspberry Pi, it looks like this:
Please do not wonder, because the siren is too loud I placed duct tape on it while testing.
If you want to place everything in a case the final setting looks like this:
Let us assume for this tutorial, the relay switch is connected to GPIO pin 11. A picture of the pin numbers can be found on this website (for the Raspberry Pi Model B/B+). The pin number is the actual number of the pin and not the name of the pin (since the name changes depending on the used Raspberry Pi revision). This means on the picture, the GPIO pin 11 is the one with the name "GPIO17".
One important note that you should consider is that the GPIO pin you choose should not be set to high
per default. This is often the case for GPIO pins that are used for special purposes by the Raspberry Pi. When you do this, then the relay switch will turn on when your Raspberry Pi starts up or powers down. As a result, the siren will turn on each time you stop the AlertR Alert Client Raspberry Pi (for example when restarting the Raspberry Pi). For a siren this is not a behavior you want. Trust me, I found out the hard way ;)
A helper script to check the correct GPIO configuration is provided by the installation in the directory /home/alertr/alertClientRaspberryPi/helperScripts. The script raspberryPiGpioOutputTest.py has to be modified to access the correct GPIO pin.
[...]
# NOTE: this is the actual pin number (not the number of the GPIO)
inputPin = 11
[...]
When we execute the script, it will switch the GPIO pin first to low
for 5 seconds, then to high
for 5 seconds and then back to low
. The output looks like this:
alertr@towel:~/alertClientRaspberryPi/helperScripts $ python3 raspberryPiGpioOutputTest.py
low
high
low
If we connected our siren to the relay, it sounds like in the following video:
The following describes the configuration of the AlertR Alert Client Raspberry Pi. It shows a basic configuration that can be used as a template for own installations.
For security reasons, it is strongly recommended to use a TLS connection for your AlertR system. Hence, all tutorials will use TLS. However, for testing purposes AlertR gives you the option to disable TLS. If you do so, you have to disable it for the complete AlertR system.
During the installation of the AlertR server, you created a certificate file with the name alertr_server.crt
. This file is needed by the client in order to verify the connection. Please copy it to the host you are installing this client on. This tutorial assumes that you have stored the certificate file in the following location: /home/alertr/alertClientRaspberryPi/config/alertr_server.crt
The client has to authenticate itself before it can work with the server. Therefore, we need to set up user credentials on the AlertR server for this client. We execute the following command with the manageUsers.py
script of the server which is located in the installation directory of the server (see Users Management for further information):
alertr@towel:/home/alertr/server# ./manageUsers.py -a -u user_alert_pi -p password_alert_pi -t alert -i alertClientRaspberryPi
Please make sure that the AlertR Server is not running while adding a user.
Otherwise it can lead to an inconsistent state and a corrupted database.
Are you sure to continue?
(y/n): y
This tutorial assumes the Alert Levels configured in the AlertR Server tutorial. The client will use the following for its configuration:
Alert Level | Name | Profiles | Functionality |
---|---|---|---|
2 | Urgent Notification | Activated | Used to "loudly" notify the user. |
Alert Level 2 is used for sensors that trigger urgent Sensor Alerts, such as a break in attempt. These sensors should notify the user immediately and loudly at best. This Alert Level is only member of the System Profile "Activated" and will only trigger if this System Profile is used. Since we attach a homemade siren to the Raspberry Pi, we use this Alert Level for it.
Every AlertR installation has a template configuration file with detailed comments that describe the functionality of each option. To use it as a draft, you can just copy the template file and modify your new configuration file.
alertr@towel:~/alertClientRaspberryPi/config$ cp config.xml.template config.xml
alertr@towel:~/alertClientRaspberryPi/config$ chmod 700 config.xml
The configuration file itself is split into the following parts:
- General
- SMTP
- Update
- Alerts
In this tutorial, we are going through each of these parts separately and describe why we configured it like that.
The general section is used for options such as certificate file location. In our tutorial configuration, the section looks like this:
<general>
<log
file="./logfile.log"
level="INFO" />
<server
host="localhost"
port="44556"
caFile="./config/alertr_server.crt" />
<client
certificateRequired="False"
certFile="/path/to/client.crt"
keyFile="/path/to/client.key" />
<credentials
username="user_alert_pi"
password="password_alert_pi" />
<connection
persistent="True" />
</general>
Section log is used to configure the log file setup. The file attribute sets the location for the log file. Make sure it exists and is writable by the user that starts the AlertR client. Otherwise the client will not start. For example, the directory /var/log is usually only writable by the "root" user and users of the group "syslog". If you want the client log file in this directory, please create a sub-directory for the AlertR client log file and set the correct permissions on it. The level attribute sets the log level. Possible values are DEBUG, INFO, WARNING, ERROR, CRITICAL.
Section server is used to configure the server connection setup. The host and port attribute sets the address and port of the AlertR server. The port was previously configured in the server configuration file. The address can either be a name that can be resolved by the DNS system or an IP address.
Section ssl is used to configure the TLS/SSL setup. The enabled attributes gives you the option to disable or enable it. This setting has to be the same for your complete AlertR setup. It is strongly recommended to enable TLS/SSL and only disable it in a testing environment. In this tutorial, we enable TLS/SSL. The caFile attribute in the server section sets the location of the certificate file that is used to authenticate the server (see Certificate). Section client is used to configure the client connection setup. The certificateRequired attribute determines if the client needs a certificate to connect to the server or not. The certFile and keyFile are used to determine the client certificate and key file. Since this tutorial is not using client certificates, we do not have to set sane values here.
Section credentials is used to configure the login credentials of this client. The credentials were configured in a previous step of this Tutorial and must be the same as in this configuration file.
Section connection is used to configure the connection to the server. The persistent attribute is used to configure if the connection to the server has to be persistent. This means that if the client disconnects, a Sensor Alert is created by the server.
The smtp section is used for options that configure the used SMTP server. In our tutorial configuration, the section looks like this:
<smtp>
<general
activated="True"
fromAddr="[email protected]"
toAddr="[email protected]" />
<server
host="127.0.0.1"
port="25" />
</smtp>
Section general is used to configure the basic options of the eMail notification. The eMail notification is used if problems on the AlertR client occur that can not be solved (like connection problems). The activated attribute determines if the eMail notification is activated or not. If it is deactivated, the rest of the options in the whole smtp section are ignored. The fromAddr attribute sets the used eMail address from which the eMail notification is sent. The toAddr attribute determines the eMail address the notification is sent to.
Section server is used to configure the SMTP server that is used to send the eMail notification. The host attribute sets the address and the port attribute sets the port of the used SMTP server. At the moment, only "127.0.0.1" is allowed as address and port 25. This means you have to set up a local SMTP server in order to send eMail notifications. Personally, I would suggest to set up a local Postfix SMTP server that can forward eMails like in this Tutorial. Please note that the local SMTP server has to accept eMails from localhost without any authentication since it is not supported by AlertR yet.
The update section is used to give the online repository for updates. In our tutorial configuration, the section looks like this:
<update>
<server
url="https://raw.githubusercontent.com/sqall01/alertR/master/" />
</update>
Section server is used to configure the remote update repository. Normally, the default configuration can be used here (which is this repository). The url attribute gives the remote server location of the repository. Only the https
protocol is allowed here if you want to change it.
The alerts section configures the alerts of this client. In our tutorial configuration, the section looks like this:
<alerts>
<alert>
<general
id="0"
description="Siren" />
<alertLevel>2</alertLevel>
<gpio
gpioPin="11"
gpioPinStateNormal="0"
gpioPinStateTriggered="1" />
<triggered
activated="True"
state="1" />
<normal
activated="False"
state="1" />
<profilechange
activated="True">
<profile>1</profile>
</profilechange>
<reset
activated="True"
time="900" />
</alert>
</alerts>
Each configured alert is set up in its own <alert>...</alert> context. The context has three main sections: general, alertLevel and gpio. The following describes the settings of each section.
Section general is used to configure the basic alert settings. The id attribute gives the local id of the configured alert. This id has to be unique for each alert of this client. Since we configure only one alert, we give it the id 0. The description attribute gives a short description of the alert.
The alertLevel sections set the Alert Level the alerts are triggered by. In our tutorial, the alert triggers by Alert Level 2.
Section gpio configures the GPIO pins of the alert. The gpioPin attribute sets the number of the pin that is used. In our tutorial, the siren is connected to pin 11. The gpioPinStateNormal attribute sets the state in which the GPIO pin is set when the alert is in the "normal" state. In our case this is 0 which means low
. The gpioPinStateTriggered attribute sets the same for the "triggered" state of the alert. In our case it is 1 which means high
and turns on the siren.
The triggered option configures if the GPIO pin should be set to HIGH or LOW when a Sensor Alert event with the state "triggered" is received. The activated attribute sets if this event is handled or not. The state attribute configures the state the GPIO pin should be set to. This can either be 0 (for "normal") or 1 (for "triggered"). This is translated to HIGH and LOW with the setting configured in gpioPinStateNormal and gpioPinStateTriggered. In our example, the GPIO pin should be set to "triggered" which is translated with the help of gpioPinStateTriggered to HIGH.
The normal option configures if the GPIO pin should be set to HIGH or LOW when a Sensor Alert event with the state "normal" is received. The activated attribute sets if this event is handled or not. The state attribute configures the state the GPIO pin should be set to. This can either be 0 (for "normal") or 1 (for "triggered"). This is translated to HIGH and LOW with the setting configured in gpioPinStateNormal and gpioPinStateTriggered. In our example this option is deactivated.
The profilechange option configures if the GPIO pin should be reset to HIGH or LOW when the AlertR system changes its used System Profile. It is translated with the help if the gpioPinStateNormal to HIGH or LOW. The activated attribute sets if this event is handled or not. Further, the target System Profile (or multiple System Profiles) given by id has to be configured via the profile setting. This means that when a System Profile change message is received, the Alert first checks if the System Profile changes to one of the configured System Profiles before resetting the GPIO pin. In our example, the GPIO pin is set to LOW when the AlertR system changes its System Profile to id 1. Since we have configured the AlertR system in an alarm system context as described in the AlertR Server tutorial, the GPIO pin will be reset if the System Profile changes from the "Activated" to the "Deactivated" profile.
The reset option configures if the GPIO pin is set to the "normal" state again when it was set to the "triggered" state after a given period of time. The activated attribute sets if the reset is used. The time attribute gives the time in seconds after which the GPIO pin is reset to the "normal" state. In our example it is set to 900 seconds (15 minutes). This means when an alarm is triggered and the siren is turned on, it will be automatically turned of after 900 seconds (or if the System profile is changed in between).
If you want the AlertR client to start automatically after a reboot of the host, you have to set it up. In this tutorial, I will give two examples on how to set up the autostart of the AlertR client depending on your system using systemd or just init.d.
An init.d script is provided by the AlertR installation. The only thing you have to do is to copy and configure it correctly. The following command copies it to the correct location, sets the permissions correctly and installs it:
root@towel:/home/alertr/alertClientRaspberryPi/init.d_example# cp alertRalertRaspberryPi.sh /etc/init.d/
root@towel:/etc/init.d# chown root:root alertRalertRaspberryPi.sh
root@towel:/etc/init.d# chmod 755 alertRalertRaspberryPi.sh
root@towel:/etc/init.d# update-rc.d alertRalertRaspberryPi.sh defaults
Adding system startup for /etc/init.d/alertRalertRaspberryPi.sh ...
/etc/rc0.d/K20alertRalertRaspberryPi.sh -> ../init.d/alertRalertRaspberryPi.sh
/etc/rc1.d/K20alertRalertRaspberryPi.sh -> ../init.d/alertRalertRaspberryPi.sh
/etc/rc6.d/K20alertRalertRaspberryPi.sh -> ../init.d/alertRalertRaspberryPi.sh
/etc/rc2.d/S20alertRalertRaspberryPi.sh -> ../init.d/alertRalertRaspberryPi.sh
/etc/rc3.d/S20alertRalertRaspberryPi.sh -> ../init.d/alertRalertRaspberryPi.sh
/etc/rc4.d/S20alertRalertRaspberryPi.sh -> ../init.d/alertRalertRaspberryPi.sh
/etc/rc5.d/S20alertRalertRaspberryPi.sh -> ../init.d/alertRalertRaspberryPi.sh
Next we have to configure the init.d script correctly. The following changes have to be made to the script:
[...]
# change USER to the user which runs the alertRclient
USER=alertr
# change DAEMON to the path to run the alertRclient
DAEMON=/home/alertr/alertClientRaspberryPi/alertRclient.py
[...]
In order to work correctly, the AlertR client has to be executable. With the following, we change the permissions of the AlertR client:
alertr@towel:~/alertClientRaspberryPi$ chmod 755 alertRclient.py
To start the client as daemon, we can now execute:
root@towel:/home/alertr/alertClientRaspberryPi# /etc/init.d/alertRalertRaspberryPi.sh start
The log file of the client (it is created in the directory you have configured in the General Section) should now show the following:
[...]
08/20/2016 14:28:46 INFO: [alertRclient.py] Connecting to server.
08/20/2016 14:28:46 INFO: [alertRclient.py] Starting watchdog thread.
08/20/2016 14:28:46 INFO: [alertRclient.py] Initializing alerts.
08/20/2016 14:28:46 INFO: [alertRclient.py] Starting update check thread.
08/20/2016 14:28:46 INFO: [alertRclient.py] Client started.
If your system uses systemd for its autostart, you have to configure the AlertR client a bit different. Copying the template and setting permissions is still the same:
root@towel:/home/alertr/alertClientRaspberryPi/init.d_example# cp alertRalertRaspberryPi.sh /etc/init.d/
root@towel:/etc/init.d# chown root:root alertRalertRaspberryPi.sh
root@towel:/etc/init.d# chmod 755 alertRalertRaspberryPi.sh
Configuring the init.d script correctly is also the same:
[...]
# change USER to the user which runs the alertRclient
USER=alertr
# change DAEMON to the path to run the alertRclient
DAEMON=/home/alertr/alertClientRaspberryPi/alertRclient.py
[...]
Now, systemd has to be configured. For this we copy the template service file to the correct location and install the service:
root@towel:/home/alertr/alertClientRaspberryPi/init.d_example# cp alertRalertRaspberryPi.service /etc/systemd/system/
root@towel:/home/alertr/alertClientRaspberryPi# systemctl enable alertRalertRaspberryPi.service
The AlertR client can be started with the following command:
root@towel:/home/alertr/alertClientRaspberryPi# service alertRalertRaspberryPi.sh status
The log file of the client (it is created in the directory you have configured in the General Section) should now show the following:
[...]
08/20/2016 14:28:46 INFO: [alertRclient.py] Connecting to server.
08/20/2016 14:28:46 INFO: [alertRclient.py] Starting watchdog thread.
08/20/2016 14:28:46 INFO: [alertRclient.py] Initializing alerts.
08/20/2016 14:28:46 INFO: [alertRclient.py] Starting update check thread.
08/20/2016 14:28:46 INFO: [alertRclient.py] Client started.
If you experience problems, please check the log file first. If it is not helpful, change the log level to DEBUG and check again. If no error can be seen, please start the AlertR client manually and check if an error occurs that is not printed into the log file. This can be done by just executing the AlertR client as the user that it normally runs with.
alertr@towel:~/alertClientRaspberryPi$ ./alertRclient.py
If you still have problems and do not know how to solve them, you can ask on the community page on reddit or you can use the Github Issues.