Changeset - daaed5044a8c
[Not reviewed]
default
0 1 0
matthewreed - 9 years ago 2016-07-16 15:28:53

Converted to more object oriented structure
1 file changed with 108 insertions and 89 deletions:
hydrobot.py
108
89
0 comments (0 inline, 0 general)
hydrobot.py
Show inline comments
 
@@ -9,112 +9,131 @@ import configparser
 

	
 
config = configparser.ConfigParser()
 
config.read("config.txt")
 
DEBUG_CAN = config.getboolean("debug", "can")
 
DEBUG_CAN_DETAIL = config.getboolean("debug", "can_detail")
 

	
 
def log_data(msgdb, client, message):
 
    if message == msgdb.AirSense:
 
        json_body = [
 
            {
 
                "measurement": "air_temp",
 
                "fields": {
 
                    "value": (float)(message.Temperature.value)
 
                }
 
            },
 
            {
 
                "measurement": "air_humidity",
 
                "fields": {
 
                    "value": (float)(message.Humidity.value)
 
                }
 
            },
 
            {
 
                "measurement": "air_pressure",
 
                "fields": {
 
                    "value": (float)(message.Pressure.value)
 
                }
 
            }
 
        ]
 
        client.write_points(json_body)
 
    if message == msgdb.RelayDriveIn:
 
        json_body = [
 
            {
 
                "measurement": "input_1",
 
                "fields": {
 
                    "value": (float)(message.Input1.value)
 
                }
 
            },
 
            {
 
                "measurement": "input_2",
 
                "fields": {
 
                    "value": (float)(message.Input2.value)
 
class Database:
 
    
 
    def __init__(self):
 
        host = config.get("database", "host")
 
        port = config.get("database", "port")
 
        username = config.get("database", "username")
 
        password = config.get("database", "password")
 
        database = config.get("database", "database")
 
        self.client = InfluxDBClient(host, port, username, password, database)
 

	
 
    def log_data(self, msgdb, message):
 
        if message == msgdb.AirSense:
 
            json_body = [
 
                {
 
                    "measurement": "air_temp",
 
                    "fields": {
 
                        "value": (float)(message.Temperature.value)
 
                    }
 
                },
 
                {
 
                    "measurement": "air_humidity",
 
                    "fields": {
 
                        "value": (float)(message.Humidity.value)
 
                    }
 
                },
 
                {
 
                    "measurement": "air_pressure",
 
                    "fields": {
 
                        "value": (float)(message.Pressure.value)
 
                    }
 
                }
 
            },
 
            {
 
                "measurement": "input_3",
 
                "fields": {
 
                    "value": (float)(message.Input3.value)
 
            ]
 
            self.client.write_points(json_body)
 
        if message == msgdb.RelayDriveIn:
 
            json_body = [
 
                {
 
                    "measurement": "input_1",
 
                    "fields": {
 
                        "value": (float)(message.Input1.value)
 
                    }
 
                },
 
                {
 
                    "measurement": "input_2",
 
                    "fields": {
 
                        "value": (float)(message.Input2.value)
 
                    }
 
                },
 
                {
 
                    "measurement": "input_3",
 
                    "fields": {
 
                        "value": (float)(message.Input3.value)
 
                    }
 
                },
 
                {
 
                    "measurement": "input_4",
 
                    "fields": {
 
                        "value": (float)(message.Input4.value)
 
                    }
 
                }
 
            },
 
            {
 
                "measurement": "input_4",
 
                "fields": {
 
                    "value": (float)(message.Input4.value)
 
                }
 
            }
 
        ]
 
        client.write_points(json_body)
 
            ]
 
            self.client.write_points(json_body)
 

	
 

	
 
class CanBus:
 
    
 
    def __init__(self, database):
 
        
 
        self.database = database
 

	
 
def process_can(dev, msgdb, client):
 
    while True:
 
        frame = dev.recv()
 
        message = msgdb.decode(frame)
 
        if message:
 
            for s in message._signals.values():
 
                if DEBUG_CAN:
 
                    print("Received CAN message! ID: " + hex(message.id))
 
                if DEBUG_CAN_DETAIL:
 
                    print(s)
 
                    print(s.value)
 
                log_data(msgdb, client, message)
 
        self.dev = socketcan.SocketCanDev("can0")
 
        
 
        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.dev.start()
 
        
 
    def start_receive(self):
 
        _thread.start_new_thread(self.process_can, ())
 

	
 
    def process_can(self):
 
        while True:
 
            frame = self.dev.recv()
 
            message = self.msgdb.decode(frame)
 
            if message:
 
                for s in message._signals.values():
 
                    if DEBUG_CAN:
 
                        print("Received CAN message! ID: " + hex(message.id))
 
                    if DEBUG_CAN_DETAIL:
 
                        print(s)
 
                        print(s.value)
 
                    self.database.log_data(self.msgdb, message)
 
                
 
def send_can(dev, msgdb, relay_send_msg):
 
    relay_send_msg.Nothing.value = 0
 
    relay_send_msg.Output1.value = 0
 
    relay_send_msg.Output2.value = 0
 
    relay_send_msg.Output3.value = 0
 
    relay_send_msg.Output4.value = 0
 
    if DEBUG_CAN:
 
        print("Send CAN message! ID: " + hex(relay_send_msg.id))
 
    if DEBUG_CAN_DETAIL:
 
        print(relay_send_msg)
 
    dev.send(relay_send_msg.encode())
 
    def send_can(self):
 
        self.relay_send_msg.Nothing.value = 0
 
        self.relay_send_msg.Output1.value = 0
 
        self.relay_send_msg.Output2.value = 0
 
        self.relay_send_msg.Output3.value = 0
 
        self.relay_send_msg.Output4.value = 0
 
        if DEBUG_CAN:
 
            print("Send CAN message! ID: " + hex(self.relay_send_msg.id))
 
        if DEBUG_CAN_DETAIL:
 
            print(self.relay_send_msg)
 
        self.dev.send(self.relay_send_msg.encode())
 
    
 

	
 
def main():
 
    host = config.get("database", "host")
 
    port = config.get("database", "port")
 
    username = config.get("database", "username")
 
    password = config.get("database", "password")
 
    database = config.get("database", "database")
 
    client = InfluxDBClient(host, port, username, password, database)
 

	
 
    parser = jsondb.JsonDbParser()
 
    msgdb = parser.parse('hydrobot_can.json')
 
    temp_msg = msgdb.AirSense
 
    relay_msg = msgdb.RelayDriveIn
 
    relay_send_msg = msgdb.RelayDriveOut
 

	
 
    dev = socketcan.SocketCanDev("can0")
 
    dev.start()
 
    
 
    _thread.start_new_thread(process_can, (dev, msgdb, client))
 
    database = Database()
 
    canbus = CanBus(database)
 
    canbus.start()
 
    canbus.start_receive()
 

	
 
    while True:
 
        
 
        send_can(dev, msgdb, relay_send_msg)
 
        canbus.send_can()
 
        time.sleep(1)
 
        
 

	
 
if __name__ == "__main__":
 
    main()
0 comments (0 inline, 0 general)