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()