Exemplo n.º 1
0
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.")
Exemplo n.º 2
0
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.")
Exemplo n.º 3
0
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)
Exemplo n.º 4
0
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.")
Exemplo n.º 5
0
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()
Exemplo n.º 6
0
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.")
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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>'
Exemplo n.º 9
0
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 + "]")
Exemplo n.º 10
0
 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;"
Exemplo n.º 11
0
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 + "]")
Exemplo n.º 12
0
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>'
Exemplo n.º 13
0
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 + "]")
Exemplo n.º 14
0
    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;"