Probleme mit der Terminalschnittstelle

Fragen zur Verwendung des PC_DIMMER
Antworten
gofarmer_damp

Probleme mit der Terminalschnittstelle

Beitrag von gofarmer_damp »

Hallo,
Leider gelingt es mir absolut nicht, die Terminalschnittstelle anzusprechen.

Mit dem Demoprogramm geht's wunderbar. Ist leider in delphi und nützt mir überhaupt nichts.

Wenn ich versuche mit irgendeinem x-beliebiegen TCP-Client daraufzuzugreifen, bekomme ich maximal nen Timeout-Fehler, wenn überhaupt.

Gibt es irgendjemanden, der Erfahrung hat die TS mit python abzufragen ? Oder vielleicht schon ne Möglichkeit gefunden hat, PC-Dimmer von EventGhost aus zu steuern ?

Danke !
Ingo
< PC_DIMMER >
Beiträge: 544
Registriert: 19.03.2009, 17:49
Wohnort: Bad Hersfeld bzw. Stuttgart

Re: Probleme mit der Terminalschnittstelle

Beitrag von Ingo »

Könntest du mir vielleicht dein Phyton-Testcode anhängen, dann könnte ich das mal versuchen, ohne erst den Code schreiben zu müssen, da ich nicht so vertraut mit Phyton bin.

Grüße,
Ingo
gofarmer_damp

Re: Probleme mit der Terminalschnittstelle

Beitrag von gofarmer_damp »

Hallo Ingo,

Habe es nach vielem hin-und-her geschafft, dass ich von python auf die TS komme.
Mein einziges Problem ist jetzt nur noch, die Rückgabe-Strings auseinanderzufieseln, um die entsprechende GUI zu bekommen.
Bin auch nicht wirklich fit, was python angeht - aber lernfähig.

Hier mein script:

Code: Alles auswählen

import telnetlib

ip = raw_input("ip-adresse: ")                      # IP manuell eingeben
t=telnetlib.Telnet(ip,10160)                        # Telnet-connection herstellen
t.write("get_ch 1\r\n")                               # Befehl senden
answer=t.read_until("0\r\n",5.0)                #daten empfangen bis Zeichenfolge erhalten oder 5 sek um sind
print answer                                             # Ausgabe 
t.close                                                     # Telnet verbindung schliessen[attachment=0]Screenshot.jpg[/attachment]



zurück bekomme ich als answer folgendes:
>siehe screenshot<

vielleicht hast Du ja ne Ahnung, auf welche zeichenfolge(n) ich prüfen muss, damit ich den gesendeten Befehl und das letzte zeichen (diesen kasten) loswerde . . ., bzw der string nicht nach 0\r\n abgeschnitten wird (z.b. endet ein get_ch 0 beriets nach der ersten 0, also nach dem Befehl, die Antwort fehlt dann natürlich.


Gruß

Gofarmer


P.S. Wer Rechtschreibfeler findet darf sie natürlich behalten . . .
Dateianhänge
Screenshot Script-Ausgabe
Screenshot Script-Ausgabe
Screenshot.jpg (207.97 KiB) 7555 mal betrachtet
Benutzeravatar
Christian
PC_DIMMER-Entwickler
Beiträge: 1866
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Probleme mit der Terminalschnittstelle

Beitrag von Christian »

Hi,

da Python die Steuerzeichen (ASCII 0 bis 31) nicht darstellen kann, werden diese als Kästchen dargestellt. Nach jedem Befehl sendet PC_DIMMER ein Carriage-Return und ein NewLine-Feed, also ein ASCII 13 und danach ein ASCII 10. Du müsstest also eigentlich alles korrekt machen, da du ja bereits auf \r\n überprüfst. Ich bin mir gerade nicht sicher, aber ich meine, dass auch nach einem "get_ch 0" nach jedem einzelnen "CV x y" ein CR und NL gesendet wird. Somit müsstest du eine Schleife aufbauen und die erwartete Menge an Kanälen abgezählt empfangen.

Du kannst ja mal in den C#-Quellcode des PocketPC_DIMMERs reinschauen. Dort verwende ich ausschließlich die Terminalschnittstelle. Dort wird fast jeder Befehl verwendet.



viele Grüße,
Christian
gofarmer_damp

Re: Probleme mit der Terminalschnittstelle

Beitrag von gofarmer_damp »

Hallo Christian,
Du kannst ja mal in den C#-Quellcode des PocketPC_DIMMERs reinschauen. Dort verwende ich ausschließlich die Terminalschnittstelle. Dort wird fast jeder Befehl verwendet.
Wenn Du mir noch sagst, wo ich den Quellcode herbekomme schau ich s mir gerne an.

Gruß

Gofarmer
Benutzeravatar
Christian
PC_DIMMER-Entwickler
Beiträge: 1866
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Probleme mit der Terminalschnittstelle

Beitrag von Christian »

Oh, ich hab gerade gesehen, dass er nicht mit im ZIP-Paket ist.


ich werde ihn heute Nachmittag nachliefern :)


bis dann,
Christian
gofarmer_damp

Re: Probleme mit der Terminalschnittstelle

Beitrag von gofarmer_damp »

So, habe noch ein wenig gebastelt, und bin ein gutes Stück weitergekommen.

Ich bin nun tatsächlich in der Lage, mit Hilfe einer (handelsüblichen) X.10-Multimedia-Funkfernbedienung mit USB-Empfänger einzelne DMX-Kanäle zu schalten, bzw. auf bestimmte Werte zu setzen.
Funktionsweise: FB --> USB-Empfänger --> EventGhost --> PCDimmer

Das Senden von Befehlen ist relativ einfach. Das eigentliche Problem jedoch ist es Werte auszulesen.
Wenn man vorher genauestens weiss was man bekommt, geht's einigermaßen . . . Aber sobald sich etwas ändert, z.B. ein neues Gerät hinzugefügt wird, kann es passieren, dass sich alles verschiebt und schon ist die Auswertung dahin. Eine feste Länge der Antwortstrings, ggf. entsprechend csv-Format wäre da sicherlich hilfreich. Auch ein festes EOF/EOL würde schon viel vereinfachen.

Aber das was ich (bis jetzt) erreichen wollte, nämlich einzelne Kanäle zu steuern (einfaches an/aus) hab ich hingekriegt.
Gruppen, Effekte usw. haben noch Zeit . . .
Was mir jetzt im Moment noch fehlt, ist eine Möglichkeit das Beattool per TS zu steuern. In der Doku finde ich leider keine GUIDs dazu . . .
Mir reicht es im Grunde schon, zwischen FFT und manuell umschalten zu können.

Gruß

Gofarmer

Code: Alles auswählen


# einfaches Python-Script für EventGhost um bei jedem Aufruf jeweils einen Kanal (ch) von 0 nach 255, bzw. von 255 auf 0 zu schalten.

import telnetlib
import string

# Setzen von Werten
#-- Telnet-Verbindung --
ip = "192.168.1.170"                 # Ip adresse auf dem PC_Dimmer läuft
port=10160                           # Port der Terminalschnittstelle - aktivieren nicht vergessen !!!
timeout=.5                           # WarteZeit zum Einlesen der daten (ggf. erhöhen, wenn nicht alle Zeichen gelesen werden
#-- Kanalwerte --
ch=8
chVal=255
chFT=0
chD=0

#-- Function get_ch_val (liest aktuellen Wert des übergebenen Kanals ein) --
def get_ch_val(channel):
    t=telnetlib.Telnet(ip,port)           # referenzieren der klasse telnetlib.telnet
    befehl="get_ch "+str(channel)+"\r\n"            # LFCR an befehlanhängen
    t.write(befehl)                       # Befehl an PC_Dimmer senden 
    answer=t.read_until("xxx",timeout)    # Telnet antwort einlesen
    t.close                               # telnet schliessen
    #print "IP:Port / Befehl:" + ip +":"+str(port)+ " / " + befehl +" (nonstripped)"
    #print "answer: " + answer
    lstrippedanswer = string.lstrip(answer,befehl)
    #print "Lstripped answer:" + lstrippedanswer
    strippedanswer=string.strip(lstrippedanswer)
    pos=string.rfind(strippedanswer," ")
    cnt=string.count(strippedanswer," ")
    wlen=len(strippedanswer)
    w=strippedanswer
    wert=w[pos+1:wlen]
    #print "Doppelpunkte --> 1.pos = " + str(pos) +" / Anzahl = " +str(cnt) + "len: " +str(wlen)
    #print wert
    
    return wert

#-- Function set_ch (setzt den in ch angebenen Kanal auf die in  chVal, chFt und chD angegebenen Werte) --    
def set_ch(channel,start,end,fadetime,delay):
    
    t=telnetlib.Telnet(ip,port)           # referenzieren der klasse telnetlib.telnet
    befehl="set_ach "+str(channel)+" "+str(start)+" "+str(end)+" "+str(fadetime)+" "+str(delay)+"\r\n"    # LFCR an befehlanhängen
    t.write(befehl)                       # Befehl an PC_Dimmer senden 
    answer=t.read_until("xxx",timeout)    # Telnet antwort einlesen
    t.close # telnet schliessen
    
    return befehl

#-- Hauptprogramm --
# Kanalwert ChVal wird mittels get_ch_val nach x eingelesen und als
# Startwert gesetzt. Anschliessend die o.a. Kanalwerte mittels set_ch gesetzt
#--------

x=get_ch_val(ch)                   #aktuellen wert von ch holen
if (x=="0"):                           # wenn 0 dann auf 255 setzen (AN)
    set_ch(ch,x,255,0,0)
else:                                    # und wenn nicht 0, dann auf 0 setzen (AUS)
    set_ch(ch,x,0,0,0)
Benutzeravatar
Christian
PC_DIMMER-Entwickler
Beiträge: 1866
Registriert: 12.11.2007, 09:30
Wohnort: Knw.-Remsfeld
Kontaktdaten:

Re: Probleme mit der Terminalschnittstelle

Beitrag von Christian »

Hi,

du kannst auf das Beat-Tool über das Befehlssystem zugreifen. Verwende einfach den Befehl "run_command" und die GUIDs aus der Liste zum Befehlssystem (gibt es auch auf der Terminalschnittstellen-Seite): http://www.pcdimmer.de/downloads/befehlssystem.txt

Code: Alles auswählen

// Beatquelle setzen hat laut befehlssystem.txt die GUID: {5D7A3B16-1988-44BA-B4CA-D6427C1B408F}
run_command {5D7A3B16-1988-44BA-B4CA-D6427C1B408F} 1 0 NULL NULL {00000000-0000-0000-0000-000000000000} {00000000-0000-0000-0000-000000000000} 0
Tausche einfach die 1 nach der GUID gegen eine andere Zahl aus, um die entsprechenden Optionen aus der Dropdown-Box aus dem Beattool einzustellen.



Hier noch einmal der Ausschnitt zum Beattool aus der befehlssystem.txt:
[2] Programmteil:='Beattool';
[2] ProgrammteilGUID:=StringToGuid('{0359E9FC-5912-4637-8247-72A1B4963768}');

[2] Bezeichnung:='Sync-Button';
[2] GUID:=StringToGuid('{4C6469DE-1E89-4D8C-9BE9-4141F079F29E}');
[2] InputValueOnly:=false;
[2] IntegerArgCount:=0;
[2] StringArgCount:=0;
[2] GUIDArgCount:=0;

[2] Bezeichnung:='BPM-Wert setzen';
[2] GUID:=StringToGuid('{FB2B6AEF-662B-41F9-A984-A2E3BF7399FA}');
[2] InputValueOnly:=false;
[2] IntegerArgCount:=1;
[2] StringArgCount:=0;
[2] GUIDArgCount:=0;

[2] Bezeichnung:='BPM-Wert abfragen';
[2] GUID:=StringToGuid('{7836599B-60BE-4F63-AD53-89D25491032C}');
[2] InputValueOnly:=false;
[2] IntegerArgCount:=0;
[2] StringArgCount:=0;
[2] GUIDArgCount:=0;

[2] Bezeichnung:='Beat auslösen';
[2] GUID:=StringToGuid('{820E7B36-4F4E-4CFB-8ADF-6F21CAEC4077}');
[2] InputValueOnly:=false;
[2] IntegerArgCount:=0;
[2] StringArgCount:=0;
[2] GUIDArgCount:=0;

[2] Bezeichnung:='Beatquelle setzen';
[2] GUID:=StringToGuid('{5D7A3B16-1988-44BA-B4CA-D6427C1B408F}');
[2] InputValueOnly:=false;
[2] IntegerArgCount:=1;
[2] StringArgCount:=0;
[2] GUIDArgCount:=0;


Ein Hinweis noch zu den Kanalwerten: wenn du z.B. einen Kanalwert inkrementieren möchtest, brauchst du ja den aktuellen Wert. Rufe diesen einfach über die Gerätekanalfunktion ab:

Code: Alles auswählen

get_devchannel {IDDESGERÄTES} DIMMER
Du erhälst als Antwort: DCV 0BIS255. Diesen Wert verwendest du als Variable, inkrementierst ihn oder dekrementierst ihn und schickst den neuen Wert wieder mit set_channel {IDDESGERÄTES} DIMMER -1 ENDWERT 0 0 wieder zum Hauptprogramm zurück.


"get_devchannel" kann man auch gut in einer Schleife verwenden, um regelmäßig die aktuellen Kanalwerte abzufragen.


viele Grüße,
Christian
gofarmer_damp

Re: Probleme mit der Terminalschnittstelle

Beitrag von gofarmer_damp »

Oh, Mist !
Den Aschnitt mit dem Beattool hab ich in der befehlsystem.txt wohl total übersehen.
Wer lesen kann ist klar im Vorteil :lol:

Danke, werds gleich mal ausprobieren . . .

Gruß

Gofarmer
Antworten