Merge pull request #66 from jeremiah-k/ble-support

BLE Support
feature/plugins-parameters
Jeremiah K 2024-07-01 13:27:39 -05:00 zatwierdzone przez GitHub
commit 9f8888feb1
2 zmienionych plików z 47 dodań i 59 usunięć

Wyświetl plik

@ -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}")

Wyświetl plik

@ -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"