kopia lustrzana https://github.com/mate-dev/meshtastic-matrix-relay
Merge branch 'geoffwhittington:main' into main
commit
bff269a45c
1
main.py
1
main.py
|
@ -31,7 +31,6 @@ meshtastic_interface = connect_meshtastic()
|
||||||
matrix_rooms: List[dict] = relay_config["matrix_rooms"]
|
matrix_rooms: List[dict] = relay_config["matrix_rooms"]
|
||||||
matrix_access_token = relay_config["matrix"]["access_token"]
|
matrix_access_token = relay_config["matrix"]["access_token"]
|
||||||
|
|
||||||
|
|
||||||
async def main():
|
async def main():
|
||||||
# Initialize the SQLite database
|
# Initialize the SQLite database
|
||||||
initialize_database()
|
initialize_database()
|
||||||
|
|
|
@ -8,27 +8,31 @@ from config import relay_config
|
||||||
from log_utils import get_logger
|
from log_utils import get_logger
|
||||||
from db_utils import get_longname, get_shortname
|
from db_utils import get_longname, get_shortname
|
||||||
from plugin_loader import load_plugins
|
from plugin_loader import load_plugins
|
||||||
|
from bleak.exc import BleakDBusError, BleakError
|
||||||
|
|
||||||
matrix_rooms: List[dict] = relay_config["matrix_rooms"]
|
matrix_rooms: List[dict] = relay_config["matrix_rooms"]
|
||||||
|
|
||||||
logger = get_logger(name="Meshtastic")
|
logger = get_logger(name="Meshtastic")
|
||||||
|
|
||||||
meshtastic_client = None
|
meshtastic_client = None
|
||||||
|
main_loop = None
|
||||||
|
|
||||||
def connect_meshtastic(force_connect=False):
|
def connect_meshtastic(force_connect=False):
|
||||||
global meshtastic_client
|
global meshtastic_client
|
||||||
if meshtastic_client and not force_connect:
|
if meshtastic_client and not force_connect:
|
||||||
return meshtastic_client
|
return meshtastic_client
|
||||||
|
|
||||||
meshtastic_client = None
|
# Ensure previous connection is closed
|
||||||
|
if meshtastic_client:
|
||||||
|
try:
|
||||||
|
meshtastic_client.close()
|
||||||
|
except Exception as e:
|
||||||
|
logger.warning(f"Error closing previous connection: {e}")
|
||||||
|
meshtastic_client = None
|
||||||
|
|
||||||
# Initialize Meshtastic interface
|
# Initialize Meshtastic interface
|
||||||
connection_type = relay_config["meshtastic"]["connection_type"]
|
connection_type = relay_config["meshtastic"]["connection_type"]
|
||||||
retry_limit = (
|
retry_limit = relay_config["meshtastic"].get("retry_limit", 3)
|
||||||
relay_config["meshtastic"]["retry_limit"]
|
|
||||||
if "retry_limit" in relay_config["meshtastic"]
|
|
||||||
else 3
|
|
||||||
)
|
|
||||||
attempts = 1
|
attempts = 1
|
||||||
successful = False
|
successful = False
|
||||||
|
|
||||||
|
@ -42,10 +46,15 @@ def connect_meshtastic(force_connect=False):
|
||||||
elif connection_type == "ble":
|
elif connection_type == "ble":
|
||||||
ble_address = relay_config["meshtastic"].get("ble_address")
|
ble_address = relay_config["meshtastic"].get("ble_address")
|
||||||
if ble_address:
|
if ble_address:
|
||||||
logger.info(f"Connecting to BLE address or name {ble_address} ...")
|
logger.info(f"Connecting to BLE address {ble_address} ...")
|
||||||
meshtastic_client = meshtastic.ble_interface.BLEInterface(address=ble_address)
|
meshtastic_client = meshtastic.ble_interface.BLEInterface(
|
||||||
|
address=ble_address,
|
||||||
|
noProto=False,
|
||||||
|
debugOut=None,
|
||||||
|
noNodes=False
|
||||||
|
)
|
||||||
else:
|
else:
|
||||||
logger.error("No BLE address or name provided.")
|
logger.error("No BLE address provided.")
|
||||||
return None
|
return None
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
@ -57,10 +66,10 @@ def connect_meshtastic(force_connect=False):
|
||||||
nodeInfo = meshtastic_client.getMyNodeInfo()
|
nodeInfo = meshtastic_client.getMyNodeInfo()
|
||||||
logger.info(f"Connected to {nodeInfo['user']['shortName']} / {nodeInfo['user']['hwModel']}")
|
logger.info(f"Connected to {nodeInfo['user']['shortName']} / {nodeInfo['user']['hwModel']}")
|
||||||
|
|
||||||
except Exception as e:
|
except (BleakDBusError, BleakError, meshtastic.ble_interface.BLEInterface.BLEError, Exception) as e:
|
||||||
attempts += 1
|
attempts += 1
|
||||||
if attempts <= retry_limit:
|
if attempts <= retry_limit:
|
||||||
logger.warn(f"Attempt #{attempts-1} failed. Retrying in {attempts} secs {e}")
|
logger.warning(f"Attempt #{attempts-1} failed. Retrying in {attempts} secs {e}")
|
||||||
time.sleep(attempts)
|
time.sleep(attempts)
|
||||||
else:
|
else:
|
||||||
logger.error(f"Could not connect: {e}")
|
logger.error(f"Could not connect: {e}")
|
||||||
|
@ -68,9 +77,25 @@ def connect_meshtastic(force_connect=False):
|
||||||
|
|
||||||
return meshtastic_client
|
return meshtastic_client
|
||||||
|
|
||||||
def on_lost_meshtastic_connection(interface):
|
def on_lost_meshtastic_connection(interface=None):
|
||||||
logger.error("Lost connection. Reconnecting...")
|
logger.error("Lost connection. Reconnecting...")
|
||||||
connect_meshtastic(force_connect=True)
|
global main_loop
|
||||||
|
if main_loop:
|
||||||
|
asyncio.run_coroutine_threadsafe(reconnect(), main_loop)
|
||||||
|
|
||||||
|
async def reconnect():
|
||||||
|
backoff_time = 10
|
||||||
|
while True:
|
||||||
|
try:
|
||||||
|
logger.info(f"Reconnection attempt starting in {backoff_time} seconds...")
|
||||||
|
await asyncio.sleep(backoff_time)
|
||||||
|
meshtastic_client = connect_meshtastic(force_connect=True)
|
||||||
|
if meshtastic_client:
|
||||||
|
logger.info("Reconnected successfully.")
|
||||||
|
break
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Reconnection attempt failed: {e}")
|
||||||
|
backoff_time = min(backoff_time * 2, 300) # Cap backoff at 5 minutes
|
||||||
|
|
||||||
def on_meshtastic_message(packet, loop=None):
|
def on_meshtastic_message(packet, loop=None):
|
||||||
from matrix_utils import matrix_relay
|
from matrix_utils import matrix_relay
|
||||||
|
@ -156,4 +181,23 @@ def on_meshtastic_message(packet, loop=None):
|
||||||
)
|
)
|
||||||
found_matching_plugin = result.result()
|
found_matching_plugin = result.result()
|
||||||
if found_matching_plugin:
|
if found_matching_plugin:
|
||||||
logger.debug(f"Processed {portnum} with plugin {plugin.plugin_name}")
|
logger.debug(f"Processed {portnum} with plugin {plugin.plugin_name}")
|
||||||
|
|
||||||
|
async def check_connection():
|
||||||
|
global meshtastic_client
|
||||||
|
connection_type = relay_config["meshtastic"]["connection_type"]
|
||||||
|
while True:
|
||||||
|
if meshtastic_client:
|
||||||
|
try:
|
||||||
|
# Attempt a read operation to check if the connection is alive
|
||||||
|
meshtastic_client.getMyNodeInfo()
|
||||||
|
except (BleakDBusError, BleakError, meshtastic.ble_interface.BLEInterface.BLEError, Exception) as e:
|
||||||
|
logger.error(f"{connection_type.capitalize()} connection lost: {e}")
|
||||||
|
on_lost_meshtastic_connection(meshtastic_client)
|
||||||
|
await asyncio.sleep(5) # Check connection every 5 seconds
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
meshtastic_client = connect_meshtastic()
|
||||||
|
main_loop = asyncio.get_event_loop()
|
||||||
|
main_loop.create_task(check_connection())
|
||||||
|
main_loop.run_forever()
|
||||||
|
|
Ładowanie…
Reference in New Issue