Sal

joined 3 years ago
MODERATOR OF
[–] Sal@mander.xyz 4 points 6 months ago

Very lucky indeed!!! I am jealous!!

[–] Sal@mander.xyz 3 points 6 months ago (1 children)

Glad you like it :D

The ping is very useful. I know that there is a built-in range test, but sometimes I don't need the test to be on all the time, nor do I want to set the frequency too high. Actually.... This give me an idea, I can simply program a command to turn the range test off/on remotely.

That weather function is nice! The US makes available some nice weather APIs. I have a PinePhone and it has a weather module that relies on a US-based API, but I am not in the US. At least I can find out the weather in Oregon easily. I don't know if there is some similar API in the Netherlands.

Im guessing you were a C/C# dev based on the function names.

I helped re-factor some C++-based micro-controller firmware recently and the original code was not following any convention, so I looked at a list of conventions and decided that 'lower camel case' looked like a nice one to pick. So, I have been developing a habit to stick to that. I do scientific r&d and only sometimes need to do a bit of programming, so I'm not sure if I'd call myself a dev!

[–] Sal@mander.xyz 5 points 6 months ago (3 children)

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) 
[–] Sal@mander.xyz 22 points 6 months ago (5 children)

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.

[–] Sal@mander.xyz 12 points 6 months ago

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.

[–] Sal@mander.xyz 3 points 6 months ago

That's great, thanks for these resources :D

[–] Sal@mander.xyz 2 points 6 months ago

Thanks!

I can tell you it’s not an orchid like the bot thought tho :). (though you already knew that)

It wouldn't be much fun if the bot was always right ;) It is here to give some quick suggestions.

I agree, it does look a lot like a Tillisandia. Could it be Tillandsia yucatana? It looks similar to photo (L):

Figure 2. Illustrations of 12 of the 14 epiphytic bromeliad species found in the precipitation gradient of the Yucatan Peninsula, Mexico. A, Aechmea bracteata; B, Catopsis nutans; C, Tillandsia balbisiana; D, Tillandsia brachycaulos; E, Tillandsia dasyliriifolia; F, Tillandsia elongata var. subimbricata; G, Tillandsia fasciculata; H, Tillandsia recurvata; I, Tillandsia schiedeana; J, Tillandsia streptophylla; K, Tillandsia utriculata; L, Tillandsia yucatana.

From here: https://www.researchgate.net/figure/llustrations-of-12-of-the-14-epiphytic-bromeliad-species-found-in-the-precipitation_fig2_299420322

[–] Sal@mander.xyz 3 points 6 months ago

Ah, that's great, thanks!! If you need any help or decide to step away for any reason whatsoever I am always happy to help, no pressure at all.

Spam and spam bots are usually best handled with the admin because an admin account can ban accounts instance wide and delete all their content at once, so it is more efficient. They are not so common within this instance and they usually target large communities. So, I can help with this if it happens.

[–] Sal@mander.xyz 2 points 6 months ago (2 children)

Nope, no pain!

Not clear if you are asking because you are curious and want to mod that community, or if you are asking me if I can mod the community 😅 I would prefer if someone else creates it simply because I still have no experience with Reticulum and because it is nice to have some diversity in the mods, but it also wouldn't be a big deal, I can make it if you would like.

[–] Sal@mander.xyz 2 points 6 months ago

Ah! I can see problems happening if you do reach those high densities. If an app change was able to fix it somewhat, then it may have still been some configuration problem. Too many people trying to join the same mesh with sub-optimal settings. But, at some point you might indeed get just too much radio interference from different devices trying to communicate at once. Certainly possible!

I just learned about Reticulum, I still have to give it a try!

[–] Sal@mander.xyz 3 points 6 months ago

Happy to contribute! But, I admit, I should be putting more effort in growing some communities 😅 Thank you for all the effort you put in as well!

[–] Sal@mander.xyz 2 points 6 months ago

Interesting! This rule is new to me. Pretty curious about the ratio for a platform such as lemmy.

 

I was browsing through some literature about color-changing in chameleons and stumbled upon this relatively recent paper about how chameleons will change color where mosquitoes bite them.

From the discussion:

While determining the particular mechanism(s) of color change is outside the scope of the current study, we nonetheless serendipitously discovered multiple instances of mosquito bite-induced color change in wild chameleons. This demonstrates that citizen science can produce discoveries of previously unknown natural phenomena, as our study represents the first formal documentations of mosquitoes feeding on chameleons as well as chameleon color change induced by arthropod hematophagy. These findings provide additional insights into the parasite-host interactions, such as the mosquitoes feeding on sleeping chameleons and particularly at the mouth.

view more: ‹ prev next ›