Tracker und MQTT code
This commit is contained in:
parent
14108b1165
commit
e738438a94
|
@ -37,6 +37,15 @@ port = /dev/ttyACM0
|
||||||
navobj = ~/.opencpn/navobj.xml
|
navobj = ~/.opencpn/navobj.xml
|
||||||
config = ~/.opencpn/opencpn.conf
|
config = ~/.opencpn/opencpn.conf
|
||||||
|
|
||||||
|
[tracker]
|
||||||
|
type = NONE
|
||||||
|
host = 127.0.0.1
|
||||||
|
port = 1883
|
||||||
|
mqtt_user = demo
|
||||||
|
mqtt_pass = 123456
|
||||||
|
orgname = demo
|
||||||
|
passcode = 123456
|
||||||
|
|
||||||
[settings]
|
[settings]
|
||||||
timezone = 1
|
timezone = 1
|
||||||
boat_draft = 1.3
|
boat_draft = 1.3
|
||||||
|
|
80
obp60v.py
80
obp60v.py
|
@ -107,6 +107,8 @@ from nmea2000 import parser
|
||||||
import nmea0183
|
import nmea0183
|
||||||
import pages
|
import pages
|
||||||
import struct
|
import struct
|
||||||
|
import uuid
|
||||||
|
import json
|
||||||
|
|
||||||
__author__ = "Thomas Hooge"
|
__author__ = "Thomas Hooge"
|
||||||
__copyright__ = "Copyleft 2024-2025, all rights reversed"
|
__copyright__ = "Copyleft 2024-2025, all rights reversed"
|
||||||
|
@ -123,9 +125,58 @@ cfg = {
|
||||||
'devclass': 120, # Display
|
'devclass': 120, # Display
|
||||||
'industrygroup': 4, # Marine
|
'industrygroup': 4, # Marine
|
||||||
'gps': False,
|
'gps': False,
|
||||||
'bme280': False
|
'bme280': False,
|
||||||
|
'tracker': { 'type': 'NONE' }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def mqtt_on_connect(client, userdata, flags, rc):
|
||||||
|
print(f"MQTT connected with result code {rc}")
|
||||||
|
client.subscribe("regattahero/orgstatus/thomas")
|
||||||
|
#client.subscribe(topic_racestatus)
|
||||||
|
|
||||||
|
def mqtt_on_message(client, userdata, msg):
|
||||||
|
"""
|
||||||
|
TODO raceid über userdata? dann topic prüfen?
|
||||||
|
"""
|
||||||
|
if msg.topic == "regattahero/orgstatus/thomas":
|
||||||
|
orgstatus = json.loads(msg.payload)
|
||||||
|
if orgstatus['allLogout']:
|
||||||
|
print("All logout received!")
|
||||||
|
client.disconnect()
|
||||||
|
sys.exit(0)
|
||||||
|
if orgstatus['message']:
|
||||||
|
# TODO Alarm-Funktion nutzen?
|
||||||
|
print("Nachricht der Wettfahrtkeitung:")
|
||||||
|
print(orgstatus['message'])
|
||||||
|
#for r in orgstatus['races']:
|
||||||
|
# print(f"Race: {r}")
|
||||||
|
elif msg.topic.startswith("regattahero/racestatus/thomas"):
|
||||||
|
racestatus = json.loads(msg.payload)
|
||||||
|
print(racestatus)
|
||||||
|
else:
|
||||||
|
print(f"UNKNOWN TOPIC: {msg.topic}")
|
||||||
|
print(msg.payload)
|
||||||
|
|
||||||
|
def mqtt_tracker(cfg):
|
||||||
|
import paho.mqtt.client as mqtt
|
||||||
|
print("MQTT tracker enabled")
|
||||||
|
print(cfg)
|
||||||
|
client = mqtt.Client()
|
||||||
|
client.on_connect = mqtt_on_connect
|
||||||
|
client.on_message = mqtt_on_message
|
||||||
|
client.username_pw_set(username=cfg['mqtt_user'], password=cfg['mqtt_pass'])
|
||||||
|
try:
|
||||||
|
client.connect(cfg['host'], cfg['port'], 60)
|
||||||
|
except ConnectionRefusedError:
|
||||||
|
print("MQTT connection refused. Check username and password.")
|
||||||
|
return
|
||||||
|
client.loop_start()
|
||||||
|
while not shutdown:
|
||||||
|
time.sleep(1)
|
||||||
|
#TODO publish here
|
||||||
|
client.loop_stop()
|
||||||
|
client.disconnect()
|
||||||
|
|
||||||
def rxd_n2k(device):
|
def rxd_n2k(device):
|
||||||
setthreadtitle("N2Klistener")
|
setthreadtitle("N2Klistener")
|
||||||
bus = can.Bus(interface='socketcan', channel=device, bitrate=250000);
|
bus = can.Bus(interface='socketcan', channel=device, bitrate=250000);
|
||||||
|
@ -685,7 +736,8 @@ if __name__ == "__main__":
|
||||||
|
|
||||||
# Basiskonfiguration aus Datei lesen
|
# Basiskonfiguration aus Datei lesen
|
||||||
config = configparser.ConfigParser()
|
config = configparser.ConfigParser()
|
||||||
ret = config.read(os.path.join(sys.path[0], cfg['cfgfile']))
|
config_path = os.path.join(sys.path[0], cfg['cfgfile'])
|
||||||
|
ret = config.read(config_path)
|
||||||
if len(ret) == 0:
|
if len(ret) == 0:
|
||||||
print("Konfigurationsdatei '{}' konnte nicht gelesen werden!".format(cfg['cfgfile']))
|
print("Konfigurationsdatei '{}' konnte nicht gelesen werden!".format(cfg['cfgfile']))
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
@ -730,6 +782,27 @@ if __name__ == "__main__":
|
||||||
history = History("press", 75)
|
history = History("press", 75)
|
||||||
boatdata.addHistory(history, "press")
|
boatdata.addHistory(history, "press")
|
||||||
|
|
||||||
|
# Tracker data
|
||||||
|
cfg['tracker']['type'] = config.get('tracker', 'type')
|
||||||
|
cfg['tracker']['host'] = config.get('tracker', 'host')
|
||||||
|
cfg['tracker']['port'] = config.getint('tracker', 'port')
|
||||||
|
cfg['tracker']['mqtt_user'] = config.get('tracker', 'mqtt_user')
|
||||||
|
cfg['tracker']['mqtt_pass'] = config.get('tracker', 'mqtt_pass')
|
||||||
|
cfg['tracker']['orgname'] = config.get('tracker', 'orgname')
|
||||||
|
cfg['tracker']['passcode'] = config.get('tracker', 'passcode')
|
||||||
|
|
||||||
|
# Client UUID. Automatisch erzeugen wenn noch nicht vorhanden
|
||||||
|
create_uuid = False
|
||||||
|
try:
|
||||||
|
cfg['tracker']['uuid'] = config.get('tracker', 'uuid')
|
||||||
|
except configparser.NoOptionError:
|
||||||
|
create_uuid = True
|
||||||
|
if create_uuid or (len(cfg['tracker']['uuid']) != 36):
|
||||||
|
cfg['tracker']['uuid'] = str(uuid.uuid4())
|
||||||
|
config.set('tracker', 'uuid', cfg['tracker']['uuid'])
|
||||||
|
with open(config_path, 'w') as fh:
|
||||||
|
config.write(fh)
|
||||||
|
|
||||||
if cfg['simulation']:
|
if cfg['simulation']:
|
||||||
boatdata.enableSimulation()
|
boatdata.enableSimulation()
|
||||||
|
|
||||||
|
@ -757,6 +830,9 @@ if __name__ == "__main__":
|
||||||
print("Networking enabled")
|
print("Networking enabled")
|
||||||
t_rxd_net = threading.Thread(target=rxd_network, args=(cfg['net_port'],cfg['net_addr']))
|
t_rxd_net = threading.Thread(target=rxd_network, args=(cfg['net_port'],cfg['net_addr']))
|
||||||
t_rxd_net.start()
|
t_rxd_net.start()
|
||||||
|
if cfg['tracker']['type'] != 'NONE':
|
||||||
|
t_tracker = threading.Thread(target=mqtt_tracker, args=(cfg['tracker'],))
|
||||||
|
t_tracker.start()
|
||||||
if not cfg['simulation']:
|
if not cfg['simulation']:
|
||||||
if cfg['bme280']:
|
if cfg['bme280']:
|
||||||
t_data = threading.Thread(target=datareader, args=(cfg, history))
|
t_data = threading.Thread(target=datareader, args=(cfg, history))
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
import cairo
|
||||||
|
from .page import Page
|
||||||
|
|
||||||
|
class Tracker(Page):
|
||||||
|
|
||||||
|
def __init__(self, pageno, cfg, boatdata):
|
||||||
|
super().__init__(pageno, cfg, boatdata)
|
||||||
|
|
||||||
|
def draw(self, ctx):
|
||||||
|
# Name
|
||||||
|
ctx.select_font_face("Ubuntu", cairo.FontSlant.NORMAL, cairo.FontWeight.BOLD)
|
||||||
|
ctx.set_font_size(60)
|
||||||
|
ctx.move_to(20, 100)
|
||||||
|
ctx.show_text("Tracker")
|
||||||
|
|
Loading…
Reference in New Issue