Changeset - 1aa7eed26cdb
[Not reviewed]
default
0 3 1
matthewreed - 9 years ago 2016-07-16 14:42:20

Added database logging, threading, and config files.
4 files changed with 157 insertions and 28 deletions:
0 comments (0 inline, 0 general)
config_example.txt
Show inline comments
 
new file 100644
 
[database]
 
host: www.protofusion.org
 
port: 8086
 
username: username
 
password: password
 
database: hydrobot
 

	
 
[debug]
 
can: True
 
can_detail: False
hydrobot.py
Show inline comments
 
import sys
 
from phant import Phant
 
import time
 
import _thread
 
from canard import can, bus
 
from canard.hw import socketcan
 
from canard.file import jsondb
 
from influxdb import InfluxDBClient
 
import configparser
 

	
 
p = Phant(jsonPath='keys_m3KwkGKYoxsrqoxpDePxhj8660L.json')
 
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)
 
                }
 
            },
 
            {
 
                "measurement": "input_3",
 
                "fields": {
 
                    "value": (float)(message.Input3.value)
 
                }
 
            },
 
            {
 
                "measurement": "input_4",
 
                "fields": {
 
                    "value": (float)(message.Input4.value)
 
                }
 
            }
 
        ]
 
        client.write_points(json_body)
 
    
 

	
 
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)
 
                
 
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 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()
 
b = parser.parse('hydrobot_can.json')
 
temp_msg = b.get_message("AirTemp")
 
    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))
 

	
 
while True:
 
    frame = dev.recv()
 
    print(frame)
 
    
 
    signals = b.parse_frame(frame)
 
    if signals:
 
        for s in signals:
 
            print(s)
 
            print(s.value)
 
        send_can(dev, msgdb, relay_send_msg)
 
        time.sleep(1)
 
    
 
    temp = temp_msg.get_signal("Temperature").value
 
    humid = temp_msg.get_signal("Humidity").value
 
    press = temp_msg.get_signal("Pressure").value
 
    
 
    p.log(humid, press, temp)
 
    print(p.remaining_bytes, p.cap)
 

	
 
if __name__ == "__main__":
 
    main()
hydrobot_can.json
Show inline comments
 
@@ -2,11 +2,42 @@
 
{
 
    "messages": [
 
        {
 
        "name": "AirTemp",
 
        "id": "0x100",
 
        "signals": {"0": {"name": "Temperature", "bit_length": 16, "factor": 0.1, "offset": -40, "unit": "C"},
 
                    "16": {"name": "Humidity", "bit_length": 16, "factor": 0.01, "offset": 0, "unit": "%"},
 
                    "32": {"name": "Pressure", "bit_length": 16, "factor": 0.1, "offset": 0, "unit": "kPa"}
 
        "name": "AirSense",
 
        "id": "0x202",
 
        "signals": { "0": {"name": "Nothing", "bit_length": 16, "factor": 1, "offset": 0, "unit": ""},
 
                    "16": {"name": "Temperature", "bit_length": 16, "factor": 0.01, "offset": 0, "unit": "C"},
 
                    "32": {"name": "Humidity", "bit_length": 16, "factor": 0.01, "offset": 0, "unit": "%RH"},
 
                    "48": {"name": "Pressure", "bit_length": 16, "factor": 0.1, "offset": 0, "unit": "hPa"}
 
                   }
 
        },
 
        {
 
        "name": "RelayDriveOut",
 
        "id": "0x203",
 
        "signals": { "0": {"name": "Nothing", "bit_length": 32, "factor": 1, "offset": 0, "unit": ""},
 
                    "32": {"name": "Output1", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"},
 
                    "40": {"name": "Output2", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"},
 
                    "48": {"name": "Output3", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"},
 
                    "56": {"name": "Output4", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"}
 
                   }
 
        },
 
        {
 
        "name": "RelayDriveIn",
 
        "id": "0x204",
 
        "signals": { "0": {"name": "Nothing", "bit_length": 32, "factor": 1, "offset": 0, "unit": ""},
 
                    "32": {"name": "Input1", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"},
 
                    "40": {"name": "Input2", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"},
 
                    "48": {"name": "Input3", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"},
 
                    "56": {"name": "Input4", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"}
 
                   }
 
        },
 
        {
 
        "name": "Stuff",
 
        "id": "0x205",
 
        "signals": { "0": {"name": "Nothing", "bit_length": 32, "factor": 1, "offset": 0, "unit": ""},
 
                    "32": {"name": "Input1", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"},
 
                    "40": {"name": "Input2", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"},
 
                    "48": {"name": "Input3", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"},
 
                    "56": {"name": "Input4", "bit_length": 8, "factor": 1, "offset": 0, "unit": "bool"}
 
                   }
 
        }
 
    ]
hydrobot_sensor_sim.py
Show inline comments
 
@@ -20,12 +20,12 @@ while True:
 
    humid = max(0x00, min(0xFF, random.randint(-1, 1)/100 + humid))
 
    press = max(0x00, min(0xFF, random.randint(-1, 1) + press))
 
    
 
    message = b.get_message("AirTemp")
 
    message.get_signal("Temperature").value = temp
 
    message.get_signal("Humidity").value = humid
 
    message.get_signal("Pressure").value = press
 
    print(b.AirTemp.Temperature.value)
 
    
 
    frame = b.build_frame("AirTemp")
 
    dev.send(frame)
 
    b.AirTemp.Temperature.value = temp
 
    b.AirTemp.Humidity.value = humid
 
    b.AirTemp.Pressure.value = press
 
    
 
    dev.send(b.AirTemp.encode())
 
    
 
    time.sleep(1)
0 comments (0 inline, 0 general)