commit inicial
This commit is contained in:
parent
debdf76342
commit
b255f4256b
1
node-red/flows.json
Normal file
1
node-red/flows.json
Normal file
File diff suppressed because one or more lines are too long
159
py/python-obd-device.py
Normal file
159
py/python-obd-device.py
Normal file
@ -0,0 +1,159 @@
|
||||
#!/usr/bin/python
|
||||
|
||||
import obd
|
||||
from obd import OBDStatus
|
||||
|
||||
from paho.mqtt import client as mqtt_client
|
||||
import json
|
||||
import time
|
||||
|
||||
class mqtt_handle:
|
||||
def __init__(self, broker, port, topic, client_id, user, password):
|
||||
self.broker = broker
|
||||
self.port = port
|
||||
self.topic = topic
|
||||
self.client_id = client_id
|
||||
self.user = user
|
||||
self.password = password
|
||||
|
||||
def connect(self):
|
||||
def on_connect(client, userdata, flags, rc):
|
||||
if rc == 0:
|
||||
print("Connect OK!")
|
||||
client.subscribe("$SYS/#")
|
||||
else:
|
||||
print(f"Connect fail! RC: {rc}")
|
||||
|
||||
self.client = mqtt_client.Client(self.client_id)
|
||||
self.client.username_pw_set(self.user, self.password)
|
||||
self.client.on_connect = on_connect
|
||||
try:
|
||||
self.client.loop_start()
|
||||
self.client.connect(self.broker, self.port, 60)
|
||||
except:
|
||||
print("Rede tem problemas!")
|
||||
|
||||
def publish(self, data):
|
||||
result = self.client.publish(self.topic, data)
|
||||
status = result[0]
|
||||
if status == 0:
|
||||
print(f"Msg enviada ao topico `{self.topic}`")
|
||||
else:
|
||||
print(f"Falha ao enviar msg no topico `{self.topic}`")
|
||||
|
||||
class dados:
|
||||
def __init__(self):
|
||||
self.timestamp = 0
|
||||
self.RPM = 0
|
||||
self.VELOCIDADE = 0.0
|
||||
self.PEDAL_ACELERADOR = 0.0
|
||||
self.TEMPERATURA_INTAKE = 0
|
||||
self.TEMPERATURA_ARREFECIMENTO = 0
|
||||
self.MIL = False
|
||||
self.FREEZE_FRAME = None
|
||||
|
||||
def toJson(self):
|
||||
out = {
|
||||
"timestamp": self.timestamp,
|
||||
"RPM" : self.RPM,
|
||||
"SPD" : self.VELOCIDADE,
|
||||
"PDL" : self.PEDAL_ACELERADOR,
|
||||
"INT" : self.TEMPERATURA_INTAKE,
|
||||
"COL" : self.TEMPERATURA_ARREFECIMENTO,
|
||||
"TRB" : self.MIL,
|
||||
"ERR" : self.FREEZE_FRAME
|
||||
}
|
||||
return json.dumps(out, indent = 4)
|
||||
|
||||
class freeze_frame:
|
||||
def __init__(self):
|
||||
self.DTC = None
|
||||
self.LISTA_DTC = None
|
||||
self.RPM = 0
|
||||
self.VELOCIDADE = 0.0
|
||||
self.PEDAL_ACELERADOR = 0.0
|
||||
self.TEMPERATURA_INTAKE = 0.0
|
||||
self.TEMPERATURA_ARREFECIMENTO = 0.0
|
||||
|
||||
# Para criar o cliente mqtt:
|
||||
# hostname, porta, topico, client_id, usuario, senha
|
||||
cliente_mqtt = mqtt_handle("XXXXXX", 1883, "XXXXXX/XXXXXX", "XXXXXX", "XXXXXX", "XXXXXX")
|
||||
cliente_mqtt.connect()
|
||||
|
||||
#porta OBD
|
||||
porta = "XXXXXX"
|
||||
con = obd.OBD(porta)
|
||||
while True:
|
||||
print(con.status())
|
||||
if con.status() == OBDStatus.CAR_CONNECTED:
|
||||
data = dados()
|
||||
print("Coletando dados...")
|
||||
try:
|
||||
rpm = con.query(obd.commands.RPM)
|
||||
speed = con.query(obd.commands.SPEED)
|
||||
pedal = con.query(obd.commands.THROTTLE_POS)
|
||||
trouble = con.query(obd.commands.STATUS)
|
||||
coolant = con.query(obd.commands.COOLANT_TEMP)
|
||||
intake = con.query(obd.commands.INTAKE_TEMP)
|
||||
except:
|
||||
print("FAIL RECV DATA")
|
||||
con.close()
|
||||
con = obd.OBD(porta)
|
||||
continue
|
||||
|
||||
if not rpm.is_null():
|
||||
dados.RPM = rpm.value.magnitude
|
||||
|
||||
if not speed.is_null():
|
||||
dados.VELOCIDADE = speed.value.magnitude
|
||||
|
||||
if not pedal.is_null():
|
||||
dados.PEDAL_ACELERADOR = pedal.value.magnitude
|
||||
|
||||
if not trouble.is_null():
|
||||
dados.MIL = trouble.value.MIL
|
||||
|
||||
if not coolant.is_null():
|
||||
dados.TEMPERATURA_ARREFECIMENTO = coolant.value.magnitude
|
||||
|
||||
if not intake.is_null():
|
||||
dados.TEMPERATURA_INTAKE = intake.value.magnitude
|
||||
|
||||
|
||||
if dados.MIL == True:
|
||||
frame = freeze_frame()
|
||||
try:
|
||||
errors = con.query(obd.commands.GET_DTC)
|
||||
if not errors.is_null():
|
||||
frame.LISTA_DTC = errors.value
|
||||
errors = con.query(obd.commands.FREEZE_DTC)
|
||||
frame.DTC = errors.value
|
||||
errors = con.query(obd.commands.DTC_RPM)
|
||||
frame.RPM = errors.value.magnitude
|
||||
errors = con.query(obd.commands.DTC_SPEED)
|
||||
frame.VELOCIDADE = errors.value.magnitude
|
||||
errors = con.query(obd.commands.DTC_THROTTLE_POS)
|
||||
frame.PEDAL_ACELERADOR = errors.value.magnitude
|
||||
errors = con.query(obd.commands.DTC_INTAKE_TEMP)
|
||||
frame.TEMPERATURA_INTAKE = errors.value.magnitude
|
||||
errors = con.query(obd.commands.DTC_COOLANT_TEMP)
|
||||
frame.TEMPERATURA_ARREFECIMENTO = errors.value.magnitude
|
||||
dados.FREEZE_FRAME = frame
|
||||
except:
|
||||
print("FAIL RECV DATA")
|
||||
con.close()
|
||||
con = obd.OBD(porta)
|
||||
continue
|
||||
|
||||
dados.timestamp = int(time.time())
|
||||
try:
|
||||
cliente_mqtt.publish(dados.toJson)
|
||||
except:
|
||||
print("FAIL SEND")
|
||||
else:
|
||||
print("FAIL CONNECT CAR")
|
||||
con.close()
|
||||
con = obd.OBD(porta)
|
||||
con.close()
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user