Changeset - ef97024d8644
[Not reviewed]
default
0 1 0
matthewreed - 9 years ago 2017-01-01 17:06:23

Added exception handling for database connection error in output logging
1 file changed with 16 insertions and 4 deletions:
0 comments (0 inline, 0 general)
hydrobot.py
Show inline comments
 
@@ -95,103 +95,115 @@ class Database:
 

	
 
class CanBus:
 
    
 
    def __init__(self, database):
 
        
 
        self.database = database
 
        self.dev = socketcan.SocketCanDev("can0")
 
        self.queue = queue.CanQueue(self.dev)
 
        
 
        parser = jsondb.JsonDbParser()
 
        self.msgdb = parser.parse('hydrobot_can.json')
 
        
 
        self.temp_msg = self.msgdb.AirSense
 
        self.relay_msg = self.msgdb.RelayDriveIn
 
        self.relay_send_msg = self.msgdb.RelayDriveOut
 
        
 
    def start(self):
 
        self.queue.start()
 
        _thread.start_new_thread(self.process_can, ())
 

	
 
    def process_can(self):
 
        while True:
 
            frame = self.queue.recv()
 
            if frame != None:
 
                message = self.msgdb.decode(frame)
 
                if message:
 
                    logger.debug("Received CAN message! ID: " + hex(message.id))
 
                    self.database.log_data(self.msgdb, message)
 
                
 
    def send_can(self):
 
        self.relay_send_msg.Nothing.value = 0
 
        if self.relay_send_msg.Output1.value == 0:
 
            self.relay_send_msg.Output1.value = 1
 
        else:
 
            self.relay_send_msg.Output1.value = 0
 
        self.relay_send_msg.Output2.value = 1
 
        self.relay_send_msg.Output3.value = 1
 
        self.relay_send_msg.Output4.value = 1
 
        logger.debug("Send CAN message! ID: " + hex(self.relay_send_msg.id) + " Data: " + str(self.relay_send_msg.data))
 
        self.queue.send(self.relay_send_msg.encode())
 
        
 
    def set_output(self, module, output, state):
 
        logger.info("Output! " + module + " " + output + " " + str(state))
 
        msg = self.msgdb.lookup_message(module)
 
        msg.lookup_signal(output).value = state
 
        self.queue.send(msg.encode())
 
        
 
        if msg.lookup_signal(output) == msg.Output1:
 
            MySeriesHelper(measurement='output_1', value=state)
 
            try:
 
                MySeriesHelper(measurement='output_1', value=state)
 
            except:
 
                logger.error("Could not connect to database")
 
        if msg.lookup_signal(output) == msg.Output2:
 
            MySeriesHelper(measurement='output_2', value=state)
 
            try:
 
                MySeriesHelper(measurement='output_2', value=state)
 
            except:
 
                logger.error("Could not connect to database")
 
        if msg.lookup_signal(output) == msg.Output3:
 
            MySeriesHelper(measurement='output_3', value=state)
 
            try:
 
                MySeriesHelper(measurement='output_3', value=state)
 
            except:
 
                logger.error("Could not connect to database")
 
        if msg.lookup_signal(output) == msg.Output4:
 
            MySeriesHelper(measurement='output_4', value=state)
 
            try:
 
                MySeriesHelper(measurement='output_4', value=state)
 
            except:
 
                logger.error("Could not connect to database")
 
        
 
        
 
class Scheduler:
 
    
 
    def __init__(self, canbus):
 
        self.canbus = canbus
 
        self.apscheduler = BackgroundScheduler()
 
        self.apscheduler.configure(timezone=timezone('US/Eastern'))
 
        
 
    def start(self):
 
        self.apscheduler.start()
 
        
 
        for section in config.sections():
 
            if "timer" in section:
 
                items = config.items(section)
 
                for item in items:
 
                    if item[0] == 'trigger':
 
                        trigger = item[1]
 
                    if item[0] == 'module':
 
                        module = item[1]
 
                    if item[0] == 'output':
 
                        output = item[1]
 
                    if item[0] == 'on_time':
 
                        on_time = ast.literal_eval(item[1])
 
                    if item[0] == 'off_time':
 
                        off_time = ast.literal_eval(item[1])
 
                    if item[0] == 'on_duration':
 
                        on_duration = ast.literal_eval(item[1])
 
                    if item[0] == 'off_duration':
 
                        off_duration = ast.literal_eval(item[1])
 
                if trigger == 'cron':
 
                    on_job = self.apscheduler.add_job(self.canbus.set_output, trigger, [module, output, 1], day = on_time[0], day_of_week = on_time[1], hour = on_time[2], minute = on_time[3], second = on_time[4])
 
                    off_job = self.apscheduler.add_job(self.canbus.set_output, trigger, [module, output, 0], day = off_time[0], day_of_week = off_time[1], hour = off_time[2], minute = off_time[3], second = off_time[4])
 
                    
 
                    #evalute the current state of the cron trigger and set output on if needed
 
                    if on_job.next_run_time > off_job.next_run_time:
 
                        self.canbus.set_output(module, output, 1)
 
                    else:
 
                        self.canbus.set_output(module, output, 0)
 
                    
 
                if trigger == 'interval':
 
                    self.apscheduler.add_job(self.interval_off, trigger, [module, output, section + "_off", section + "_on", on_duration], id = section + "_off", weeks = off_duration[0], days = off_duration[1], hours = off_duration[2], minutes = off_duration[3], seconds = off_duration[4])
 
                    timer = self.apscheduler.add_job(self.interval_on, trigger, [module, output, section + "_off", section + "_on", off_duration], id = section + "_on", weeks = on_duration[0], days = on_duration[1], hours = on_duration[2], minutes = on_duration[3], seconds = on_duration[4])
 
                    timer.pause()
 
                    self.interval_off(module, output, section + "_off", section + "_on", on_duration)
 
                    
 
            if "pid" in section:
 
                items = config.items(section)
0 comments (0 inline, 0 general)