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 !
Probleme mit der Terminalschnittstelle
-
- < PC_DIMMER >
- Beiträge: 544
- Registriert: 19.03.2009, 17:49
- Wohnort: Bad Hersfeld bzw. Stuttgart
Re: Probleme mit der Terminalschnittstelle
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
Grüße,
Ingo
Re: Probleme mit der Terminalschnittstelle
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:
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 . . .
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.jpg (207.97 KiB) 7554 mal betrachtet
- Christian
- PC_DIMMER-Entwickler
- Beiträge: 1866
- Registriert: 12.11.2007, 09:30
- Wohnort: Knw.-Remsfeld
- Kontaktdaten:
Re: Probleme mit der Terminalschnittstelle
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
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
Re: Probleme mit der Terminalschnittstelle
Hallo Christian,
Gruß
Gofarmer
Wenn Du mir noch sagst, wo ich den Quellcode herbekomme schau ich s mir gerne an.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.
Gruß
Gofarmer
- Christian
- PC_DIMMER-Entwickler
- Beiträge: 1866
- Registriert: 12.11.2007, 09:30
- Wohnort: Knw.-Remsfeld
- Kontaktdaten:
Re: Probleme mit der Terminalschnittstelle
Oh, ich hab gerade gesehen, dass er nicht mit im ZIP-Paket ist.
ich werde ihn heute Nachmittag nachliefern
bis dann,
Christian
ich werde ihn heute Nachmittag nachliefern

bis dann,
Christian
Re: Probleme mit der Terminalschnittstelle
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
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)
- Christian
- PC_DIMMER-Entwickler
- Beiträge: 1866
- Registriert: 12.11.2007, 09:30
- Wohnort: Knw.-Remsfeld
- Kontaktdaten:
Re: Probleme mit der Terminalschnittstelle
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
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:
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:
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
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
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
"get_devchannel" kann man auch gut in einer Schleife verwenden, um regelmäßig die aktuellen Kanalwerte abzufragen.
viele Grüße,
Christian
Re: Probleme mit der Terminalschnittstelle
Oh, Mist !
Den Aschnitt mit dem Beattool hab ich in der befehlsystem.txt wohl total übersehen.
Wer lesen kann ist klar im Vorteil
Danke, werds gleich mal ausprobieren . . .
Gruß
Gofarmer
Den Aschnitt mit dem Beattool hab ich in der befehlsystem.txt wohl total übersehen.
Wer lesen kann ist klar im Vorteil

Danke, werds gleich mal ausprobieren . . .
Gruß
Gofarmer