コード例 #1
0
ファイル: master_controller.py プロジェクト: Telson/hapi
def validate_pin_modes(online_rtus):
    logger.info("Validating pin modes...")
    problem_rtus = []
    #return []

    # Check pin mode settings
    for rtu in online_rtus:
        target_rtu = rtu_comm.RTUCommunicator()
        pmode_from_rtu = target_rtu.send_to_rtu(rtu.address, 80, 1, "gpm")
        pmode_from_rtu = pmode_from_rtu[0:str.find(pmode_from_rtu, "{")]

        pmode_from_db = ""
        for db_pin_mode in sorted(rtu.pin_modes.values(),
                                  key=operator.attrgetter('pos')):
            pmode_from_db += db_pin_mode.pin
            pmode_from_db += str(db_pin_mode.mode)

        pin_mode_ok = True
        for i in range(0, len(pmode_from_rtu) - 2):
            if pmode_from_rtu[i] != pmode_from_db[i]:
                pin_mode_ok = False
                print "Mismatch at", i
        if pin_mode_ok == False:
            logger.warning("RTU " + rtu.rtuid +
                           " has an incongruent pin mode.")
            logger.warning("RTU pins: " + pmode_from_rtu)
            logger.warning("DB pins: " + pmode_from_db)
            problem_rtus.append(rtu)
        else:
            logger.info("Pin mode congruence verified between " + rtu.rtuid +
                        " and the database.")
    return problem_rtus
コード例 #2
0
ファイル: master_controller.py プロジェクト: Telson/hapi
 def get_asset_value(self, asset_name):
     value = ""
     assets = get_assets()
     try:
         for asset in assets:
             print "!" + asset_name + "!" + "!" + asset.name + "!"
             if asset_name == asset.name.lower().strip():
                 for rtu in self.rtus:
                     print rtu.rtuid, asset.rtuid
                     if rtu.rtuid == asset.rtuid:
                         try:
                             print 'Getting asset value', asset.name, "from", asset.rtuid
                             command = "env"
                             target_rtu = rtu_comm.RTUCommunicator()
                             data = target_rtu.send_to_rtu(
                                 rtu.address, 80, 5, command)
                             print data
                             parsed_json = json.loads(data)
                             asset.value = parsed_json[asset.pin]
                             asset.timestamp = datetime.datetime.now()
                             print asset.name, "is", asset.value
                             value = str(asset.value)
                         except Exception, excpt:
                             self.logger.exception(
                                 "Error getting asset data: %s", excpt)
     except Exception, excpt:
         self.logger.exception("Error getting asset data: %s", excpt)
コード例 #3
0
ファイル: master_controller.py プロジェクト: rebelclause/hapi
    def check_alerts(self):
        assets = self.get_assets()
        alert_params = get_alert_params()
        self.logger.info("Checking site for alert conditions.")
        print "Found", len(alert_params), "alert parameters."
        try:
            for alert_param in alert_params:
                for asset in assets:
                    if alert_param.asset_id == asset.asset_id:
                        for rtu in self.rtus:
                            if rtu.rtuid == asset.rtuid:
                                try:
                                    print 'Getting asset status', asset.name, "from", asset.rtuid
                                    command = "env"
                                    target_rtu = rtu_comm.RTUCommunicator()
                                    data = target_rtu.send_to_rtu(rtu.address, 80, 5, command)
                                    print data
                                    parsed_json = json.loads(data)
                                    asset.value = parsed_json[asset.pin]
                                    asset.timestamp = datetime.datetime.now()
                                    print asset.name, "is", asset.value
                                    print "Lower Threshold is", alert_param.lower_threshold
                                    print "Upper Threshold is", alert_param.upper_threshold
                                    if (float(asset.value) < alert_param.lower_threshold) or (float(asset.value) > alert_param.upper_threshold):
                                        alert = Alert()
                                        alert.asset_id = asset.asset_id
                                        alert.value = asset.value
                                        log_alert_condition(alert, self.logger)
                                        send_alert_condition(self, asset, alert, alert_param, self.logger)
                                except Exception, excpt:
                                    self.logger.exception("Error getting asset data: %s", excpt)

        except Exception, excpt:
            self.logger.exception("Error getting asset data: %s", excpt)
コード例 #4
0
ファイル: master_controller.py プロジェクト: rebelclause/hapi
 def process_sequence(self, seq_jobs, job, job_rtu, seq_result):
     for row in seq_jobs:
         seq_result.put("Running " + row[0] + ":" + row[2] + "(" + command + ")" + " on " + job.rtuid + " at " + job_rtu.address + ".")
         command = row[1].encode("ascii")
         timeout = int(row[3])
         target_rtu = rtu_comm.RTUCommunicator()
         seq_result.put(target_rtu.send_to_rtu(job_rtu.address, 80, 10, command) + "\r\n")
         seq_result.put("Sleeping for", timeout, "seconds.")
         time.sleep(timeout)
コード例 #5
0
ファイル: master_controller.py プロジェクト: rebelclause/hapi
    def command_cmd(self, params):
        '''<command to be run on connected RTU>
        Sends a command to the connected RTU

        '''
        if the_rtu == None:
            self.writeresponse("You are not connected to an RTU.")
        else:
            command = params[0]

            self.writeresponse("Executing " + command + " on " + the_rtu.rtuid + "...")
            target_rtu = rtu_comm.RTUCommunicator()
            response = target_rtu.send_to_rtu(the_rtu.address, 80, 1, command)
            self.writeresponse(response)
            job = IntervalJob()
            job.job_name = command
            job.rtuid = the_rtu.rtuid
            log_command(job)
コード例 #6
0
ファイル: master_controller.py プロジェクト: rebelclause/hapi
    def discover_rtus(self):
        valid_ip_addresses = self.scan_for_rtus()
        self.rtus = []

        for ip_address in valid_ip_addresses:
            self.logger.info("Connecting to RTU at " + ip_address)
            try:
                target_rtu = rtu_comm.RTUCommunicator()
                response = target_rtu.send_to_rtu(ip_address, 80, 5, "sta").split('\r\n')
                self.logger.info(response[0] + " at " + ip_address + " is running " + response[1])
                rtu = RemoteTerminalUnit()
                rtu.rtuid = response[0]
                rtu.address = ip_address
                rtu.version = response[1]
                rtu.online = True
                # get_pin_modes(rtu)
                self.rtus.append(rtu)
            except Exception, excpt:
                self.logger.exception("Error communicating with rtu at " + ip_address + ": %s", excpt)
コード例 #7
0
ファイル: master_controller.py プロジェクト: Telson/hapi
    def command_connect(self, params):
        '''<Name of RTU>
        Connects to the specified RTU

        '''
        global the_rtu
        PROMPT = "HAPI> "
        rtu_name = params[0]

        the_rtu = None
        for rtu in site.rtus:
            if rtu.rtuid.lower() == rtu_name.lower():
                the_rtu = rtu
        if the_rtu != None:
            self.writeresponse("Connecting to " + rtu_name + "...")
            target_rtu = rtu_comm.RTUCommunicator()
            response = target_rtu.send_to_rtu(the_rtu.address, 80, 3, "env")
            self.writeresponse(response)
        else:
            self.writeresponse(rtu_name + " is not online at this site.")
コード例 #8
0
ファイル: master_controller.py プロジェクト: rebelclause/hapi
 def set_asset_value(self, asset_name, value):
     data = ""
     assets = self.get_assets()
     try:
         for asset in assets:
             print "!" + asset_name + "!" + "!" + asset.name + "!"
             if asset_name == asset.name.lower().strip():
                 for rtu in self.rtus:
                     print rtu.rtuid, asset.rtuid 
                     if rtu.rtuid == asset.rtuid:
                         try:
                             print 'Setting asset value', asset.name, "from", asset.rtuid
                             command = "doc" + asset.pin + value
                             print "set_asset_value: " + command
                             target_rtu = rtu_comm.RTUCommunicator()
                             data = target_rtu.send_to_rtu(rtu.address, 80, 5, command)
                         except Exception, excpt:
                             self.logger.exception("Error getting asset data: %s", excpt)
     except Exception, excpt:
         self.logger.exception("Error getting asset data: %s", excpt)
コード例 #9
0
ファイル: master_controller.py プロジェクト: Telson/hapi
    def assets_by_context(self, context):
        result_assets = []

        assets = get_assets()
        for asset in assets:
            if asset.context.lower() == context.lower():
                if asset.rtuid != "virtual":
                    for rtu in self.rtus:
                        if rtu.rtuid == asset.rtuid:
                            try:
                                print 'Getting asset status', asset.name, "from", asset.rtuid
                                command = "env"
                                target_rtu = rtu_comm.RTUCommunicator()
                                data = target_rtu.send_to_rtu(
                                    rtu.address, 80, 5, command)
                                print data
                                parsed_json = json.loads(data)
                                asset.value = parsed_json[asset.pin]
                                asset.timestamp = datetime.datetime.now()
                                print asset.name, "is", asset.value
                                result_assets.append(asset)
                            except Exception, excpt:
                                self.logger.exception(
                                    "Error getting asset data: %s", excpt)
                else:
                    # For virtual assets, assume that the data is already parsed JSON
                    try:
                        for asset in assets:
                            if asset.rtuid == "virtual":
                                if asset.abbreviation == "weather":
                                    asset.value = float(
                                        str(data[asset.pin]).replace("%", ""))
                                    asset.timestamp = '"' + str(
                                        datetime.datetime.now()) + '"'
                                    result_assets.append(asset)
                    except Exception, excpt:
                        error = "Error getting virtual asset data: " + excpt
                        print error
                        if logger != None:
                            logger.exception(error)
コード例 #10
0
ファイル: master_controller.py プロジェクト: Telson/hapi
    def run_job(self, job):
        if self.running == True:
            command = ""
            response = ""
            job_rtu = None

            if job.enabled == 1:
                print "Job enabled"
                print "Job rtuid", job.rtuid
                print "Job command", job.command
                print "Job sequence", job.sequence
                if job.sequence is None:
                    job.sequence = ""

                if job.rtuid.lower() == "virtual":
                    print 'Running on virtual RTU', job.command, "on", job.rtuid
                    try:
                        response = eval(job.command)
                        # if job.command != "spin":
                        #     log_sensor_data(response, True, self.logger)
                    except Exception, excpt:
                        error = "Error running job " + job.job_name + " on " + job_rtu.rtuid + ": " + excpt
                        print error
                        if self.logger != None:
                            self.logger.exception(error)
                else:
                    try:
                        for rtu_el in self.site.rtus:
                            if rtu_el.rtuid == job.rtuid:
                                if rtu_el.online == 1:
                                    job_rtu = rtu_el

                        if (job_rtu != None):
                            if str.strip(job.sequence) != "":
                                print 'Running sequence', job.sequence, "on", job.rtuid

                                conn = sqlite3.connect('hapi.db')
                                c = conn.cursor()
                                seq_jobs = c.execute(
                                    'SELECT name, command, step_name, timeout FROM sequence WHERE name = "'
                                    + job.sequence + '" ORDER BY step ;')
                                print "len(seq_jobs) = " + str(len(seq_jobs))
                                p = Process(target=self.process_sequence,
                                            args=(
                                                seq_jobs,
                                                job,
                                                job_rtu,
                                                seq_result,
                                            ))
                                p.start()
                                conn.close()
                            else:
                                print 'Running command', job.command, "on", job.rtuid
                                command = job.command
                                target_rtu = rtu_comm.RTUCommunicator()
                                response = target_rtu.send_to_rtu(
                                    job_rtu.address, 80, job.timeout, command)

                                if (job.job_name == "Log Data"):
                                    log_sensor_data(response, False,
                                                    self.logger)
                                elif (job.job_name == "Log Status"):
                                    pass
                                else:
                                    log_command(job)
                        else:
                            print "Could not find rtu."
                            if self.logger != None:
                                self.logger.info("Could not find rtu " +
                                                 job.rtuid)

                    except Exception, excpt:
                        logger.exception('Error running job: %s', excpt)