import serial import time PORT = "/dev/serial0" BAUD = 9600 def send_command(ser, cmd, wait_for="OK", timeout=5): """Sendet einen Befehl und wartet auf eine Antwort.""" ser.write(f"{cmd}\r\n".encode()) # wichtig ist \r\n zur bestätigung im Emulator start_time = time.time() response = "" while (time.time() - start_time) < timeout: if ser.in_waiting > 0: line = ser.readline().decode(errors='ignore').strip() if line: print(f" [Modul]: {line}") response += line if wait_for in line: return True return False def main_menu(): try: ser = serial.Serial(PORT, BAUD, timeout=1) print("--- LoRa-E5 Schnellwahl-Terminal ---") while True: print("\nWas küt ?") print("1 Test (AT)") print("2 IDs auslesen (AT+ID)") print("3 Mit TTN verbinden (AT+JOIN)") print("4 Nachricht senden (Text)") print("5 Nachricht senden (Hex)") print("6 Reset des Moduls") # Falls timeout wegen zuviel anfragen print("7 Nachricht im Loop senden (alle 45s)") print("c Beliebigen AT-Befehl senden") print("q Beenden") # print("f Mit TTN verbindung Forcen (AT+JOIN=FORCE)") choice = input("\nAuswahl: ").strip().lower() if choice == '1': send_command(ser, "AT") elif choice == '2': send_command(ser, "AT+ID") elif choice == '3': print("Join-Prozess gestartet...") keywords = ["done", "joined already"] ser.write(b"AT+JOIN\r\n") start_time = time.time() joined = False while (time.time() - start_time) < 30: if ser.in_waiting > 0: line = ser.readline().decode(errors='ignore').strip() if line: print(f" [Modul]: {line}") line_lower = line.lower() if any(key in line_lower for key in keywords): joined = True break if "failed" in line_lower or "busy" in line_lower: break if joined: print("Bereit: Modul ist im Netz.") else: print("Timeout oder Fehler beim Join.") elif choice == '4': msg = input("Gib deine Nachricht ein: ") send_command(ser, f'AT+MSG="{msg}"') elif choice == '5': hex_payload = input("Gib den Hex-Code ein (z.B. AA BB 01): ") hex_payload = hex_payload.replace(" ", "") # falls Eingabe Leerzeichen beinhaltet send_command(ser, f'AT+MSGHEX="{hex_payload}"') elif choice == '6': send_command(ser, "AT+RESET") elif choice == 'f': send_command(ser, "AT+JOIN=FORCE") elif choice == '7': msg = input("Gib die Nachricht ein, die geloopt werden soll: ") print("\nLoop gestartet. Drücke STRG+C (bzw. Ctrl+C), um den Loop zu beenden!") try: while True: print(f"\nSende Nachricht: {msg}") send_command(ser, f'AT+MSG="{msg}"') # Auch mit Sensordaten Möglich einfach msg ändern zu dem Sensor Output print("Warte 45 Sekunden auf die nächste Sendung...") time.sleep(45) # Zeitintervall zur loop übermittlung # Es gibt Gesetzliche Vorgaben (5min) für den Abstand von Signalen # Wollen ja nicht die Bundesnetzagentur im nacken haben except KeyboardInterrupt: print("\nLoop durch Benutzer abgebrochen. Kehre zum Menü zurück...") elif choice == 'c': msg = input("command: ") send_command(ser, msg) elif choice == 'q': print("Programm beendet.") ser.close() break else: print("Ungültige Auswahl.") time.sleep(1) except serial.SerialException as e: print(f"Fehler: Konnte Port {PORT} nicht öffnen ({e})") if __name__ == "__main__": main_menu()