Made a python script to create posts via meshtastic messages. If you can see this, the test worked! Posting from the park with no mobile data _
9 comments
It took 3 walks to the park due to bugs and unhandled exceptions but it worked!
The python script connects to a node that is left at home. The bot can detect and process a message with the following format:
PST
Com: Meshtastic
Sub: Posting via Meshtastic
Bod: Made a python script to create posts via meshtastic messages. If you can see this, the test worked! Posting from the park with no mobile data ^_^
It will parse the message and create a post. So, as long as I can reach my home's node I am able to create a post.
Nice! When you get a chance, I would love to see that code! We have a system right now that does local weather and events once a day.
For sure. It is quite basic and I am not proud of the hacky method I used to "parse" the message, but it might be useful for someone looking for a simple way to interface with a meshtastic device over TCP (onReceive) and the Lemmy API (createPost).
import json
import re
import meshtastic
import meshtastic.tcp_interface
from pubsub import pub
import time
import os
import requests
INSTANCE_API = "https://mander.xyz/api/v3"
MESHTEST_LEMMY_JWT = 'Cookie retrieved from browser'
def createPost(community_name, subject, body):
url = f"{INSTANCE_API}/post"
getCommunity = requests.get(f"{INSTANCE_API}/community?name={community_name}").json()
communityId = getCommunity['community_view']['community']['id']
data = {
"community_id": communityId,
"name": subject,
"body": body}
headers = {
"Authorization": f"Bearer {MESHTEST_LEMMY_JWT}",
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers, json=data)
return response
MESHTASTIC_NODE_IP = "Local IP of the base node connected to WiFi"
def sstrip(text):
return re.sub(r'(?:\s|,)*(sub|SUB|Sub|COM|com|Com|Bod|bod|BOD)(?:\s|,)*$', '', text.strip())
def processMessage(message):
blocks = message.split(':') # Splits the message into blocks, but will also split smiley faces ":)", bad method.
try:
for i in range(0,len(blocks)-1):
if blocks[i][-3:].lower() == 'sub':
subject = sstrip(blocks[i+1])
if blocks[i][-3:].lower() == 'com':
community_name = sstrip(blocks[i+1]).lower()
if blocks[i][-3:].lower() == 'bod':
body = sstrip(blocks[i+1])
return community_name, subject, body
except:
return 'ERR','ERR','ERR'
def onReceive(packet, interface):
if 'decoded' in packet and 'payload' in packet['decoded']:
try:
message = packet['decoded']['payload'].decode('utf-8')
sender = packet['from']
if 'Ping' in message:
interface.sendText("Pong!", destinationId=sender)
if message.split('\n')[0] == 'PST':
try:
community_name, subject, body = processMessage(message)
response = createPost(community_name, subject, body)
if response.ok:
interface.sendText("Post created succesfully!", destinationId=sender)
else:
interface.sendText("Unable to create post!", destinationId=sender)
except:
interface.sendText("Exception triggered", destinationId=sender)
except Exception as e:
pass
interface = meshtastic.tcp_interface.TCPInterface(hostname=MESHTASTIC_NODE_IP)
pub.subscribe(onReceive, "meshtastic.receive")
while True:
time.sleep(2)
It worked. Can you see replies too?
Wuhuu! Not yet! I do have a few ideas on how to implement that. Since the size of messages is limited to 200 characters, and since trying to transmit too much data via meshtastic wouldn't be very efficient, I am brainstorming about how to implement notifications and fetching in a somewhat compatible manner.
One approach would be via some interface that displays the minimum amount of data (for example, first few letters of a post's title, community, username). The user would "fetch" specific pieces of data, which then gets stored into the phone's memory and this way one can populate the application with content without overloading the mesh.
It's not something I am too seriously considering actually making, I am just having a bit of fun.
See shit like this is quite frankly fantastic as hell
It took 3 walks to the park due to bugs and unhandled exceptions but it worked!
The python script connects to a node that is left at home. The bot can detect and process a message with the following format:
It will parse the message and create a post. So, as long as I can reach my home's node I am able to create a post.
Nice! When you get a chance, I would love to see that code! We have a system right now that does local weather and events once a day.
For sure. It is quite basic and I am not proud of the hacky method I used to "parse" the message, but it might be useful for someone looking for a simple way to interface with a meshtastic device over TCP (onReceive) and the Lemmy API (createPost).