def entityData(self, analysis): sensor_name = self.sensor_lookup.get(tools.getKey(Analysis, 'sensor', analysis, asID=False), "") row = [analysis.key().name(), sensor_name, tools.sdatetime(analysis.dt_created), tools.sdatetime(analysis.dt_updated)] for col in self.columns: value = analysis.columnValue(col, default="") row.append(value) return row
def entityData(self, apilog): request_id = "ID:" + str(apilog.key().id()) uid = "ID:%s" % tools.getKey(APILog, 'user', apilog, asID=True) row = [ request_id, uid, tools.sdatetime(apilog.date), apilog.path, apilog.method, apilog.request ] return row
def entityData(self, sensor): sensor_type_id = tools.getKey(Sensor, 'sensortype', sensor, asID=True) row = [ "ID:%s" % sensor.key().name(), sensor.name, "ID:%s" % sensor_type_id, tools.sdatetime(sensor.dt_created), sensor.contacts if sensor.contacts else "", ', '.join([str(gid) for gid in sensor.group_ids]) ] return row
def entityData(self, rec): row = [ "ID:%s" % rec.key().name(), "ID:%s" % tools.getKey(Record, 'sensor', rec, asID=False, asKeyName=True), tools.sdatetime(rec.dt_recorded, fmt="%Y-%m-%d %H:%M:%S %Z") ] for col in self.columns: row.append(str(rec.columnValue(col, default=""))) return row
def entityData(self, alarm): alarm_id = alarm.key().id() sensor_id = tools.getKey(Alarm, 'sensor', alarm, asID=False, asKeyName=True) sensor_name = self.sensor_lookup.get(sensor_id, "") rule_id = tools.getKey(Alarm, 'rule', alarm, asID=True) rule_name = str( self.rule_lookup.get( tools.getKey(Alarm, 'rule', alarm, asID=False), "")) apex = "%.2f" % alarm.apex if alarm.apex is not None else "--" row = [ "ID:%s" % alarm_id, "ID:%s" % sensor_id, sensor_name, "ID:%s" % rule_id, rule_name, apex, tools.sdatetime(alarm.dt_start), tools.sdatetime(alarm.dt_end) ] return row
def __evalFunction(self, toks): val = toks[0] fnName = val[0].upper() args = val[1:] args = [arg for arg in args if arg is not None] # Filter nones if not args: return 0 if fnName == 'SUM': return sum(args) elif fnName == 'AVE': from tools import average return average(args) elif fnName == 'MAX': return max(args) elif fnName == "MIN": return min(args) elif fnName == "COUNT": return len(args) elif fnName == "ALARMS": # Usage: ALARMS([rule_id]) # Returns list of alarms in processed batch, optionally filtered by rule_id alarm_list = list(self.alarm_list) if args and args[0].isdigit(): rule_id = int(args[0]) if rule_id: alarm_list.filter(lambda al: tools.getKey( Alarm, 'rule', al, asID=True) == rule_id) return alarm_list elif fnName == "DISTANCE": dist = 0 # self.prior_batch_last_record.columnValue() last_gp = None for gp in args: gp = tools.safe_geopoint(gp) if last_gp and gp: dist += tools.calcLocDistance(last_gp, gp) if gp: last_gp = gp return dist # m elif fnName == "SQRT": arg = args[0] return math.sqrt(arg) return 0
def __evalFunction(self, toks): val = toks[0] fnName = val[0].upper() args = val[1:] args = [arg for arg in args if arg is not None] # Filter nones if not args: return 0 if fnName == 'SUM': return sum(args) elif fnName == 'AVE': from tools import average return average(args) elif fnName == 'MAX': return max(args) elif fnName == "MIN": return min(args) elif fnName == "COUNT": return len(args) elif fnName == "ALARMS": # Usage: ALARMS([rule_id]) # Returns list of alarms in processed batch, optionally filtered by rule_id alarm_list = list(self.alarm_list) if args and args[0].isdigit(): rule_id = int(args[0]) if rule_id: alarm_list.filter(lambda al : tools.getKey(Alarm, 'rule', al, asID=True) == rule_id) return alarm_list elif fnName == "DISTANCE": dist = 0 # self.prior_batch_last_record.columnValue() last_gp = None for gp in args: gp = tools.safe_geopoint(gp) if last_gp and gp: dist += tools.calcLocDistance(last_gp, gp) if gp: last_gp = gp return dist # m elif fnName == "SQRT": arg = args[0] return math.sqrt(arg) return 0
def entityData(self, alarm): sensor_name = str(self.sensor_lookup.get(tools.getKey(Alarm, 'sensor', alarm, asID=False), "")) rule_name = str(self.rule_lookup.get(tools.getKey(Alarm, 'rule', alarm, asID=False), "")) apex = "%.2f" % alarm.apex if alarm.apex is not None else "--" row = [sensor_name, rule_name, apex, tools.sdatetime(alarm.dt_start), tools.sdatetime(alarm.dt_end)] return row, []
def entityData(self, alarm): sensor_name = self.sensor_lookup.get(tools.getKey(Alarm, 'sensor', alarm, asID=False), "") rule_name = str(self.rule_lookup.get(tools.getKey(Alarm, 'rule', alarm, asID=False), "")) apex = "%.2f" % alarm.apex if alarm.apex is not None else "--" row = [sensor_name, rule_name, apex, tools.sdatetime(alarm.dt_start), tools.sdatetime(alarm.dt_end)] return row
def __evalFunction(self, toks): val = toks[0] fnName = val[0].upper() args = val[1:] args = [arg for arg in args if arg is not None] # Filter nones if not args: return 0 if fnName == 'SUM': args = self.__getArglist(args) if args: return [sum(args)] return [0] elif fnName == 'AVE': from tools import average args = self.__getArglist(args) if args: return [average(args)] return [0] elif fnName == 'MAX': args = self.__getArglist(args) if args: res = max(args) return [res] return [0] elif fnName == "MIN": args = self.__getArglist(args) if args: return [min(args)] return [0] elif fnName == "COUNT": args = self.__getArglist(args) return [len(args)] elif fnName == "ALARMS": from models import Alarm # Usage: ALARMS([rule_id]) # Returns list of alarms in processed batch, optionally filtered by rule_id alarm_list = list(self.alarm_list) if args and type(args[0]) in [int, long, float]: rule_id = int(args[0]) if rule_id: alarm_list = [ al for al in alarm_list if tools.getKey( Alarm, 'rule', al, asID=True) == rule_id ] return [alarm_list] elif fnName == "DISTANCE": dist = 0 last_gp = None args = self.__getArglist(args) for gp in args: gp = tools.safe_geopoint(gp) if last_gp and gp: dist += tools.calcLocDistance(last_gp, gp) if gp: last_gp = gp return [dist] # m elif fnName == "SQRT": arg = args[0] return [math.sqrt(arg)] elif fnName == "SINCE": # Returns ms since event (argument), or 0 if none found event = args[0] since = 0 now = self.run_ms try: if event: if type(event) in [long, float]: # Treat as ms timestamp since = now - event elif isinstance(event, basestring): pass elif event.kind() == 'Alarm': since = now - tools.unixtime(event.dt_start) elif event.kind() == 'Record': since = now - tools.unixtime(event.dt_recorded) except Exception, e: logging.warning("Error in SINCE() - %s" % e) return [since]
class ExpressionParser(object): opMap = { "<": lambda a, b: a < b, "<=": lambda a, b: a <= b, ">": lambda a, b: a > b, ">=": lambda a, b: a >= b, "!=": lambda a, b: a != b, "==": lambda a, b: a == b, "AND": lambda a, b: a and b, "OR": lambda a, b: a or b # "NOT" : lambda x : not a } FUNCTIONS = [ "SUM", "AVE", "MAX", "MIN", "COUNT", "ALARMS", "DISTANCE", "SQRT", "SINCE", "LAST_ALARM", "NOW", "DOT", "DELTA" ] def __init__(self, expr, column=None, analysis=None, run_ms=0, verbose=False): self.verbose = verbose if self.verbose: logging.debug("Building expression parser for %s" % expr) self.expr = expr self.column = column self.analysis = analysis self.run_ms = run_ms self.record_list = [] self.alarm_list = [] self.record = None # TODO: Pass prior record for accurate calcuations such as distance # self.prior_batch_last_record = prior_batch_last_record self.pattern = self._getPattern() logging.debug("Initialized expression parser with expression: %s" % expr) # Generator to extract operators and operands in pairs def operatorOperands(self, tokenlist): it = iter(tokenlist) while 1: try: yield (it.next(), it.next()) except StopIteration: break def __normalizeNumeric(self, value): if not tools.is_numeric(value): # Handle unexpected text addition value = 0 return value def __evalCurrentValue(self, toks): return [self.analysis.columnValue(self.column, 0)] def __evalAggregateColumn(self, toks): column = toks[0] if not self.record_list: raise Exception( "Can't evaluate aggregate column without record list") if column == 'ts': res = [tools.unixtime(r.dt_recorded) for r in self.record_list] else: res = [r.columnValue(column, 0) for r in self.record_list] return [res] def __evalSingleColumn(self, toks): column = toks[0] if not self.record: raise Exception("Can't evaluate single column with no record") val = self.record.columnValue(column) return [val] def __multOp(self, toks): value = toks[0] _prod = self.__normalizeNumeric(value[0]) for op, val in self.operatorOperands(value[1:]): if op == '*': _prod *= val if op == '/': _prod /= val return _prod def __expOp(self, toks): value = toks[0] res = self.__normalizeNumeric(value[0]) for op, val in self.operatorOperands(value[1:]): if op == '^': res = pow(res, val) return res def __addOp(self, toks): value = toks[0] _sum = self.__normalizeNumeric(value[0]) for op, val in self.operatorOperands(value[1:]): if op == '+': _sum += val if op == '-': _sum -= val return _sum def __evalLogicOp(self, toks): args = toks[0] if self.verbose: logging.debug(args) val1 = args[0] for op, val in self.operatorOperands(args[1:]): fn = self.opMap[op] val2 = val val1 = fn(val1, val2) return val1 def __evalComparisonOp(self, tokens): args = tokens[0] val1 = args[0] for op, val in self.operatorOperands(args[1:]): fn = self.opMap[op] val2 = val if not fn(val1, val2): break val1 = val2 else: return True return False def __evalConstant(self, toks): return float(toks[0]) def __getArglist(self, args): if type(args) is list and len(args) > 0: first = args[0] if type(first) is list: return first return args return [] def __evalFunction(self, toks): val = toks[0] fnName = val[0].upper() args = val[1:] args = [arg for arg in args if arg is not None] # Filter nones if not args: return 0 if fnName == 'SUM': args = self.__getArglist(args) if args: return [sum(args)] return [0] elif fnName == 'AVE': from tools import average args = self.__getArglist(args) if args: return [average(args)] return [0] elif fnName == 'MAX': args = self.__getArglist(args) if args: res = max(args) return [res] return [0] elif fnName == "MIN": args = self.__getArglist(args) if args: return [min(args)] return [0] elif fnName == "COUNT": args = self.__getArglist(args) return [len(args)] elif fnName == "ALARMS": from models import Alarm # Usage: ALARMS([rule_id]) # Returns list of alarms in processed batch, optionally filtered by rule_id alarm_list = list(self.alarm_list) if args and type(args[0]) in [int, long, float]: rule_id = int(args[0]) if rule_id: alarm_list = [ al for al in alarm_list if tools.getKey( Alarm, 'rule', al, asID=True) == rule_id ] return [alarm_list] elif fnName == "DISTANCE": dist = 0 last_gp = None args = self.__getArglist(args) for gp in args: gp = tools.safe_geopoint(gp) if last_gp and gp: dist += tools.calcLocDistance(last_gp, gp) if gp: last_gp = gp return [dist] # m elif fnName == "SQRT": arg = args[0] return [math.sqrt(arg)] elif fnName == "SINCE": # Returns ms since event (argument), or 0 if none found event = args[0] since = 0 now = self.run_ms try: if event: if type(event) in [long, float]: # Treat as ms timestamp since = now - event elif isinstance(event, basestring): pass elif event.kind() == 'Alarm': since = now - tools.unixtime(event.dt_start) elif event.kind() == 'Record': since = now - tools.unixtime(event.dt_recorded) except Exception, e: logging.warning("Error in SINCE() - %s" % e) return [since] elif fnName == "LAST_ALARM": # Takes optional argument of rule ID to filter alarms from models import Alarm rule_id = None last_alarm = None if args: rule_id = int(args[0]) alarm_list = list(self.alarm_list) if alarm_list: if rule_id: alarm_list = [ al for al in alarm_list if tools.getKey( Alarm, 'rule', al, asID=True) == rule_id ] if alarm_list: last_alarm = sorted(alarm_list, key=lambda al: al.dt_end, reverse=True)[0] else: last_alarm = self.analysis.sensor.alarm_set.order( "-dt_end").get() return [last_alarm]
], }, }, ] WSGI_APPLICATION = 'Warbler.wsgi.application' # Database # https://docs.djangoproject.com/en/1.10/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'warbler', 'USER': '******', 'PASSWORD': getKey('warbler'), 'HOST': 'localhost', 'PORT': '3306', } } # Password validation # https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME':
def imageViewer(request, camID): if request.method == 'POST': form = photoForm(request.POST) if form.is_valid(): print 'a' print form.cleaned_data iso = form.cleaned_data['iso'] ss = form.cleaned_data['shutterspeed'] # get the camera camera = get_object_or_404(Camera, pk=camID) # get the computer computer = get_object_or_404(Computer, pk=camera.computer_id) # Get the current date time d = datetime.now() dt_file = d.strftime('%y%m%d_%H%M%S') dt_text = d.strftime('%H:%M:%S_-_%a_%d_%b_%Y') dt_mysql = d.strftime('%Y-%m-%d %H:%M:%S') # create a filename to save to. fname = "Cam{}_{}.jpg".format(camID, dt_file) # Add all of those details to the database. I = Image(camera=camera, filename=fname, exdate=dt_mysql, shutterspeed=ss, resw=720, resh=1280, text=dt_text) I.save() # connect to the computer ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy( )) # Shouldn't be neccesary, don't know why it # doesn't recognise host. ssh.connect(computer.ip_address, username=computer.user_name, password=getKey(computer.user_name)) #command = "cd Documents/Development/; python tools.py takePhoto --iso {} --ss {} --tt {} --fn {} --resw 720 --resh 1280".format(iso, ss, dt_text, fname) command = "cd Documents/Development/; python tools.py takePhoto --iso {} --ss {} --tt {} --fn {}".format( iso, ss, dt_text, fname) print command stdin, stdout, stderr = ssh.exec_command(command) # Some sort of error handling would be good... # print stderr.read() # Wait for long enough for the photo to be taken. sleep(45) ssh.close() # Now copy the file locally using sftp. transport = paramiko.Transport((computer.ip_address, 22)) transport.connect(username=computer.user_name, password=getKey(computer.user_name)) sftp = paramiko.SFTPClient.from_transport(transport) getFile = "Documents/Development/{}".format(fname) putFile = "webCam/static/webCam/images/{}".format(fname) sftp.get(getFile, putFile) sftp.close() transport.close() # Now delete the original #command = "rm Documents/Development/{}".format(fname) #stdin, stdout, stderr = ssh.exec_command(command) # Tell the database that the image is ready. I.status = 'Ready' address = "/static/webCam/images/" + fname return render(request, 'webCam/imageViewer.html', { 'camera': camID, 'address': address, 'form': form }) else: # Get the most recent image. form = photoForm() return render(request, 'webCam/imageViewer.html', { 'camera': camID, 'address': 'blahXXX.jpg', 'form': form }) """