1+ import http .client
12import logging
23import re
3-
4- import chump
4+ import urllib
55
66from paradox .config import config as cfg
77from paradox .event import EventLevel
1010logger = logging .getLogger ("PAI" ).getChild (__name__ )
1111
1212_level_2_priority = {
13- EventLevel .NOTSET : chump . LOWEST ,
14- EventLevel .DEBUG : chump . LOWEST ,
15- EventLevel .INFO : chump . LOW ,
16- EventLevel .WARN : chump . NORMAL ,
17- EventLevel .ERROR : chump . HIGH ,
18- EventLevel .CRITICAL : chump . EMERGENCY ,
13+ EventLevel .NOTSET : - 2 ,
14+ EventLevel .DEBUG : - 2 ,
15+ EventLevel .INFO : - 1 ,
16+ EventLevel .WARN : 0 ,
17+ EventLevel .ERROR : 1 ,
18+ EventLevel .CRITICAL : 2 ,
1919}
2020
2121
@@ -31,66 +31,45 @@ def __init__(self, alarm):
3131 cfg .PUSHOVER_MIN_EVENT_LEVEL ,
3232 )
3333
34- self .app = None
3534 self .users = {}
3635
37- def _run (self ):
38- super ()._run ()
39-
40- self .app = chump .Application (cfg .PUSHOVER_KEY )
41- if not self .app .is_authenticated :
42- raise Exception (
43- "Failed to authenticate with Pushover. Please check PUSHOVER_APPLICATION_KEY"
44- )
45-
4636 def send_message (self , message : str , level : EventLevel ):
4737 for settings in cfg .PUSHOVER_BROADCAST_KEYS :
4838 user_key = settings ["user_key" ]
4939 devices_raw = settings ["devices" ]
5040
51- user = self .users .get (user_key )
52-
53- if user is None :
54- user = self .users [user_key ] = self .app .get_user (user_key )
55-
56- if not user .is_authenticated :
57- raise Exception (
58- "Failed to check user key with Pushover. Please check PUSHOVER_BROADCAST_KEYS[%s]"
59- % user_key
60- )
61-
6241 if devices_raw == "*" or devices_raw is None :
63- try :
64- user .send_message (
65- message ,
66- title = "Alarm" ,
67- priority = _level_2_priority .get (level , chump .NORMAL ),
68- )
69- logger .info (f"Notification sent: { message } , level={ level } " )
70- except Exception :
71- logger .exception ("Pushover send message" )
72-
42+ self ._send_pushover_message (user_key , message , level )
7343 else :
7444 devices = list (filter (bool , re .split (r"[\s]*,[\s]*" , devices_raw )))
7545
76- for elem in (elem for elem in devices if elem not in user .devices ):
77- logger .warning (
78- "%s is not in the Pushover device list for the user %s"
79- % (elem , user_key )
80- )
81-
8246 for device in devices :
83- try :
84- user .send_message (
85- message ,
86- title = "PAI" ,
87- device = device ,
88- priority = _level_2_priority .get (level , chump .NORMAL ),
89- )
90- logger .info (
91- f"Notification sent: { message } , level={ level } , device={ device } "
92- )
93- except Exception :
94- logger .exception ("Pushover send message" )
47+ self ._send_pushover_message (user_key , message , level , device )
48+
49+ def _send_pushover_message (self , user_key , message , level , device = None ):
50+ conn = http .client .HTTPSConnection ("api.pushover.net:443" )
51+ params = {
52+ "token" : cfg .PUSHOVER_KEY ,
53+ "user" : user_key ,
54+ "message" : message ,
55+ "priority" : _level_2_priority .get (level , 0 ),
56+ "title" : "Alarm" ,
57+ }
58+ if device :
59+ params ["device" ] = device
60+
61+ conn .request (
62+ "POST" ,
63+ "/1/messages.json" ,
64+ urllib .parse .urlencode (params ),
65+ {"Content-type" : "application/x-www-form-urlencoded" },
66+ )
9567
96- # TODO: Missing the message reception
68+ response = conn .getresponse ()
69+ if response .status != 200 :
70+ logger .error (f"Failed to send message: { response .reason } " )
71+ else :
72+ logger .info (
73+ f"Notification sent: { message } , level={ level } , device={ device if device else 'all' } "
74+ )
75+ conn .close ()
0 commit comments