mirror of
https://github.com/geoffwhittington/meshtastic-bridge.git
synced 2026-03-28 17:42:37 +01:00
Adds plugin to push location messages to an Owntracks mqtt instance
This commit is contained in:
37
main.py
37
main.py
@@ -31,32 +31,33 @@ class CustomTCPInterface(meshtastic.tcp_interface.TCPInterface):
|
||||
def onReceive(packet, interface): # called when a packet arrives
|
||||
nodeInfo = interface.getMyNodeInfo()
|
||||
|
||||
for pipeline, pipeline_plugins in bridge_config["pipelines"].items():
|
||||
logger.debug(f"Pipeline {pipeline} initiated")
|
||||
if "pipelines" in bridge_config:
|
||||
for pipeline, pipeline_plugins in bridge_config["pipelines"].items():
|
||||
logger.debug(f"Pipeline {pipeline} initiated")
|
||||
|
||||
p = plugins["packet_filter"]
|
||||
pipeline_packet = p.do_action(packet)
|
||||
p = plugins["packet_filter"]
|
||||
pipeline_packet = p.do_action(packet)
|
||||
|
||||
for plugin in pipeline_plugins:
|
||||
if not pipeline_packet:
|
||||
continue
|
||||
|
||||
for plugin_key, plugin_config in plugin.items():
|
||||
logger.debug(f"Processing plugin: {pipeline}/{plugin_key}")
|
||||
for plugin in pipeline_plugins:
|
||||
if not pipeline_packet:
|
||||
logger.debug("Skipping since the packet is null")
|
||||
continue
|
||||
|
||||
if plugin_key not in plugins:
|
||||
logger.error(f"No such plugin: {plugin_key}. Skipping")
|
||||
continue
|
||||
for plugin_key, plugin_config in plugin.items():
|
||||
logger.debug(f"Processing plugin: {pipeline}/{plugin_key}")
|
||||
if not pipeline_packet:
|
||||
logger.debug("Skipping since the packet is null")
|
||||
continue
|
||||
|
||||
p = plugins[plugin_key]
|
||||
p.configure(devices, mqtt_servers, plugin_config)
|
||||
if plugin_key not in plugins:
|
||||
logger.error(f"No such plugin: {plugin_key}. Skipping")
|
||||
continue
|
||||
|
||||
pipeline_packet = p.do_action(pipeline_packet)
|
||||
p = plugins[plugin_key]
|
||||
p.configure(devices, mqtt_servers, plugin_config)
|
||||
|
||||
logger.debug(f"Pipeline {pipeline} completed")
|
||||
pipeline_packet = p.do_action(pipeline_packet)
|
||||
|
||||
logger.debug(f"Pipeline {pipeline} completed")
|
||||
|
||||
|
||||
def onConnection(
|
||||
|
||||
83
plugins.py
83
plugins.py
@@ -318,6 +318,89 @@ class MQTTPlugin(Plugin):
|
||||
plugins["mqtt_plugin"] = MQTTPlugin()
|
||||
|
||||
|
||||
class OwntracksPlugin(Plugin):
|
||||
logger = logging.getLogger(name="meshtastic.bridge.plugin.Owntracks")
|
||||
|
||||
def do_action(self, packet):
|
||||
|
||||
required_options = ["tid_table", "server_name"]
|
||||
for option in required_options:
|
||||
if option not in self.config:
|
||||
self.logger.warning(f"Missing config: {option}")
|
||||
return packet
|
||||
tid_table = self.config["tid_table"]
|
||||
|
||||
if not "from" in packet:
|
||||
self.logger.warning("Missing from: field")
|
||||
return packet
|
||||
|
||||
if not str(packet["from"]) in self.config["tid_table"]:
|
||||
self.logger.warning(f"Sender not in tid_table: {packet}")
|
||||
return packet
|
||||
|
||||
from_str = str(packet["from"])
|
||||
|
||||
message = json.loads('{"_type":"location", "bs":0}')
|
||||
message["tid"] = tid_table[from_str][1]
|
||||
self.logger.debug(f"processing packet {packet}")
|
||||
#Packet direct from radio
|
||||
if (
|
||||
"decoded" in packet
|
||||
and "position" in packet["decoded"]
|
||||
and "latitude" in packet["decoded"]["position"]
|
||||
and packet["decoded"]["position"]["latitude"] != 0
|
||||
):
|
||||
message["lat"] = packet["decoded"]["position"]["latitude"]
|
||||
message["lon"] = packet["decoded"]["position"]["longitude"]
|
||||
message["tst"] = packet["decoded"]["position"]["time"]
|
||||
message["created_at"] = packet["rxTime"]
|
||||
if "altitude" in packet["decoded"]["position"]:
|
||||
message["alt"] = packet["decoded"]["position"]["altitude"]
|
||||
|
||||
#packet from mqtt
|
||||
elif (
|
||||
"type" in packet
|
||||
and packet["type"] == "position"
|
||||
and "payload" in packet
|
||||
and "latitude_i" in packet["payload"]
|
||||
and packet["payload"]["latitude_i"] != 0
|
||||
):
|
||||
message["lat"] = packet["payload"]["latitude_i"]/10000000
|
||||
message["lon"] = packet["payload"]["longitude_i"]/10000000
|
||||
message["tst"] = packet["timestamp"]
|
||||
if ("time" in packet["payload"]):
|
||||
message["created_at"] = packet["payload"]["time"]
|
||||
else:
|
||||
message["created_at"] = packet["timestamp"]
|
||||
if "altitude" in packet["payload"]:
|
||||
message["alt"] = packet["payload"]["altitude"]
|
||||
else:
|
||||
self.logger.debug("Not a location packet")
|
||||
return packet
|
||||
|
||||
if self.config["server_name"] not in self.mqtt_servers:
|
||||
self.logger.warning(f"No server established: {self.config['server_name']}")
|
||||
return packet
|
||||
|
||||
mqtt_server = self.mqtt_servers[self.config["server_name"]]
|
||||
|
||||
if not mqtt_server.is_connected():
|
||||
self.logger.error("Not sent, not connected")
|
||||
return
|
||||
|
||||
self.logger.debug("Sending owntracks message")
|
||||
|
||||
info = mqtt_server.publish("owntracks/user/" + tid_table[from_str][0], json.dumps(message))
|
||||
info.wait_for_publish()
|
||||
|
||||
self.logger.debug("Message sent")
|
||||
|
||||
return packet
|
||||
|
||||
|
||||
plugins["owntracks_plugin"] = OwntracksPlugin()
|
||||
|
||||
|
||||
class EncryptFilter(Plugin):
|
||||
logger = logging.getLogger(name="meshtastic.bridge.filter.encrypt")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user