GithubHelp home page GithubHelp logo

scudre / alarm-central-station-receiver Goto Github PK

View Code? Open in Web Editor NEW
36.0 12.0 10.0 546 KB

Python daemon for receiving events from a home alarm system via Contact ID protocol

License: Apache License 2.0

Python 90.03% C 9.62% Makefile 0.35%
home-alarm home-automation raspberry-pi alarm alarm-systems dsc daemon pushover alarm-company phone

alarm-central-station-receiver's Introduction

alarm-central-station-receiver

Disclaimer

I make no warranties or guarantees on the relability of this software when it comes to monitoring your home alarm system. It's simply intended to be a fun software project!

Overview

So what is this? This is a python-based project for receiving Contact-ID messages from a home alarm system. It listens for incoming phone calls via a USB magicJack (the original silver kind), decodes the DTMF codes from the alarm, and relays the messages to the user via e-mail or Pushover. Only a magicJack is supported, though any USB device that can decode DTMF and detect on-hook/off-hook could work with this software.

Can you explain in more detail?

The alarm-central-station-receiver daemon relies on the magicJack to signal to it when the home alarm system is dialing out. When this occurs, the daemon answers the phone, and responds to the alarm with the contact-id handshake. Credit to li0r for explaining the protocol

Once the alarm receives the contact-id handshake it begins transmitting its messages to the daemon via DTMF codes. These codes are decoded by the magicJack hardware, and read into the daemon as integers via a hidraw0 interface. Once the alarm completes transmitting its messages the daemon relays them to the configured e-mail address (or Pushover). If you use your phone provider's email to SMS bridge you can receive the notifications via SMS. For example for T-Mobile it's [yournumber]@tmomail.net

Since the software is decoding contact-id messages from the alarm, these are at the same level of detail that an alarm company would receive. The full list of codes can be found here.

What inspired you to build this?

I wanted to be able to monitor my alarm system without having to pay a monthly fee to an alarm company. I came across many implementations that allow you to monitor your DSC Powerseries alarm systems. For these systems there is an easy-to-use serial communciation channel. Unfortunately, my alarm, the DSC Alexor PC9155, does not support communciation via serial.

Digging around online, I came across li0r's Alarmino project which inspired me to also go the route of communciating with the alarm via telephone and the contact-id protocol. Instead of building hardware to emulate a telephone, I opted to go the route of using a USB magicJack + Rasberry Pi + daemon written in python.

Setup

Required Hardware & Software

  1. Debian OS — Should work with any Linux distro, but only this one has been tested
  2. Original silver USB magicJack — You can find this on eBay for pretty cheap
  3. Alarm System — See 'Alarm Systems' below
  4. (Optional) Raspberry Pi — This is great to use as you can mount it in a small box right next to your alarm system

Alarm Systems

This software communciates with the alarm via telephone and the Contact-ID protocol, which is supported by just about every alarm system out there. So this will most likely work with yours. At this time, the software has only been confirmed to work with one system:

  • DSC Alexor PC9155

Acknowledgments

alarm-central-station-receiver's People

Contributors

scudre avatar substatica avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

alarm-central-station-receiver's Issues

Drop from root privileges once hidraw0 and hiddev0 opened

Once hidraw0 and hiddev0 have been loaded, downgrade privileges. python-daemon supports running as a different user, so this could probably be leveraged.

This will require opening hidraw0 before forking (its done after now.) So need to figure out the correct way to pass the FD to the unprivileged child process. Also probably can't use the 'with' statement, or maybe do the daemon fork inside of the 'with' statement?

Gracefully handle failed notification attempts

If there is no network connection, the notifications will fail with an exception, and then never get sent. The events are logged, but would never be sent to email and/or pushover. Look into creation of a retry mechanism to have the notifications continue to attempt to transmit with some kind of back off timer.

Not all GE concord contact ID codes there

Not all of the DSC contact ID codes map correctly in alarm-central-station-receiver. I found the GE Concord codes here.

http://alarmhow.net/manuals/UTC/Concord%20v4/Concord%20v4.0%20Contact%20ID%20Mapping.pdf

In dsc.py, I added a few more codes and might have renamed a few as well, so that most alarm signals can be decoded. There are slight differences in the way DSC and GE report the codes. eg: DSC uses 601000 for phone test, but concord uses 601UUU and UUU is not zero even if the phone test is done from the only user via the main keypad. I have added a diff and my new file for clarity.

diff dsc.py newdsc.py

8a9
> '101000': {'1': ('A', '24 Hr Emergency (non-medical)')},
11c12,16
< '110000': {'1': ('A', '[F] Key Alarm')},
---
> '110000': {'1': ('A', 'Fire Key Alarm')},
> '111000': {'1': ('A', 'Fire Key Alarm')},
> '112000': {'1': ('A', 'Fire Key Alarm')},
> '113000': {'1': ('A', 'Fire Key Alarm')},
> '114000': {'1': ('A', 'Fire Key Alarm')},
12a18,22
> '111ZZZ': {'1': ('A', '24 Hr Fire')},
> '112ZZZ': {'1': ('A', '24 Hr Fire')},
> '113ZZZ': {'1': ('A', '24 Hr Fire')},
> '114ZZZ': {'1': ('A', '24 Hr Fire')},
> '115ZZZ': {'1': ('A', '24 Hr Fire')},
15a26,27
> '122000': {'1': ('A', 'Duress Alarm')},
> '122ZZZ': {'1': ('A', 'Duress Alarm')},
16a29,33
> '131ZZZ': {'1': ('A', 'Zone Alarm Perimeter')},
> '132ZZZ': {'1': ('A', 'Zone Alarm Interior')},
> '134ZZZ': {'1': ('A', 'Zone Alarm Entry Exit')},
> '137000': {'1': ('T', 'General System Tamper (Case/Cover Tamper Alarm)')},
> '137ZZZ': {'1': ('T', 'General System Tamper (Case/Cover Tamper Alarm)')},
27,28c44,46
< '301000': {'1': ('MA', 'AC Line Trouble')},
< '302000': {'1': ('MA', 'Battery Trouble')},
---
> '301000': {'1': ('MA', 'AC Power Failure')},
> '302000': {'1': ('MA', 'System Battery Trouble')},
> '308000': {'1': ('MA', 'System Back in Service')},
29a48
> '320000': {'1': ('MA', 'Siren Fault')},
30a50
> '330ZZZ': {'1': ('MA', 'Alternate Communicator Fault')},
36a57
> '355000': {'1': ('MA', 'Loss Of Radio Supervision')},
48a70
> '381ZZZ': {'1': ('MA', 'Loss of supervision')},
66a89,90
> '451UUU': {'1': ('O', 'Early to Close')},
> '452UUU': {'1': ('O', 'Late to Close')},
67a92
> '454000': {'1': ('O', 'Late to Close')},
68a94
> '457ZZZ': {'1': ('E', 'Exit Fault')},
73c99
< '601000': {'1': ('E', 'System Test')},
---
> '601UUU': {'1': ('E', 'System Test')},

newdsc.py.txt

Move knowledge of what messages to notify on to Notification module

Currently the AlarmStatus decides which events to send notifications on. Ideally AlarmStatus should not need to be aware of Notifications. Instead, it should mark any auto events it finds, and then return the full event list back. The notification module should then decide what events it should or should not send out a notification for.

Dial tone

Hey Chris, should there be a dial tone coming from the magicJack?, I have alarmd running and says "Ready, listening for alarms" but the panel does not see the magicJack dial tone so it thinks there's not phone line connected and nothing happens when the panel tries to transmit an event .

State machine for alarm status

The code is peppered with references to if 'armed', if 'arming', if 'disarming'. Using a state machine to track the alarms current armed or disarmed status could simplify the system and complexity from all of the if else paths.

--no-fork

Raspberry Pi 3 Jessie MagicJack Silver.
when i try to use the --no-fork argument it returns an error
tjapi = ctypes.CDLL("libtjapi.so")
File "/usr/lib/python2.7/ctypes/init.py", line 365, in init
self._handle = _dlopen(self._name, mode)
OSError: libtjapi.so: cannot open shared object file: No such file or directory

I cannot find this library

dsc.py settings for another alarm

Hello Chris,

Can this be setup for my GE Concord 3 alarm system?

I really like the way you set this up. How would I create similar files for my alarm model?

Marco

Process stoppes at ALSA lib errors

tal@tal-ZenBook-14-UX410UFR:/usr/local/bin$ sudo python3 alarmd
[sudo] password for tal:
ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2642:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib pcm_route.c:869:(find_matching_chmap) Found no matching channel map
ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
ALSA lib pcm_oss.c:377:(_snd_pcm_oss_open) Unknown field port
ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused

ALSA lib pulse.c:242:(pulse_connect) PulseAudio: Unable to connect: Connection refused

ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card
ALSA lib pcm_usb_stream.c:486:(_snd_pcm_usb_stream_open) Invalid type for card

Any idea how to solve it?

Fix bug only allowing 3 digit phone numbers

In callup.py, the initial loop that attempts to match the phone number that the alarm system is calling is implicitly expecting a phone number of 3 digits. Instead, it should support any length as this is what can be set in config.ini.

Send notification on failed arm/disam

It's possible for the alarm system to fail to arm or disarm. For example if a door is open, the alarm system usually won't arm. The daemon should have a timeout period waiting for an arm/disarm notification after the Raspberry PI GPIO has been triggered. If the timeout is hit, a notification should be sent indicating the system failed to arm/disarm. This should also be saved to the alarm history.

Email notification fails to connect to gmail

On a rasberry PI 4b with the latest python 2.7, smtplib.SMTP() seems to expect an integer for the second argument. I get an error whenever alarmd tries to send an email.

In /etc/alarmd_config.ini, I have:

[EmailNotification]
notification_email = [email protected]
notification_subject = Alarm Notification
username = [email protected]
password = 1234567812345678
server_address = smtp.gmail.com
port = 587
tls = true

Running the notification-test gives the following error:

root@raspberrypi:/home/pi# alarmd --notification-test
Jul 24 20 12:49:20 PM alarmd[7723]: [main.INFO] Notification test starting...
Jul 24 20 12:49:20 PM alarmd[7723]: [notify.INFO] Sending notifications...
Jul 24 20 12:49:20 PM alarmd[7723]: [emailer.INFO] Sending email...
Traceback (most recent call last):
File "/usr/local/bin/alarmd", line 11, in
load_entry_point('alarm-central-station-receiver==1.0.0', 'console_scripts', 'alarmd')()
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-1.0.0-py2.7-linux-armv7l.egg/alarm_central_station_receiver/main.py", line 251, in main
notification_test_exit(args.config_path)
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-1.0.0-py2.7-linux-armv7l.egg/alarm_central_station_receiver/main.py", line 111, in notification_test_exit
notify_test()
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-1.0.0-py2.7-linux-armv7l.egg/alarm_central_station_receiver/notifications/notify.py", line 39, in notify_test
notify_async(events)
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-1.0.0-py2.7-linux-armv7l.egg/alarm_central_station_receiver/notifications/notify.py", line 44, in notify_async
emailer.notify(events)
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-1.0.0-py2.7-linux-armv7l.egg/alarm_central_station_receiver/notifications/notifiers/emailer.py", line 68, in notify
s = smtplib.SMTP(server, server_port)
File "/usr/lib/python2.7/smtplib.py", line 256, in init
(code, msg) = self.connect(host, port)
File "/usr/lib/python2.7/smtplib.py", line 317, in connect
self.sock = self._get_socket(host, port, self.timeout)
File "/usr/lib/python2.7/smtplib.py", line 292, in _get_socket
return socket.create_connection((host, port), timeout)
File "/usr/lib/python2.7/socket.py", line 557, in create_connection
for res in getaddrinfo(host, port, 0, SOCK_STREAM):
socket.error: getaddrinfo() argument 2 must be integer or string

I updated emailer.py and changed the second argument to an integer to resolve this:

'diff emailer.py emailer.py.new '
'57a58,59'
'> server_port_num = int(server_port)'
'> '
'68c70,71'
'< s = smtplib.SMTP(server, server_port)'
'---'
'> '
'> s = smtplib.SMTP(server, server_port_num)'

Intermittently working line failure?

Hi scudre, firstly thanks for releasing this project, its really really useful. I'm having issues with the alarm integration intermittently working with a Pyronix Enforcer alarm system.

Symptoms: Sometimes (seemingly randomly) it will work fine, all codes are received and decoded as expected:

(venv3) pi@raspberrypi:~ $ sudo /home/pi/venv3/bin/alarmd --no-fork --debug
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.front.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM front
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround21
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround21
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround40.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround40
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround41
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround50
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround51
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround71.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround71
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM iec958
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM spdif
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM spdif
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
Apr 22 19 09:51:58 PM alarmd[3318]: [main.INFO] Python 3.5.3 (default, Sep 27 2018, 17:25:39) 
[GCC 6.3.0 20170516]
Apr 22 19 09:51:58 PM alarmd[3318]: [main.INFO] Starting in no-fork mode
Apr 22 19 09:51:58 PM alarmd[3318]: [status.INFO] Loading config from /var/lib/alarmd/alarmd.db
Apr 22 19 09:51:58 PM alarmd[3318]: [main.INFO] Ready, listening for alarms
Apr 22 19 09:51:58 PM alarmd[3318]: [main.DEBUG] Timeout: None
Apr 22 19 09:51:59 PM alarmd[3318]: [callup.INFO] Phone Off The Hook
Apr 22 19 09:51:59 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:51:59 PM alarmd[3318]: [callup.DEBUG] Number 004
Apr 22 19 09:52:00 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:52:00 PM alarmd[3318]: [callup.DEBUG] Number 043
Apr 22 19 09:52:00 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:52:00 PM alarmd[3318]: [callup.DEBUG] Number 433
Apr 22 19 09:52:30 PM alarmd[3318]: [callup.DEBUG] Number 433
Apr 22 19 09:52:30 PM alarmd[3318]: [callup.INFO] Phone On The Hook
Apr 22 19 09:52:30 PM alarmd[3318]: [status.INFO] No new events found!
Apr 22 19 09:52:30 PM alarmd[3318]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 09:52:30 PM alarmd[3318]: [notify.INFO] No events for notification
Apr 22 19 09:52:30 PM alarmd[3318]: [main.DEBUG] Timeout: None
Apr 22 19 09:52:36 PM alarmd[3318]: [callup.INFO] Phone Off The Hook
Apr 22 19 09:52:38 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:52:38 PM alarmd[3318]: [callup.DEBUG] Number 004
Apr 22 19 09:52:39 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:52:39 PM alarmd[3318]: [callup.DEBUG] Number 043
Apr 22 19 09:52:39 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:52:39 PM alarmd[3318]: [callup.DEBUG] Number 433
Apr 22 19 09:53:09 PM alarmd[3318]: [callup.DEBUG] Number 433
Apr 22 19 09:53:09 PM alarmd[3318]: [callup.INFO] Phone On The Hook
Apr 22 19 09:53:09 PM alarmd[3318]: [status.INFO] No new events found!
Apr 22 19 09:53:09 PM alarmd[3318]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 09:53:09 PM alarmd[3318]: [notify.INFO] No events for notification
Apr 22 19 09:53:09 PM alarmd[3318]: [main.DEBUG] Timeout: None
Apr 22 19 09:53:15 PM alarmd[3318]: [callup.INFO] Phone Off The Hook
Apr 22 19 09:53:17 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:53:17 PM alarmd[3318]: [callup.DEBUG] Number 004
Apr 22 19 09:53:18 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:53:18 PM alarmd[3318]: [callup.DEBUG] Number 043
Apr 22 19 09:53:18 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:53:18 PM alarmd[3318]: [callup.DEBUG] Number 433
Apr 22 19 09:53:48 PM alarmd[3318]: [callup.DEBUG] Number 433
Apr 22 19 09:53:48 PM alarmd[3318]: [callup.INFO] Phone On The Hook
Apr 22 19 09:53:48 PM alarmd[3318]: [status.INFO] No new events found!
Apr 22 19 09:53:48 PM alarmd[3318]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 09:53:48 PM alarmd[3318]: [notify.INFO] No events for notification
Apr 22 19 09:53:48 PM alarmd[3318]: [main.DEBUG] Timeout: None
Apr 22 19 09:53:54 PM alarmd[3318]: [callup.INFO] Phone Off The Hook
Apr 22 19 09:53:56 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:53:56 PM alarmd[3318]: [callup.DEBUG] Number 004
Apr 22 19 09:53:57 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:53:57 PM alarmd[3318]: [callup.DEBUG] Number 043
Apr 22 19 09:53:57 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:53:57 PM alarmd[3318]: [callup.DEBUG] Number 433
Apr 22 19 09:54:28 PM alarmd[3318]: [callup.DEBUG] Number 433
Apr 22 19 09:54:28 PM alarmd[3318]: [callup.INFO] Phone On The Hook
Apr 22 19 09:54:28 PM alarmd[3318]: [status.INFO] No new events found!
Apr 22 19 09:54:28 PM alarmd[3318]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 09:54:28 PM alarmd[3318]: [notify.INFO] No events for notification
Apr 22 19 09:54:28 PM alarmd[3318]: [main.DEBUG] Timeout: None
Apr 22 19 09:54:33 PM alarmd[3318]: [callup.INFO] Phone Off The Hook
Apr 22 19 09:54:35 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:54:35 PM alarmd[3318]: [callup.DEBUG] Number 004
Apr 22 19 09:54:35 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:54:35 PM alarmd[3318]: [callup.DEBUG] Number 044
Apr 22 19 09:54:36 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:54:36 PM alarmd[3318]: [callup.DEBUG] Number 443
Apr 22 19 09:54:36 PM alarmd[3318]: [callup.INFO] Alarm Call In Received
Apr 22 19 09:54:36 PM alarmd[3318]: [callup.DEBUG] Number 443
Apr 22 19 09:54:36 PM alarmd[3318]: [callup.INFO] Collecting Alarm Codes
Apr 22 19 09:54:36 PM alarmd[3318]: [handshake.INFO] Handshake Initiated
Apr 22 19 09:55:06 PM alarmd[3318]: [callup.INFO] Alarm Hung Up
Apr 22 19 09:55:06 PM alarmd[3318]: [handshake.INFO] Handshake Complete
Apr 22 19 09:55:06 PM alarmd[3318]: [callup.INFO] Code String: 
Apr 22 19 09:55:06 PM alarmd[3318]: [status.INFO] No new events found!
Apr 22 19 09:55:06 PM alarmd[3318]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 09:55:06 PM alarmd[3318]: [notify.INFO] No events for notification
Apr 22 19 09:55:06 PM alarmd[3318]: [main.DEBUG] Timeout: None
Apr 22 19 09:55:12 PM alarmd[3318]: [callup.INFO] Phone Off The Hook
Apr 22 19 09:55:14 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:55:14 PM alarmd[3318]: [callup.DEBUG] Number 004
Apr 22 19 09:55:14 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:55:14 PM alarmd[3318]: [callup.DEBUG] Number 044
Apr 22 19 09:55:15 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:55:15 PM alarmd[3318]: [callup.DEBUG] Number 443
Apr 22 19 09:55:15 PM alarmd[3318]: [callup.INFO] Alarm Call In Received
Apr 22 19 09:55:15 PM alarmd[3318]: [callup.DEBUG] Number 443
Apr 22 19 09:55:15 PM alarmd[3318]: [callup.INFO] Collecting Alarm Codes
Apr 22 19 09:55:15 PM alarmd[3318]: [handshake.INFO] Handshake Initiated
Apr 22 19 09:55:45 PM alarmd[3318]: [callup.INFO] Alarm Hung Up
Apr 22 19 09:55:45 PM alarmd[3318]: [handshake.INFO] Handshake Complete
Apr 22 19 09:55:45 PM alarmd[3318]: [callup.INFO] Code String: 
Apr 22 19 09:55:45 PM alarmd[3318]: [status.INFO] No new events found!
Apr 22 19 09:55:45 PM alarmd[3318]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 09:55:45 PM alarmd[3318]: [notify.INFO] No events for notification
Apr 22 19 09:55:45 PM alarmd[3318]: [main.DEBUG] Timeout: None
Apr 22 19 09:55:51 PM alarmd[3318]: [callup.INFO] Phone Off The Hook
Apr 22 19 09:55:53 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:55:53 PM alarmd[3318]: [callup.DEBUG] Number 004
Apr 22 19 09:55:53 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:55:53 PM alarmd[3318]: [callup.DEBUG] Number 044
Apr 22 19 09:55:54 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:55:54 PM alarmd[3318]: [callup.DEBUG] Number 443
Apr 22 19 09:55:54 PM alarmd[3318]: [callup.INFO] Alarm Call In Received
Apr 22 19 09:55:54 PM alarmd[3318]: [callup.DEBUG] Number 443
Apr 22 19 09:55:54 PM alarmd[3318]: [callup.INFO] Collecting Alarm Codes
Apr 22 19 09:55:54 PM alarmd[3318]: [handshake.INFO] Handshake Initiated
Apr 22 19 09:56:24 PM alarmd[3318]: [callup.INFO] Alarm Hung Up
Apr 22 19 09:56:24 PM alarmd[3318]: [handshake.INFO] Handshake Complete
Apr 22 19 09:56:24 PM alarmd[3318]: [callup.INFO] Code String: 
Apr 22 19 09:56:24 PM alarmd[3318]: [status.INFO] No new events found!
Apr 22 19 09:56:24 PM alarmd[3318]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 09:56:24 PM alarmd[3318]: [notify.INFO] No events for notification
Apr 22 19 09:56:24 PM alarmd[3318]: [main.DEBUG] Timeout: None
Apr 22 19 09:56:30 PM alarmd[3318]: [callup.INFO] Phone Off The Hook
Apr 22 19 09:56:32 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:56:32 PM alarmd[3318]: [callup.DEBUG] Number 004
Apr 22 19 09:56:33 PM alarmd[3318]: [callup.DEBUG] Digit 4
Apr 22 19 09:56:33 PM alarmd[3318]: [callup.DEBUG] Number 044
Apr 22 19 09:56:33 PM alarmd[3318]: [callup.DEBUG] Digit 3
Apr 22 19 09:56:33 PM alarmd[3318]: [callup.DEBUG] Number 443
Apr 22 19 09:56:33 PM alarmd[3318]: [callup.INFO] Alarm Call In Received
Apr 22 19 09:56:33 PM alarmd[3318]: [callup.DEBUG] Number 443
Apr 22 19 09:56:33 PM alarmd[3318]: [callup.INFO] Collecting Alarm Codes
Apr 22 19 09:56:33 PM alarmd[3318]: [handshake.INFO] Handshake Initiated
Apr 22 19 09:56:50 PM alarmd[3318]: [callup.INFO] Alarm Hung Up
Apr 22 19 09:56:50 PM alarmd[3318]: [handshake.INFO] Handshake Complete
Apr 22 19 09:56:50 PM alarmd[3318]: [callup.INFO] Code String: 0000181628000004000018162800000400001816270000050000181627000005
Apr 22 19 09:56:50 PM alarmd[3318]: [status.INFO] New Events
Apr 22 19 09:56:50 PM alarmd[3318]: [status.INFO] MA: Installer Lead Out 
Apr 22 19 09:56:50 PM alarmd[3318]: [status.INFO] MA: Installer Lead Out 
Apr 22 19 09:56:50 PM alarmd[3318]: [status.INFO] MA: Installer Lead In 
Apr 22 19 09:56:50 PM alarmd[3318]: [status.INFO] MA: Installer Lead In 
Apr 22 19 09:56:50 PM alarmd[3318]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 09:56:51 PM alarmd[3318]: [main.DEBUG] Timeout: None
Apr 22 19 09:56:51 PM alarmd[3359]: [notify.INFO] Sending notifications...

However more often than not they are not, and the alarm hangs up early:

(venv3) pi@raspberrypi:~ $ sudo /home/pi/venv3/bin/alarmd --no-fork --debug
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.front.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM front
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.rear
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.center_lfe
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.side
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround21
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround21
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround40.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround40
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround41
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround50
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround51.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround51
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.surround71.0:CARD=0'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM surround71
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM iec958
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM spdif
ALSA lib confmisc.c:1281:(snd_func_refer) Unable to find definition 'cards.bcm2835_alsa.pcm.iec958.0:CARD=0,AES0=4,AES1=130,AES2=0,AES3=2'
ALSA lib conf.c:4528:(_snd_config_evaluate) function snd_func_refer returned error: No such file or directory
ALSA lib conf.c:5007:(snd_config_expand) Evaluate error: No such file or directory
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM spdif
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.hdmi
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.modem
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
ALSA lib pcm.c:2495:(snd_pcm_open_noupdate) Unknown PCM cards.pcm.phoneline
Apr 22 19 10:30:09 PM alarmd[4307]: [main.INFO] Python 3.5.3 (default, Sep 27 2018, 17:25:39) 
[GCC 6.3.0 20170516]
Apr 22 19 10:30:10 PM alarmd[4307]: [main.INFO] Starting in no-fork mode
Apr 22 19 10:30:10 PM alarmd[4307]: [status.INFO] Loading config from /var/lib/alarmd/alarmd.db
Apr 22 19 10:30:10 PM alarmd[4307]: [main.INFO] Ready, listening for alarms
Apr 22 19 10:30:10 PM alarmd[4307]: [main.DEBUG] Timeout: None
Apr 22 19 10:30:26 PM alarmd[4307]: [callup.INFO] Phone Off The Hook
Apr 22 19 10:30:32 PM alarmd[4307]: [callup.DEBUG] Number 000
Apr 22 19 10:30:32 PM alarmd[4307]: [callup.INFO] Phone On The Hook
Apr 22 19 10:30:32 PM alarmd[4307]: [status.INFO] No new events found!
Apr 22 19 10:30:32 PM alarmd[4307]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 10:30:32 PM alarmd[4307]: [notify.INFO] No events for notification
Apr 22 19 10:30:32 PM alarmd[4307]: [main.DEBUG] Timeout: None
Apr 22 19 10:30:36 PM alarmd[4307]: [callup.INFO] Phone Off The Hook
Apr 22 19 10:30:42 PM alarmd[4307]: [callup.DEBUG] Number 000
Apr 22 19 10:30:42 PM alarmd[4307]: [callup.INFO] Phone On The Hook
Apr 22 19 10:30:42 PM alarmd[4307]: [status.INFO] No new events found!
Apr 22 19 10:30:42 PM alarmd[4307]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 10:30:42 PM alarmd[4307]: [notify.INFO] No events for notification
Apr 22 19 10:30:42 PM alarmd[4307]: [main.DEBUG] Timeout: None
Apr 22 19 10:30:47 PM alarmd[4307]: [callup.INFO] Phone Off The Hook
Apr 22 19 10:30:53 PM alarmd[4307]: [callup.DEBUG] Number 000
Apr 22 19 10:30:53 PM alarmd[4307]: [callup.INFO] Phone On The Hook
Apr 22 19 10:30:53 PM alarmd[4307]: [status.INFO] No new events found!
Apr 22 19 10:30:53 PM alarmd[4307]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 10:30:53 PM alarmd[4307]: [notify.INFO] No events for notification
Apr 22 19 10:30:53 PM alarmd[4307]: [main.DEBUG] Timeout: None
Apr 22 19 10:30:58 PM alarmd[4307]: [callup.INFO] Phone Off The Hook
Apr 22 19 10:31:04 PM alarmd[4307]: [callup.DEBUG] Number 000
Apr 22 19 10:31:04 PM alarmd[4307]: [callup.INFO] Phone On The Hook
Apr 22 19 10:31:04 PM alarmd[4307]: [status.INFO] No new events found!
Apr 22 19 10:31:04 PM alarmd[4307]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 10:31:04 PM alarmd[4307]: [notify.INFO] No events for notification
Apr 22 19 10:31:04 PM alarmd[4307]: [main.DEBUG] Timeout: None
Apr 22 19 10:31:14 PM alarmd[4307]: [callup.INFO] Phone Off The Hook
Apr 22 19 10:31:15 PM alarmd[4307]: [callup.DEBUG] Number 000
Apr 22 19 10:31:15 PM alarmd[4307]: [callup.INFO] Phone On The Hook
Apr 22 19 10:31:15 PM alarmd[4307]: [status.INFO] No new events found!
Apr 22 19 10:31:15 PM alarmd[4307]: [status.INFO] Saving config to /var/lib/alarmd/alarmd.db
Apr 22 19 10:31:15 PM alarmd[4307]: [notify.INFO] No events for notification
Apr 22 19 10:31:15 PM alarmd[4307]: [main.DEBUG] Timeout: None

It is worth calling out this feels like an initialisation issue - when it work it works consistently until the application is restarted. (then it may, or may not work for the following instance)

Is this something you've seen before? I've tried running the MagicJack through a number of different usb hubs, a different RPi etc etc and the only consistent thing is how inconsistent it is!
The only guess I have is that due to being located in the UK my equipment expects 50v, and US standard is 48v, but thats a bit of a stretch. Are you aware of any specifics it might be worth tweaking?

Thanks again

Alex

Traceback when trying to run alarmd the first time

Traceback thrown when starting alarmd the first time:

Traceback (most recent call last):
File "/usr/local/bin/alarmd", line 11, in
load_entry_point('alarm-central-station-receiver==0.0.8', 'console_scripts', 'alarmd')()
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-0.0.8-py2.7-linux-armv6l.egg/alarm_central_station_receiver/main.py", line 200, in main
initialize(args.config_path)
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-0.0.8-py2.7-linux-armv6l.egg/alarm_central_station_receiver/main.py", line 170, in initialize
check_required_config(config_path)
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-0.0.8-py2.7-linux-armv6l.egg/alarm_central_station_receiver/main.py", line 161, in check_required_config
missing_config = AlarmConfig.validate(AlarmConfig.get())
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-0.0.8-py2.7-linux-armv6l.egg/alarm_central_station_receiver/alarm_config.py", line 30, in validate
if not config.get('AlarmSystem').get('phone_number'):
AttributeError: 'NoneType' object has no attribute 'get'

More verbose log messages at init

  1. Add log messages to indicate when the MagicJack device has been loaded.
  2. Add messages indicating the config has been loaded
  3. Add message to indicate ALSA messages can be ignored

Check if /dev/usr/hiddevN exists before opening

tigerjet_init.py searches through all of the /dev/usb/hiddevN files for the magicJack. However, this is being done by blindly attempting to open the first 10 hiddevN devices. If any /dev/usb/hiddevN files are missing, an exception is being thrown:

Traceback (most recent call last):
File "/usr/local/bin/alarmd", line 11, in
load_entry_point('alarm-central-station-receiver==0.0.8', 'console_scripts', 'alarmd')()
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-0.0.8-py2.7-linux-armv7l.egg/alarm_central_station_receiver/main.py", line 216, in main
initialize(args.config_path)
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-0.0.8-py2.7-linux-armv7l.egg/alarm_central_station_receiver/main.py", line 182, in initialize
tigerjet.initialize()
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-0.0.8-py2.7-linux-armv7l.egg/alarm_central_station_receiver/tigerjet/tigerjet_init.py", line 20, in initialize
with open('/dev/usb/hiddev%d' % id, 'rb') as fd:
IOError: [Errno 2] No such file or directory: '/dev/usb/hiddev0'

Don't require email setup to use daemon

If a user is attempting to setup alarm-central-station-receiver the first time, they don't necessarily want to have to have email setup just to test it out. Make email configuration optional.

Gracefully handle email send failures

If the email notification send fails, it throws an exception. This could be handled more gracefully. Example of an error:

Traceback (most recent call last):
File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "/usr/local/lib/python2.7/dist-packages/alarm_central_station_receiver-0.0.8-py2.7-linux-armv7l.egg/alarm_central_station_receiver/notifications/email_notify.py", line 40, in send_email
s = smtplib.SMTP(server, server_port)
File "/usr/lib/python2.7/smtplib.py", line 256, in init
(code, msg) = self.connect(host, port)
File "/usr/lib/python2.7/smtplib.py", line 317, in connect
(code, msg) = self.getreply()
File "/usr/lib/python2.7/smtplib.py", line 368, in getreply
raise SMTPServerDisconnected("Connection unexpectedly closed")
SMTPServerDisconnected: Connection unexpectedly closed

Multiple phone numbers

I’m looking to use this program to trouble shoot alarm panel comm problems as an alarm technician. Is there a way to enter multiple phone numbers in the config file so I do not have to change the config each time I’m working on a different panel?

Support ini files for configuration

Overview

INI configuration support for:

  • Zone Names
  • Phone number that alarm calls
  • Email configuration
  • Other notification configuration

Zone Names

In dsc.py, the zone names are hardcoded and should be moved to INI.

Phone Number that Alarm Calls

Right now the phone number that the software picks up the phone is '815'. This should be configurable, with a note in the config explaining how to configure this on PC9155.

Email Configuration

Currently email configuration is embedded in email_notify.py which isn't ideal. It should be moved out into a separate file outside of the package. Additional thoughts:

  • Need to include a template in the package
  • Need to ensure credentials can't get accidentally checked in, .gitignore?
  • Default file to a known location, but support specifying path

Other Notification Configuration

If other notifications are supported, e.g. pushbullet, add config to ini file.

Project Configuration

I have been trying to install and configure this project on a Raspberry Pi 3. I have gotten it to install successfully with python setup.py install
But I'm not sure how to configure and use since I haven't been able to find any Installation and Configuration documentation. A short run down of the process would be helpful to understand how to use the project.
Thanks.

Recommend Projects

  • React photo React

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

  • Vue.js photo Vue.js

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

  • Typescript photo Typescript

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

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

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

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.