Jump to content

Empfohlene Beiträge

Geschrieben

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

 

Geschrieben

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
Geschrieben

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
 

 

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Geschrieben

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

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto besitzen, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen.

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...