def setAlarmState(alarmState): if alarmState not in AlarmState: logger.info("Unknown alarm state: " + alarmState) raise Exception("Unknown alarm state: " + alarmState) setDesiredAlarmState(alarmState) setDesiredAlarmStateDelay(str(datetime.datetime.now())) logger.info("Capturing state lock") with stateLock: currentAlarmState = getCurrentAlarmState() timeDelta = getLastStateChangeTimeDelta() if alarmState != currentAlarmState: logger.info("Setting Alarm state to: " + alarmState) setPreviousAlarmState(currentAlarmState) writeStringValue(alarmStateKey, alarmState) setLastStateChangeTime() setGuiUpdateTime() subject = "Alarm state is: " + alarmState + " at " + getNowStr() body = "Previous state was " + currentAlarmState + "." longbeep() sendEmail(mailto, subject, body) else: if alarmState != 'RELAXED': subject = "Alarm state is: " + alarmState body = "Alarm state has been " + alarmState + " for " + convert_timedelta_str( timeDelta) + "." sendEmail(mailto, subject, body) logger.info("We are already in state: " + alarmState + ". Nothing to do.")
def setDelayedAlarmState (alarmState, delay, desiredStateAlreadySet = False): if alarmState not in AlarmState: logger.info("Unknown alarm state: " + alarmState) raise Exception("Unknown alarm state: " + alarmState) if desiredStateAlreadySet == False: setDesiredAlarmState(alarmState) setDesiredAlarmStateDelay(str(datetime.datetime.now() + datetime.timedelta(seconds=delay))) else: logger.info("Desired state has already been set.") currentAlarmState = getCurrentAlarmState() timeDelta = getLastStateChangeTimeDelta() if alarmState != currentAlarmState: desiredAlarmStateDelay = getDesiredAlarmStateDelay() while True: secondsLeft = secondsLeftFromString(desiredAlarmStateDelay) if secondsLeft < 0: break logger.info("Setting state: " + alarmState + " after " + str(secondsLeft) + " seconds.") sleep(1) currentDesiredAlarmState = getDesiredAlarmState() if (currentDesiredAlarmState != alarmState): logger.info("Not setting State!!. The current desired state is: " + currentDesiredAlarmState + " and we were waiting to set it to " + alarmState) return setAlarmState(alarmState) alarmState = getCurrentAlarmState() logger.info("Alarm state has been updated to: " + alarmState) else: if alarmState != 'RELAXED': subject = "Alarm state is: " + alarmState body = "Alarm state has been " + alarmState + " for " + convert_timedelta_str(timeDelta) + "." sendEmail(mailto, subject, body) logger.info("We are already in state: " + alarmState + ". Nothing to do.")
def panic(nodeId=None, info=None, siren=True): with panicLock: logger.info("Panic called.") timeDelta = getLastPanicTimeDelta() if timeDelta.total_seconds() <= ignoreRePanicWithinSeconds: logger.info("Last panic was " + convert_timedelta_str(timeDelta) + " ago. Ignoring.") return setLastPanicTime() setPanic(True) # for now, just send an email. subject = "Alarm! Alarm! Alarm!" body = "Siren sounded at: " + getNowStr() + ".\n" if info is not None: body += info body += "\n\n" if nodeId is not None: body += getNodeReport(nodeId) body += "\n\n" if siren is True: soundSirens() pass logger.info(body) sendEmail(mailto, subject, body) sendEmail(panicMailto, subject, info)
def setAlarmState(alarmState): if alarmState not in AlarmState: logger.info("Unknown alarm state: " + alarmState) raise Exception("Unknown alarm state: " + alarmState) setDesiredAlarmState(alarmState) setDesiredAlarmStateDelay(str(datetime.datetime.now())) logger.info("Capturing state lock") with stateLock: currentAlarmState = getCurrentAlarmState() timeDelta = getLastStateChangeTimeDelta() if alarmState != currentAlarmState: logger.info("Setting Alarm state to: " + alarmState) setPreviousAlarmState(currentAlarmState) writeStringValue(alarmStateKey, alarmState) setLastStateChangeTime() setGuiUpdateTime() subject = "Alarm state is: " + alarmState + " at " + getNowStr() body = "Previous state was " + currentAlarmState + "." longbeep() sendEmail(mailto, subject, body) else: if alarmState != 'RELAXED': subject = "Alarm state is: " + alarmState body = "Alarm state has been " + alarmState + " for " + convert_timedelta_str(timeDelta) + "." sendEmail(mailto, subject, body) logger.info("We are already in state: " + alarmState + ". Nothing to do.")
def AlertIfArmed(nodeId, current, previous): with alertLock: name = getNodeName(nodeId) alarmState = getCurrentAlarmState() if (alarmState != "DISARMED"): logger.info("Sensor tripped on node " + name + " in alarm state: " + alarmState + " on " + str(current.time)) timeDelta = getLastAlertTimeDelta() if timeDelta.total_seconds() <= ignoreReAlertWithinSeconds: logger.info("Last alert was " + convert_timedelta_str(timeDelta) + " ago. Ignoring.") return setLastAlertTime() alarmStateDelay = getAlarmStateDelayForNode(nodeId, alarmState) if alarmStateDelay is None: logger.info("No delay defined for alarm state: [" + alarmState + "]. Defaulting to 10 seconds.") alarmStateDelay = 10 then = datetime.datetime.now() + datetime.timedelta(seconds=alarmStateDelay) setAlertPanicTime(str(then)) logger.info("We are in the following armed state: [" + alarmState + "]. Siren will be enabled in " + str(alarmStateDelay) + " seconds") subject = "[" + alarmState + "] Sensor tripped on node " + name + " on " + str(current.time) body = "Siren will fire in " + str(alarmStateDelay) + " seconds at " + str(then) sendEmail(mailto, subject, body) sleepWithBeep(then) # Now check is enduser has been able to disarm the alarm if (getCurrentAlarmState() != "DISARMED"): notification = getLatestNotification(nodeId) panic(nodeId = nodeId, info = "Triggered by " + name + ". " + name + " is currently " + getSensorState(notification.value) + ".") else: sendEmail(mailto, "Alarm disarmed in time!", "") logger.info("Alarm disarmed in time!") resetAlertPanicTime()
def setDelayedAlarmState(alarmState, delay, desiredStateAlreadySet=False): if alarmState not in AlarmState: logger.info("Unknown alarm state: " + alarmState) raise Exception("Unknown alarm state: " + alarmState) if desiredStateAlreadySet == False: setDesiredAlarmState(alarmState) setDesiredAlarmStateDelay( str(datetime.datetime.now() + datetime.timedelta(seconds=delay))) else: logger.info("Desired state has already been set.") currentAlarmState = getCurrentAlarmState() timeDelta = getLastStateChangeTimeDelta() if alarmState != currentAlarmState: desiredAlarmStateDelay = getDesiredAlarmStateDelay() while True: secondsLeft = secondsLeftFromString(desiredAlarmStateDelay) if secondsLeft < 0: break logger.info("Setting state: " + alarmState + " after " + str(secondsLeft) + " seconds.") sleep(1) currentDesiredAlarmState = getDesiredAlarmState() if (currentDesiredAlarmState != alarmState): logger.info("Not setting State!!. The current desired state is: " + currentDesiredAlarmState + " and we were waiting to set it to " + alarmState) return setAlarmState(alarmState) alarmState = getCurrentAlarmState() logger.info("Alarm state has been updated to: " + alarmState) else: if alarmState != 'RELAXED': subject = "Alarm state is: " + alarmState body = "Alarm state has been " + alarmState + " for " + convert_timedelta_str( timeDelta) + "." sendEmail(mailto, subject, body) logger.info("We are already in state: " + alarmState + ". Nothing to do.")
def panic (nodeId = None, info = None, siren = True): with panicLock: logger.info("Panic called.") timeDelta = getLastPanicTimeDelta() if timeDelta.total_seconds() <= ignoreRePanicWithinSeconds: logger.info("Last panic was " + convert_timedelta_str(timeDelta) + " ago. Ignoring.") return setLastPanicTime() setPanic(True) # for now, just send an email. subject = "Alarm! Alarm! Alarm!" body = "Siren sounded at: " + getNowStr() + ".\n" if info is not None: body += info body += "\n\n" if nodeId is not None: body += getNodeReport(nodeId) body += "\n\n" if siren is True: soundSirens() pass logger.info(body) sendEmail(mailto, subject, body) sendEmail(panicMailto, subject, info)
import cgi, cgitb cgitb.enable() exitdelay = "" desiredstate = "" already = "" arguments = cgi.FieldStorage() if "exitdelay" in arguments: exitdelay = arguments["exitdelay"].value if "desiredstate" in arguments: desiredstate = arguments["desiredstate"].value if "already" in arguments: already = arguments["already"].value currentAlarmState = getCurrentAlarmState() print 'Content-Type: text/html' print # HTTP says you have to have a blank line between headers and content print '<html>' print ' <head>' print ' <title>Current state is ' + currentAlarmState + '</title>' print ' </head>' print ' <body>' print ' <h1> Current state is ' + currentAlarmState + '</h1>' if desiredstate != currentAlarmState: if exitdelay and desiredstate: print ' <h6> Setting state to ' + desiredstate + ' after exit delay of ' + exitdelay + ' seconds</h6>' print ' <h6> State has been ' + getCurrentAlarmState() + ' for ' + convert_timedelta_str(getLastStateChangeTimeDelta()) + ' since ' + str(getLastStateChangeTime()) + '</h6>' print ' <button onClick="window.location=\'' + getBaseUrl() + '/raspwave/controlpanel.py\'" style="font: bold 60px Arial">Back to Control Panel</button><br><br>' print ' </body>' print '</html>'
logger = setupCronbotLogger() mailto = getMailto() maxCloseTimeInSeconds = 28440 now = datetime.datetime.now() for node in getNodes(): if not isDoorWindowOrMotion(node): continue name = getNodeName(node) logger.info("Testing node: " + node + ":" + name) notification = getEarliestNotificationOfCurrentState(node, logger=logger) if not notification: logger.info("No notifications for node: " + name) elif (notification.value == 'False'): delta = now - notification.time logger.info(name + " has been closed for " + convert_timedelta_str(delta)) if delta.total_seconds() > maxCloseTimeInSeconds: subject = name + " has been closed for " + convert_timedelta_str( delta) sendEmail(mailto, subject, getNodeReport(node)) elif (notification.value == 'True'): delta = now - notification.time logger.info(name + " has been open for " + convert_timedelta_str(delta)) else: logger.info("Can not determine state of: " + getNodeName(node) + " since it is [" + notification.value + "]")
print # HTTP says you have to have a blank line between headers and content print '<!DOCTYPE html>' print '<html>' print ' <head>' print ' <title> Raspwave Alarm Control Panel </title>' print ' </head>' # print ' <body onload=\'launchRedraw(\"page\", false)\'>' print ' <body>' print ' <div id="main">' print ' <p id="message">' currentAlarmState = getCurrentAlarmState() desiredAlarmState = getDesiredAlarmState() if currentAlarmState != desiredAlarmState: desiredAlarmStateDelay = getDesiredAlarmStateDelay() print 'Desired alarm state ' + desiredAlarmState + ' will be set after exit delay of ' + convert_timedelta_str( getDesiredAlarmStateDelayAsTime() - datetime.datetime.now()) + ' at ' + desiredAlarmStateDelay print ' </p>' print ' <p id="message2">' alertPanicTimeDelta = getAlertPanicTimeDelta() if alertPanicTimeDelta.total_seconds() < 0: print 'Alarm system has been tripped! Siren will fire at ' + str( getAlertPanicTime()) print ' </p>' print ' <form>' print ' <h3> Alarm State </h3>' for state in AlarmState: color = "" if desiredAlarmState == state: #color = "color:grey;border-style:inset;" color = "color:grey;"
from Utils import convert_timedelta_str from RobotUtils import sendEmail from LoggerUtils import setupCronbotLogger logger = setupCronbotLogger() mailto = getMailto() maxOpenTimeInSeconds = 240 now = datetime.datetime.now() for node in getNodes(): if not isDoorWindowOrMotion(node): continue name = getNodeName(node) logger.info("Testing node: " + node + ":" + name) notification = getEarliestNotificationOfCurrentState(node, logger=logger) if not notification: logger.info("No notifications for node: " + name) elif notification.value == "False": delta = now - notification.time logger.info(name + " has been closed for " + convert_timedelta_str(delta)) elif notification.value == "True": delta = now - notification.time logger.info(name + " has been open for " + convert_timedelta_str(delta)) if delta.total_seconds() > maxOpenTimeInSeconds: subject = name + " has been open for " + convert_timedelta_str(delta) sendEmail(mailto, subject, getNodeReport(node)) else: logger.info("Can not determine state of: " + getNodeName(node) + " since it is [" + notification.value + "]")
desiredstate = "" already = "" arguments = cgi.FieldStorage() if "exitdelay" in arguments: exitdelay = arguments["exitdelay"].value if "desiredstate" in arguments: desiredstate = arguments["desiredstate"].value if "already" in arguments: already = arguments["already"].value currentAlarmState = getCurrentAlarmState() print 'Content-Type: text/html' print # HTTP says you have to have a blank line between headers and content print '<html>' print ' <head>' print ' <title>Current state is ' + currentAlarmState + '</title>' print ' </head>' print ' <body>' print ' <h1> Current state is ' + currentAlarmState + '</h1>' if desiredstate != currentAlarmState: if exitdelay and desiredstate: print ' <h6> Setting state to ' + desiredstate + ' after exit delay of ' + exitdelay + ' seconds</h6>' print ' <h6> State has been ' + getCurrentAlarmState( ) + ' for ' + convert_timedelta_str( getLastStateChangeTimeDelta()) + ' since ' + str( getLastStateChangeTime()) + '</h6>' print ' <button onClick="window.location=\'' + getBaseUrl( ) + '/raspwave/controlpanel.py\'" style="font: bold 60px Arial">Back to Control Panel</button><br><br>' print ' </body>' print '</html>'
from Utils import convert_timedelta_str from RobotUtils import sendEmail from LoggerUtils import setupCronbotLogger logger = setupCronbotLogger() mailto = getMailto() maxOpenTimeInSeconds = 240 now = datetime.datetime.now() for node in getNodes(): if not isDoorWindowOrMotion(node): continue name = getNodeName(node) logger.info("Testing node: " + node + ":" + name) notification = getEarliestNotificationOfCurrentState(node, logger=logger) if not notification: logger.info("No notifications for node: " + name) elif (notification.value == 'False'): delta = now - notification.time logger.info(name + " has been closed for " + convert_timedelta_str(delta)) elif (notification.value == 'True'): delta = now - notification.time logger.info(name + " has been open for " + convert_timedelta_str(delta)) if delta.total_seconds() > maxOpenTimeInSeconds: subject = name + " has been open for " + convert_timedelta_str(delta) sendEmail(mailto, subject, getNodeReport(node)); else: logger.info("Can not determine state of: " + getNodeName(node) + " since it is [" + notification.value + "]")
print 'Content-Type: text/html' print # HTTP says you have to have a blank line between headers and content print '<!DOCTYPE html>' print '<html>' print ' <head>' print ' <title> Raspwave Alarm Control Panel </title>' print ' </head>' # print ' <body onload=\'launchRedraw(\"page\", false)\'>' print ' <body>' print ' <div id="main">' print ' <p id="message">' currentAlarmState = getCurrentAlarmState() desiredAlarmState = getDesiredAlarmState() if currentAlarmState != desiredAlarmState: desiredAlarmStateDelay = getDesiredAlarmStateDelay() print 'Desired alarm state ' + desiredAlarmState + ' will be set after exit delay of ' + convert_timedelta_str(getDesiredAlarmStateDelayAsTime() - datetime.datetime.now()) + ' at ' + desiredAlarmStateDelay print ' </p>' print ' <p id="message2">' alertPanicTimeDelta = getAlertPanicTimeDelta() if alertPanicTimeDelta.total_seconds() < 0: print 'Alarm system has been tripped! Siren will fire at ' + str(getAlertPanicTime()) print ' </p>' print ' <form>' print ' <h3> Alarm State </h3>' for state in AlarmState: color = "" if desiredAlarmState == state: #color = "color:grey;border-style:inset;" color = "color:grey;" if currentAlarmState == state: #color = "color:red;border-style:inset;"