diff --git a/meshtastic_utils.py b/meshtastic_utils.py index 11f4dd3..6c49d88 100644 --- a/meshtastic_utils.py +++ b/meshtastic_utils.py @@ -2,8 +2,8 @@ import asyncio import time import meshtastic.tcp_interface import meshtastic.serial_interface +import meshtastic.ble_interface from typing import List - from config import relay_config from log_utils import get_logger from db_utils import get_longname, get_shortname @@ -13,10 +13,8 @@ matrix_rooms: List[dict] = relay_config["matrix_rooms"] logger = get_logger(name="Meshtastic") - meshtastic_client = None - def connect_meshtastic(force_connect=False): global meshtastic_client if meshtastic_client and not force_connect: @@ -33,58 +31,52 @@ def connect_meshtastic(force_connect=False): ) attempts = 1 successful = False - if connection_type == "serial": - serial_port = relay_config["meshtastic"]["serial_port"] - logger.info(f"Connecting to serial port {serial_port} ...") - while not successful and attempts <= retry_limit: - try: - meshtastic_client = meshtastic.serial_interface.SerialInterface( - serial_port - ) - successful = True - except Exception as e: - attempts += 1 - if attempts <= retry_limit: - logger.warn( - f"Attempt #{attempts-1} failed. Retrying in {attempts} secs {e}" - ) - time.sleep(attempts) - else: - logger.error(f"Could not connect: {e}") - return None - else: - target_host = relay_config["meshtastic"]["host"] - logger.info(f"Connecting to host {target_host} ...") - while not successful and attempts <= retry_limit: - try: - meshtastic_client = meshtastic.tcp_interface.TCPInterface( - hostname=target_host - ) - successful = True - except Exception as e: - attempts += 1 - if attempts <= retry_limit: - logger.warn( - f"Attempt #{attempts-1} failed. Retrying in {attempts} secs... {e}" - ) - time.sleep(attempts) - else: - logger.error(f"Could not connect: {e}") - return None - nodeInfo = meshtastic_client.getMyNodeInfo() - logger.info( - f"Connected to {nodeInfo['user']['shortName']} / {nodeInfo['user']['hwModel']}" - ) + while not successful and attempts <= retry_limit: + try: + if connection_type == "serial": + serial_port = relay_config["meshtastic"]["serial_port"] + logger.info(f"Connecting to serial port {serial_port} ...") + meshtastic_client = meshtastic.serial_interface.SerialInterface(serial_port) + + elif connection_type == "ble": + ble_address = relay_config["meshtastic"].get("ble_address") + ble_name = relay_config["meshtastic"].get("ble_name") + + if ble_address: + logger.info(f"Connecting to BLE address {ble_address} ...") + meshtastic_client = meshtastic.ble_interface.BLEInterface(address=ble_address) + elif ble_name: + logger.info(f"Connecting to BLE name {ble_name} ...") + meshtastic_client = meshtastic.ble_interface.BLEInterface(address=ble_name) + else: + logger.error("No BLE address or name provided.") + return None + + else: + target_host = relay_config["meshtastic"]["host"] + logger.info(f"Connecting to host {target_host} ...") + meshtastic_client = meshtastic.tcp_interface.TCPInterface(hostname=target_host) + + successful = True + nodeInfo = meshtastic_client.getMyNodeInfo() + logger.info(f"Connected to {nodeInfo['user']['shortName']} / {nodeInfo['user']['hwModel']}") + + except Exception as e: + attempts += 1 + if attempts <= retry_limit: + logger.warn(f"Attempt #{attempts-1} failed. Retrying in {attempts} secs {e}") + time.sleep(attempts) + else: + logger.error(f"Could not connect: {e}") + return None + return meshtastic_client - def on_lost_meshtastic_connection(interface): logger.error("Lost connection. Reconnecting...") connect_meshtastic(force_connect=True) - -# Callback for new messages from Meshtastic def on_meshtastic_message(packet, loop=None): from matrix_utils import matrix_relay @@ -113,9 +105,7 @@ def on_meshtastic_message(packet, loop=None): logger.debug(f"Skipping message from unmapped channel {channel}") return - logger.info( - f"Processing inbound radio message from {sender} on channel {channel}" - ) + logger.info(f"Processing inbound radio message from {sender} on channel {channel}") longname = get_longname(sender) or sender shortname = get_shortname(sender) or sender @@ -142,9 +132,7 @@ def on_meshtastic_message(packet, loop=None): if found_matching_plugin: return - logger.info( - f"Relaying Meshtastic message from {longname} to Matrix: {formatted_message}" - ) + logger.info(f"Relaying Meshtastic message from {longname} to Matrix: {formatted_message}") for room in matrix_rooms: if room["meshtastic_channel"] == channel: @@ -173,6 +161,4 @@ def on_meshtastic_message(packet, loop=None): ) found_matching_plugin = result.result() if found_matching_plugin: - logger.debug( - f"Processed {portnum} with plugin {plugin.plugin_name}" - ) + logger.debug(f"Processed {portnum} with plugin {plugin.plugin_name}") diff --git a/sample_config.yaml b/sample_config.yaml index 54ed440..bb76e5c 100644 --- a/sample_config.yaml +++ b/sample_config.yaml @@ -10,11 +10,13 @@ matrix_rooms: # Needs at least 1 room & channel, but supports all Meshtastic cha meshtastic_channel: 2 meshtastic: - connection_type: serial # Choose either "network" or "serial" + connection_type: serial # Choose either "network", "serial", or "ble" serial_port: /dev/ttyUSB0 # Only used when connection is "serial" host: "meshtastic.local" # Only used when connection is "network" + ble_address: "AA:BB:CC:DD:EE:FF" # Only used when connection is "ble" - Choose one. If used, don't set `ble_name` + ble_name: "Your BLE Name" # Only used when connection is "ble" - Choose one. If used, don't set `ble_address` meshnet_name: "Your Meshnet Name" # This is displayed in full on Matrix, but is truncated when sent to a Meshnet - broadcast_enabled: true + broadcast_enabled: true # Must be set to true to enable Matrix to Meshtastic messages logging: level: "info"