Little Posted March 14 Posted March 14 Folgendes Python-File funktioniert hervorragend zum Status-Empfang vom MBS aller Signale.... import socket import json host = "127.0.0.1" # IP-Adresse des Studios port = 31386 # Port für Ereignisse # Verbindung zu Port 31386 (Ereignisse) herstellen with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((host, port)) # Verbindung herstellen while True: # Ereignis empfangen response = s.recv(4096) # Antwort vom Server empfangen if response: event = json.loads(response.decode()) # Antwort als JSON parsen if event.get("method") == "layout.eventTriggered": # Überprüfen, ob es sich um das richtige Ereignis handelt event_params = event.get("params") signal_name = event_params.get("params", {}).get("signal", {}).get("name") state = event_params.get("params", {}).get("state") print(f"Ereignis empfangen: Signal '{signal_name}' hat den Zustand {state}") else: print("Unbekanntes Ereignis erhalten:", event) Leider versuche ich erfolglos über Port 31385 zum MBS zu senden, hat da jemand eine Idee? Schönes Wochenende VG Little
Little Posted March 14 Author Posted March 14 Hallo @Neo, import socket import json host = "127.0.0.1" # IP des Computers, auf dem das Modellbahn Studio läuft port = 31385 # Port für Kommandos (nicht Ereignisse) # Beispiel: Kommando, um ein Signal zu schalten request = { "jsonrpc": "2.0", "method": "layout.setSignalState", # Beispielmethode, die das Signal schaltet "params": { "signal": { "_class": "entity", # Klasse der Entität (Signal) "name": "Signal1" # Name des Signals }, "state": 1.0 # Zustand des Signals (z.B. 1.0 für "ein") }, "id": 1 # Eindeutige ID für das Kommando } # Verbindung zum Studio aufbauen with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((host, port)) # Verbindung zu Port 31385 s.sendall((json.dumps(request) + "\n").encode()) # Kommando als JSON senden response = s.recv(4096) # Antwort vom Server empfangen print("Antwort vom Server:", response.decode()) # Ausgabe der Antwort
gmd Posted March 14 Posted March 14 Little, Es gibt keine funktion layout.setSignalState Du kannst nur ein script snippet schicken mit {"jsonrpc": "2.0", "method": "layout.invokeScript", "params": "print('Hallo Welt') return 42", "id": 1} Ich rate dir Putty zu benutzen und die messages manuell zu testen. Gruss Gmd
Neo Posted March 14 Posted March 14 Woher hast du die Funktion "layout.setSignalState"? Korrekt wäre: {"jsonrpc": "2.0", "method": "layout.invokeScript", "params": "local signal = layout:getEntityByName('Signal1') signal.state = 1", "id": 1} Abgesehen von den Funktionen im Wiki läuft die Steuerschnittstelle über die Ereignisverwaltung, also über Lua. Viele Grüße, Neo
Little Posted March 14 Author Posted March 14 Hatte vergessen die Beispielmethode auszutauschen, Danke.... VG Little
Little Posted March 16 Author Posted March 16 Hallo @Neo, {"jsonrpc": "2.0", "method": "layout.invokeScript", "params": "local signal = layout:getEntityByName('Signal1') signal.state = 1", "id": 1} funktioniert tadellos. Kannst Du mir nur zur Gedankenstütze den gleichen Code für z.B. Fahrstrasse1 zeigen? ich hab irgendwie einen Denkfehler.... Viele Grüße Little
Neo Posted March 17 Posted March 17 Hallo Little, für Fahrstraßen verwendest du layout:getRoutesByName, musst aber bedenken, dass hier eine Liste zurückgegeben wird, die entweder leer ist oder auch mehr als einen Eintrag enthalten kann. Viele Grüße, Neo
Little Posted March 17 Author Posted March 17 Hallo @Neo, ich steh gerade total auf dem Schlauch, wollte für meinen behinderten Freund, der Taster nur mit den Füßen bedienen kann, eine klein Python-Steuerung erstellen, Weiche und Signale funktionieren aber an der Aktivierung der Fahrstraße bin ich gescheitert. Nur wenn Du Zeit und Lust hast, kannst Du Dir die beigefügten Beispieldateien bitte mal anschauen und evtl. korrigieren. Viele Grüße Little FS_Test.zip
Neo Posted March 17 Posted March 17 Hallo Little, dein Lua-Code ist nicht korrekt: local route = layout:getRoutesByName('{fs_name}')state = 1 getRoutesByName liefert eine Tabelle zurück, du musst per Index auf das erste Element zugreifen. Und wenn du eine Fahrstraße aktivieren willst, nutzt du die Eigenschaft "active": local route = layout:getRoutesByName('{fs_name}')[1] route.active = true Teste deine Skripte einfach im Studio mit der EV, wenn sie dort funktionieren, kannst du sie per Steuerschnittstelle übermitteln. Viele Grüße, Neo
Little Posted March 17 Author Posted March 17 (edited) @Neo, Danke für die schnelle Hilfe. Es funktioniert tadellos. Viele Grüße Little Edited March 17 by Little
Little Posted March 17 Author Posted March 17 So im Anhang der funktionierende Test, nochmals vielen Dank auch im Namen meines Freundes, für die schnelle Hilfe.... FS-Test2.zip
Little Posted March 18 Author Posted March 18 Hallo MBSler, hab mal etwas Python-Coding betrieben, macht sehr viel Spass zusammen mit Json-Schnittstelle zum und vom Studio. Wen es interessiert, im Anhang eine Testanlage und ein py-File.... Nochmals vielen Dank an @Neo und @gmd , ihr habt einige Lücken in meinem Denkapparat gefüllt.... VG Little FS-Test-neu.zip
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now