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