Files
@ 1aa7eed26cdb
Branch filter:
Location: HydroBot/hydrobot-software/hydrobot.py
1aa7eed26cdb
3.4 KiB
text/x-python
Added database logging, threading, and config files.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | import sys
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
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()
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:
send_can(dev, msgdb, relay_send_msg)
time.sleep(1)
if __name__ == "__main__":
main()
|