Files @ a5b830d92afd
Branch filter:

Location: HydroBot/hydrobot-software/hydrobot.py - annotation

matthewreed
Added some scheduling and other updates
d1142fbbace4
1aa7eed26cdb
1aa7eed26cdb
a5b830d92afd
d1142fbbace4
d1142fbbace4
1aa7eed26cdb
1aa7eed26cdb
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
d1142fbbace4
1aa7eed26cdb
a5b830d92afd
1aa7eed26cdb
1aa7eed26cdb
d1142fbbace4
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
1aa7eed26cdb
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
1aa7eed26cdb
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
d1142fbbace4
daaed5044a8c
daaed5044a8c
daaed5044a8c
1aa7eed26cdb
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
a5b830d92afd
a5b830d92afd
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
1aa7eed26cdb
daaed5044a8c
daaed5044a8c
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
1aa7eed26cdb
1aa7eed26cdb
d1142fbbace4
daaed5044a8c
daaed5044a8c
daaed5044a8c
daaed5044a8c
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
a5b830d92afd
d1142fbbace4
1aa7eed26cdb
a5b830d92afd
a5b830d92afd
a5b830d92afd
1aa7eed26cdb
1aa7eed26cdb
1aa7eed26cdb
1aa7eed26cdb
1aa7eed26cdb
1aa7eed26cdb
import sys
import time
import _thread
from canard import can, messaging
from canard.hw import socketcan
from canard.file import jsondb
from influxdb import InfluxDBClient
import configparser
from apscheduler.schedulers.background import BackgroundScheduler
from datetime import datetime
import os

#TODO
#fix temperature offset
#database serial thing
#database time interval logging
#add system name to database

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

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)
                    }
                }
            ]
            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)
                    }
                }
            ]
            self.client.write_points(json_body)


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

        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:
                if DEBUG_CAN:
                    print("Received CAN message! ID: " + hex(message.id))
                for s in message._signals.values():
                    if DEBUG_CAN_DETAIL:
                        print(s)
                        print(s.value)
                    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
        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 set_output(self, module, output, state):
        print(self.msgdb)
        print(module)
        #msg = self.msgdb.module
        print(msg)

def main():
    
    database = Database()
    canbus = CanBus(database)
    canbus.start()
    canbus.start_receive()
    
    scheduler = BackgroundScheduler()
    #scheduler.add_job(canbus.send_can, 'interval', seconds=10)
    trigger = config.get("timer1", "trigger")
    scheduler.add_job(canbus.send_can, trigger, second = 0)
    trigger = config.get("timer2", "trigger")
    scheduler.add_job(canbus.send_can, trigger, seconds = 10)
    scheduler.start()

    while True:
        module = config.get("timer1", "module")
        output = config.get("timer1", "output")
        #canbus.set_output(module, output, 1)
        
        time.sleep(1)
        

if __name__ == "__main__":
    main()