added callsign stalking, made things nicer, fixed bugs

added config file
This commit is contained in:
Michael Clemens 2020-12-08 01:00:58 +01:00
parent 2dbc64739d
commit 16183700c0
2 changed files with 59 additions and 34 deletions

10
config.py Normal file
View File

@ -0,0 +1,10 @@
#!/usr/bin/env python
# adapt the following variables to your needs
talkgroups = [91, 262] # Talkgroups to monitor
callsigns = ["N0CALL", "N0C4LL"] # Callsigns to monitor
min_duration = 2 # Min. duration of a QSO to qualify for a push notification
min_silence = 300 # Min. time in seconds after the last QSO before a new push notification will be send
# Pushover configuration
pushover_token = "" # Your Pushover API token
pushover_user = "" # Your Pushover user key

View File

@ -1,64 +1,79 @@
#!/usr/bin/env python
from socketIO_client import SocketIO from socketIO_client import SocketIO
import json import json
import datetime as dt import datetime as dt
import time import time
import config as cfg
import http.client, urllib
id = "" last_TG_activity = {}
last_activity = {} last_OM_activity = {}
# adapt the following variables to your needs
talkgroups = [91, 98002] # Talkgroups to monitor
#dmr_ids = [2637550]
callsigns = ["DL6MHC", "OE1MEW"]
min_duration = 2 # Min. duration of QSO to qualify for a push notification
min_silence = 300 # Min. time in seconds after the last QSO before a new push notification will be send.
def on_connect(): def on_connect():
print('connect') print('Connecting to the Brandmeister API')
def on_disconnect(): def on_disconnect():
print('disconnect') print('Disconnected')
def on_reconnect(): def on_reconnect():
print('reconnect') print('Reconnecting')
def push_message(msg):
if cfg.pushover_token != "" and cfg.pushover_user != "":
conn = http.client.HTTPSConnection("api.pushover.net:443")
conn.request("POST", "/1/messages.json",
urllib.parse.urlencode({
"token": cfg.pushover_token,
"user": cfg.pushover_user,
"message": msg,
}), { "Content-type": "application/x-www-form-urlencoded" })
conn.getresponse()
def construct_message(c): def construct_message(c):
tg = c["DestinationID"] tg = c["DestinationID"]
out = "" out = ""
duration = c["Stop"] - c["Start"] duration = c["Stop"] - c["Start"]
#print(c["DestinationName"])
# convert unix time stamp to human readable format # convert unix time stamp to human readable format
time = dt.datetime.utcfromtimestamp(c["Start"]).strftime("%Y/%m/%d %H:%M") time = dt.datetime.utcfromtimestamp(c["Start"]).strftime("%Y/%m/%d %H:%M")
# construct text message from various QSO properties # construct text message from various QSO properties
out += c["SourceCall"] + ' (' + c["SourceName"] + ') was active on ' out += c["SourceCall"] + ' (' + c["SourceName"] + ') was active on '
out += str(tg) + ' (' + c["DestinationName"] + ') at ' out += str(tg) + ' (' + c["DestinationName"] + ') at '
out += time + ' (' + str(duration) + ' seconds)' out += time + ' (' + str(duration) + ' seconds)'
#print(json.dumps(call,separators=(',',':'),sort_keys=True,indent=4)) # finally return the text message
# remember ID to prevent doublets return out
#id = call["SessionID"]
#last_activity[tg] = call["Start"]
# finally print out the text message
print(out)
def on_mqtt(*args): def on_mqtt(*args):
global id
# get json data of QSO # get json data of QSO
call = json.loads(args[0]['payload']) call = json.loads(args[0]['payload'])
#print(json.dumps(call,separators=(',',':'),sort_keys=True,indent=4))
# check if talkgroup is one of those to be monitored, if QSO has already been
# ended and the same QSO has already been handled
tg = call["DestinationID"] tg = call["DestinationID"]
if call["SourceCall"] in callsigns: callsign = call["SourceCall"]
construct_message(call) start_time = call["Start"]
elif tg in talkgroups and call["Stop"] > 0 and id != call["SessionID"] and (tg not in last_activity or (last_activity[tg] + min_silence) < call["Start"]): stop_time = call["Stop"]
# calculate duration of QSO msg = ""
duration = call["Stop"] - call["Start"] # check if callsign is monitored, the over has already been finished
# only proceed if QSO has the configured min. duration # and the person was inactive for n seconds
if duration >= min_duration: if callsign in cfg.callsigns:
construct_message(call) if callsign not in last_OM_activity or (last_OM_activity[callsign] + cfg.min_silence) < start_time:
id = call["SessionID"] # If the activity has happened in a monitored TG, remember the QSO start time stamp
last_activity[tg] = call["Start"] if tg in cfg.talkgroups and stop_time > 0:
last_TG_activity[tg] = start_time
# remember the QSO's time stamp of this particular DMR user
last_OM_activity[callsign] = start_time
msg = construct_message(call)
# Continue if the talkgroup is monitored, the over has been finished and there was no activity
# during the last n seconds in this talkgroup
elif tg in cfg.talkgroups and stop_time > 0:
if tg not in last_TG_activity or (last_TG_activity[tg] + cfg.min_silence) < start_time:
# calculate duration of key down
duration = stop_time - start_time
# only proceed if the key down has been long enough
if duration >= cfg.min_duration:
last_TG_activity[tg] = start_time
msg = construct_message(call)
# finally write the message to the console and send a push notification
if msg != "":
print(construct_message(call))
push_message(construct_message(call))
socket = SocketIO('https://api.brandmeister.network/lh') socket = SocketIO('https://api.brandmeister.network/lh')
socket.on('connect', on_connect) socket.on('connect', on_connect)