diff --git a/database.py b/database.py index 2440f10..1df9204 100644 --- a/database.py +++ b/database.py @@ -3,7 +3,7 @@ from datetime import datetime, timezone from peewee import * from playhouse.migrate import migrate as migrate_database, SqliteMigrator -latest_version = 2 # increment each time new database migrations are added +latest_version = 3 # increment each time new database migrations are added database = DatabaseProxy() # use a proxy object, as we will init real db client inside meshchat.py migrator = SqliteMigrator(database) @@ -18,6 +18,14 @@ def migrate(current_version): migrator.add_column("lxmf_messages", 'next_delivery_attempt_at', LxmfMessage.next_delivery_attempt_at), ) + # migrate to version 3 + if current_version < 3: + migrate_database( + migrator.add_column("lxmf_messages", 'rssi', LxmfMessage.rssi), + migrator.add_column("lxmf_messages", 'snr', LxmfMessage.snr), + migrator.add_column("lxmf_messages", 'quality', LxmfMessage.quality), + ) + return latest_version @@ -71,6 +79,9 @@ class LxmfMessage(BaseModel): content = TextField() fields = TextField() # json string timestamp = FloatField() # timestamp of when the message was originally created (before ever being sent) + rssi = IntegerField(null=True) + snr = FloatField(null=True) + quality = FloatField(null=True) created_at = DateTimeField(default=lambda: datetime.now(timezone.utc)) updated_at = DateTimeField(default=lambda: datetime.now(timezone.utc)) diff --git a/meshchat.py b/meshchat.py index f950aac..7d5126f 100644 --- a/meshchat.py +++ b/meshchat.py @@ -999,6 +999,9 @@ class ReticulumMeshChat: "content": db_lxmf_message.content, "fields": json.loads(db_lxmf_message.fields), "timestamp": db_lxmf_message.timestamp, + "rssi": db_lxmf_message.rssi, + "snr": db_lxmf_message.snr, + "quality": db_lxmf_message.quality, "created_at": db_lxmf_message.created_at, "updated_at": db_lxmf_message.updated_at, }) @@ -1429,6 +1432,21 @@ class ReticulumMeshChat: # convert 0.0-1.0 progress to 0.00-100 percentage progress_percentage = round(lxmf_message.progress * 100, 2) + # get rssi + rssi = lxmf_message.rssi + if rssi is None: + rssi = self.reticulum.get_packet_rssi(lxmf_message.hash) + + # get snr + snr = lxmf_message.snr + if snr is None: + snr = self.reticulum.get_packet_snr(lxmf_message.hash) + + # get quality + quality = lxmf_message.q + if quality is None: + quality = self.reticulum.get_packet_q(lxmf_message.hash) + return { "hash": lxmf_message.hash.hex(), "source_hash": lxmf_message.source_hash.hex(), @@ -1442,6 +1460,9 @@ class ReticulumMeshChat: "content": lxmf_message.content.decode('utf-8'), "fields": fields, "timestamp": lxmf_message.timestamp, + "rssi": rssi, + "snr": snr, + "quality": quality, } # convert lxmf state to a human friendly string @@ -1479,7 +1500,7 @@ class ReticulumMeshChat: # handle an lxmf delivery from reticulum # NOTE: cant be async, as Reticulum doesn't await it - def on_lxmf_delivery(self, lxmf_message): + def on_lxmf_delivery(self, lxmf_message: LXMF.LXMessage): try: # upsert lxmf message to database @@ -1532,6 +1553,9 @@ class ReticulumMeshChat: "content": lxmf_message_dict["content"], "fields": json.dumps(lxmf_message_dict["fields"]), "timestamp": lxmf_message_dict["timestamp"], + "rssi": lxmf_message_dict["rssi"], + "snr": lxmf_message_dict["snr"], + "quality": lxmf_message_dict["quality"], "updated_at": datetime.now(timezone.utc), }