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)