kopia lustrzana https://github.com/mate-dev/meshtastic-matrix-relay
commit
9f8888feb1
|
@ -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}")
|
||||
|
|
|
@ -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"
|
||||
|
|
Ładowanie…
Reference in New Issue