from enum import IntEnum from pyblake2 import blake2s from pyLoraRFM9x import LoRa, ModemConfig import time, toml, math, struct HASH_LENGTH = 8 class MessageType(IntEnum): DeviceStatus = 1 SensorStatus = 2 Time = 2 class MultiNode: sensor_type_table = {1: "V", 2: "mA"} def __init__(self): with open("Config.toml", "r") as config_file: config = toml.loads(config_file.read()) self.server_address = config["server"]["address"] self.server_secret_key = config["server"]["secret_key"] # How often to send the time self.time_interval = config["server"]["time_interval"] self.devices = {} self.last_time_message = time.time() for node_id_str in config["node"]: node_id = int(node_id_str, 16) self.devices[node_id] = config["node"][node_id_str] self.lora = LoRa( 0, # SPI channel 25, # Interrupt pin 255, # Node ID reset_pin=22, modem_config=ModemConfig.Bw125Cr45Sf128, tx_power=14, freq=868, acks=False) # , receive_all=True) self.lora.cad_timeout = 1 self.lora.on_recv = self.process_packet self.lora.set_mode_rx() def loop(self): if time.time() - self.last_time_message > self.time_interval: self.send_packet(0xFFFF, int(MessageType.Time).to_bytes(1, "little")) self.last_time_message += self.time_interval #print("Sent time") def decode_packet(self, device, data): packet_type = data[0] # match packet_type: # case MessageType.DeviceStatus: if packet_type == MessageType.DeviceStatus: device["status"] = {"battery": struct.unpack('> i) & 1: channels.append(i) sensor_data = [] for i in range(len(channels)): offset = i * 6 sensor_data.append({"channel": channels[i], "type": data[3 + offset], "pin": data[4 + offset], "value": struct.unpack('