# HG changeset patch # User matthewreed # Date 2016-07-16 14:42:20 # Node ID 1aa7eed26cdbbf8981f4a008aa29a60269ac5c02 # Parent 94cab616b578e6d48b5c4bc6757fe66c86110a7b Added database logging, threading, and config files. diff --git a/config_example.txt b/config_example.txt new file mode 100644 --- /dev/null +++ b/config_example.txt @@ -0,0 +1,10 @@ +[database] +host: www.protofusion.org +port: 8086 +username: username +password: password +database: hydrobot + +[debug] +can: True +can_detail: False diff --git a/hydrobot.py b/hydrobot.py --- a/hydrobot.py +++ b/hydrobot.py @@ -1,32 +1,120 @@ 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 - -p = Phant(jsonPath='keys_m3KwkGKYoxsrqoxpDePxhj8660L.json') +from influxdb import InfluxDBClient +import configparser -parser = jsondb.JsonDbParser() -b = parser.parse('hydrobot_can.json') -temp_msg = b.get_message("AirTemp") +config = configparser.ConfigParser() +config.read("config.txt") +DEBUG_CAN = config.getboolean("debug", "can") +DEBUG_CAN_DETAIL = config.getboolean("debug", "can_detail") -dev = socketcan.SocketCanDev("can0") -dev.start() - -while True: - frame = dev.recv() - print(frame) +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) - signals = b.parse_frame(frame) - if signals: - for s in signals: - print(s) - print(s.value) + +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()) - temp = temp_msg.get_signal("Temperature").value - humid = temp_msg.get_signal("Humidity").value - press = temp_msg.get_signal("Pressure").value + +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() - p.log(humid, press, temp) - print(p.remaining_bytes, p.cap) + _thread.start_new_thread(process_can, (dev, msgdb, client)) + while True: + + send_can(dev, msgdb, relay_send_msg) + time.sleep(1) + + +if __name__ == "__main__": + main() diff --git a/hydrobot_can.json b/hydrobot_can.json --- a/hydrobot_can.json +++ b/hydrobot_can.json @@ -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"} } } ] diff --git a/hydrobot_sensor_sim.py b/hydrobot_sensor_sim.py --- a/hydrobot_sensor_sim.py +++ b/hydrobot_sensor_sim.py @@ -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)