Neues Modul für Epson-Projektoren

Begonnen von henryk, 31 Mai 2013, 18:26:09

Vorheriges Thema - Nächstes Thema

Owel

Hat jetzt für mich funktioniert. Beide Adapter funktionieren.
Hatte auf der Schnittstelle eine 'hello message' erwartet, sprich nen prompt, aber kommt ja nichts...

Aber wenn ich Befehle hinschicke, dann kommt was zurück.
funktioniert also!

Jetzt versuche ich dann noch das Modul hier zum laufen zu bekommen. Wo bekomme ich ein akutelles release her? Scheint ja jetzt doch nicht maintained zu sein...


Owel

Wieder eine Erfolgsmeldung!

Habe das Modul aus Git geladen, und die Abfrage vor dem Split eingefügt.
Es funktioniert tadellos!

Nur jetzt habe ich das nächste Problem.
Ich habe zwei Fhem installationen...
Fhem A: Hauptfhem, hier läuft alles!
Fhem B: hier ist nur das Epson Modul, da ich kein Kabel bis Fhem A legen kann...

Wie kann ich nun den Beamer von Fhem A zugreifbar machen?
Any ideas?


hachinga

Hallo zusammen,

Danke erstmal für das Modul, genau danach habe ich gesucht! Leider bekomme ich es mit meinem Epson EH-TW3200 nicht zum laufen. Das Modul versucht ständig eine Verbindung aufzubauen, es kommt aber anscheinend keine Rückmeldung vom Beamer. Mehrfache Neustarts und ein Kabelwechsel haben nichts gebracht. Auch eine Ansteuerung über minicom klappt nicht. Kann es sein, dass man die RS232 Schnittstelle erst im Beamer aktivieren muss? Im Menü des Beamers kann ich leider nichts finden, in der Anleitung steht zum Thema RS232 gar nichts. Kann mir jemand helfen?

Danke & Gruß

Thorsten

eldrik

#33
Moin,

Ich hebe den Thread einmal nach oben, bin seit kurzem Besitzer eines TW5650 und mit ein wenig Recherche konnte ich die integrierte Webschnittstelle (WLAN Anbindung) zur Steuerung des Beamers, wie sie auch die Espon iprojection App verwendet, anzapfen.

Bei Interesse kann ich gerne die Python Datei posten, die ich bei meiner Suche gefunden habe und um weitere Aufrufsoptionen erweitert habe.

Vielleicht hat ja auch jemand Lust und den Skill dies in das Fhem Modul einzupflegen als weitere Schnittstellenvariante für die Moduldefinition?

Greetz
Eldrik

dathu

Hallo Elderik,

ich würde auch gerne meinen TW6700 einbinden und dabei auf eine IR Lösung verzichten.
Ich hatte zunächst gehofft den Beamer über USB steuern zu könne.

Bezüglich der WLAN Schnittstelle konnte ich leider nicht so viel finden. Könntest du mir deine Python Datei zu Verfügung stellen?

Grüße,
David

Mickey Mouse

also wenn es eine Möglichkeit gäbe z.B. einen Speicher per (W)LAN direkt aufzurufen, dann wäre ich auch sehr interessiert!

zur Zeit mache ich das über ein "Makro" in FHEM das über den Harmony Hub per IR Kommandos die Sache aufruft (eine normale "Eingabe" simuliert: Mem, down, down, OK, down, down, ...). Das funktioniert zwar im Prinzip, ist aber nicht besonders elegant.
erstmal muss man mit ein paar dummy ESC "klare Verhältnisse schaffen" (falls gerade ein Menü offen ist) und viel ärgerlicher: das ganze dauert doch eine ganze Weile (zu schnell kann ich die Kommandos nicht senden, dann wird immer mal eins verschluckt) und wenn sich z.B. die Auflösung gerade ändert (man hat gerade das Menü verlasen und den Film gestartet) dann nimmt der Epson (hier 9300) keine Befehle an.

eldrik

Zitat von: dathu am 21 Februar 2018, 15:42:20
Hallo Elderik,

ich würde auch gerne meinen TW6700 einbinden und dabei auf eine IR Lösung verzichten.
Ich hatte zunächst gehofft den Beamer über USB steuern zu könne.

Bezüglich der WLAN Schnittstelle konnte ich leider nicht so viel finden. Könntest du mir deine Python Datei zu Verfügung stellen?

Grüße,
David

Hi,

anbei der Code für das Python Skript

#!/usr/bin/python3

import requests
import re
import time
import sys

projectorAddress = 'http://IPAdresse'
username = 'EPSONMOBILE'
password = ''

auth = requests.auth.HTTPBasicAuth(username, password)
headers= {'Referer': projectorAddress + '/cgi-bin/webconf'}

def getRequest(url):
  return requests.get(projectorAddress + url, auth = auth, headers = headers)

def postRequest(url, data):
  return requests.post(projectorAddress + url, data = data, auth = auth,
                       headers = headers)

def projectorIsOn():
  r = postRequest('/cgi-bin/webconf', {'page': '03'}) # Get info page
  retval = r.text.find('The projector is currently on standby.<BR>') == -1
  print(retval)
  return retval

def turnProjectorOn():
  if not projectorIsOn():
    getRequest('/cgi-bin/directsend?KEY=3B')

def turnProjectorOff():
  if projectorIsOn():
    getRequest('/cgi-bin/directsend?KEY=3B')
    time.sleep(0.3)
    getRequest('/cgi-bin/directsend?KEY=3B')

argument = sys.argv[1] or ''
if sys.argv[1] == 'on':
  turnProjectorOff()
elif sys.argv[1] == 'off':
  turnProjectorOff()
elif sys.argv[1] == 'hdmi1':
  getRequest('/cgi-bin/directsend?KEY=4D')
elif sys.argv[1] == 'hdmi2':
  getRequest('/cgi-bin/directsend?KEY=40')
elif sys.argv[1] == 'pc':
  getRequest('/cgi-bin/directsend?KEY=44')
elif sys.argv[1] == 'lan':
  getRequest('/cgi-bin/directsend?KEY=53')
elif sys.argv[1] == 'usb':
  getRequest('/cgi-bin/directsend?KEY=85')
elif sys.argv[1] == 'screenmirror':
  getRequest('/cgi-bin/directsend?KEY=56')
elif sys.argv[1] == 'mute':
  getRequest('/cgi-bin/directsend?KEY=3E')
elif sys.argv[1] == 'volumeDown':
  getRequest('/cgi-bin/directsend?KEY=57')
elif sys.argv[1] == 'volumeUp':
  getRequest('/cgi-bin/directsend?KEY=56')
elif sys.argv[1] == 'longforward':
  getRequest('/cgi-bin/directsend?KEY=D5')
elif sys.argv[1] == 'forward':
  getRequest('/cgi-bin/directsend?KEY=D7')
elif sys.argv[1] == 'longrewind':
  getRequest('/cgi-bin/directsend?KEY=D4')
elif sys.argv[1] == 'rewind':
  getRequest('/cgi-bin/directsend?KEY=D6')
elif sys.argv[1] == 'play':
  getRequest('/cgi-bin/directsend?KEY=D1')
elif sys.argv[1] == 'pause':
  getRequest('/cgi-bin/directsend?KEY=D3')
elif sys.argv[1] == 'stop':
  getRequest('/cgi-bin/directsend?KEY=D2')
else:
  print("Run script with parameter 'on' or 'off'")
  sys.exit(1)

sys.exit(0)


Aufruf erfolgt über ein Notify auf einen Dummy, ich schalte damit AN, AUS, HDMI1, HDMI2


dummy_beamer_wohnz:* {
system "python /opt/fhem/tw5650.py $EVTPART0 &";
}


Greetz
Eldrik

rocknob

was viele hier suchen kann man mit pyjector und pyjector_controller erreichen, momentan teste ich das noch serial (netzwerk wäre natürlich besser), ich finde das epsonprotokoll ja äußerst schrecklich aber was solls.

mal ein paar beispiele

./pyjector_controller epson -v "/dev/ttyUSB0" power status
1553320678.996861 INFO send: 'PWR?\r'
1553320680.999521 INFO recv: 'PWR=00\r:'

./pyjector_controller epson -v "/dev/ttyUSB0" lampcount status
1553322535.985180 INFO send: 'LAMP?\r'
1553322537.987681 INFO recv: 'LAMP=8\r:'

man muss "nur" sich die schreckliche doku durchlesen, ein json file anlegen und dort kann man die schritte hinterlegen. so wie ich das sehe gibt es aber beim lensmemory keine möglichkeit zu sagen "fahre an position x" oder ich begreife es nur nicht :( das INC und DEC bewegt zwar die linse aber nur in Einerschritten...

pyjector gibt es via "pip install pyjector" (achtung ich hatte probleme und musste pyserial via apt nachinstallieren), den controller findet man dann hier https://github.com/JohnBrodie/pyjector/blob/master/pyjector_controller

anbei mal mein jsonfile, das ist nicht zu 100% getestet, aber was schon geht ist memory lesen/lensmemory/an/aus/status

Astrofreak85

Ich hab folgendes Problemmit dem Modul,

da ich meinen Beamer über IP Steckdose immer nach einiger Zeot komplett vom Netz trenne hab ich imFHEM Log tausende dieser Meldungen,
mit einer Änderung des verbose-levels des Moduls verschwindet das nur leide rnicht, wie kann ich das verhindern?

ESCVP21_Watchdog: called for command 'init', resetting communication

MaJu

Auch ich nutze bisher den Umweg über Harmony-Infrarot, um meinen Epson EH-TW650 ein- und auszuschalten.
Eine RS232-Verbindung ist bei mir aufgrund der Gegenbenheiten ausgeschlossen, nun suche ich eine Lösung über WLAN.

Ist es schon jemandem erfolgreich geglückt?
Erlebnisreiche Grüße aus Leipzig!

eldrik

#40
Moin Maju,

hast du einmal hier geschaut?

https://forum.fhem.de/index.php/topic,13097.msg771364.html#msg771364

Greetz
Eldrik

MaJu

Vielen Dank.

Bisher habe ich noch nicht mit Python gearbeitet, da fehlt mir leider jegliches Basiswissen und es ist schwer, da rein zu kommen.

Das ist nach erstem Blick das gleiche Python-Script wie eine Seite zuvor. Mit dem hatte ich es bereits probiert, hatte aber keinen Erfolg. Das liegt aber vermutlich eher an mir, als am Script ...
Ich werden es nochmal testen.
Erlebnisreiche Grüße aus Leipzig!

fheminist

#42
Hallo,

erst einmal vorab: VIIIIIIEEEELLLEN Dank für das Python-Script!
Das lief bis heute zwei Jahre für meinen Epson tw650.  Vor einem Monat hat mein Beamer angefangen zu flackern und er war zur Reparatur bei 3 Firmen....
(voll Katastrophe, daher auch vor einem Monat kaputt und heute aus der Reparatur zurück .... )

Der Beamer hat nun eine neue Birne und ein FW-update erhalten. Blöd war nur, dass das P-Script nicht mehr passt... Daher wollte ich mit Euch die Anpassungen teilen.
Auch sei damit noch einmal erwähnt, dass das Skript trotz des 'alters' immer noch für die neuen Epson-Beamer super läuft.

#!/usr/bin/python3

## -- ------------------------------------------------------------ --
## C.H @ Marl
##  funktioniert mit Epson TW650
##  20210429: neue FW nach Reparatur, daher pfad von /cgi-bin/directsend
##      auf /cgi-bin/Remote/directsend angepasst
##      aktuelle FW vom Beamer: 0900 8864 CZK 2V 115
## -- ------------------------------------------------------------ --

import requests
import re
import time
import sys

projectorAddress = 'http://192.168.179.48'
username = 'EPSONWEB'
password = 'mySuperSecretPW'

auth = requests.auth.HTTPBasicAuth(username, password)
headers= {'Referer': projectorAddress + '/cgi-bin/webconf'}

def getRequest(url):
  return requests.get(projectorAddress + url, auth = auth, headers = headers)

def postRequest(url, data):
  return requests.post(projectorAddress + url, data = data, auth = auth, headers = headers)

def projectorIsOn():
    r = postRequest('/cgi-bin/webconf', {'page': '03'}) # Get info page
    retval = r.text.find('Der Projektor befindet sich im Standby-Modus.') == -1  ## ergibt immer no auth..
    print(retval)
    return retval


def turnProjectorOn():
  if projectorIsOn():
      getRequest('/cgi-bin/Remote/directsend?KEY=3B')
     
def turnProjectorOff():
  if projectorIsOn():
      getRequest('/cgi-bin/Remote/directsend?KEY=3B')
      time.sleep(0.3)
      getRequest('/cgi-bin/Remote/directsend?KEY=3B')

argument = sys.argv[1] or ''
if sys.argv[1] == 'on':
  turnProjectorOn()
elif sys.argv[1] == 'off':
  turnProjectorOff()
elif sys.argv[1] == 'hdmi1':
  getRequest('/cgi-bin/Remote/directsend?SOURCE=30')
elif sys.argv[1] == 'hdmi2':
  getRequest('/cgi-bin/Remote/directsend?SOURCE=A0')
elif sys.argv[1] == 'pc':
  getRequest('/cgi-bin/Remote/directsend?KEY=44')
elif sys.argv[1] == 'lan':
  getRequest('/cgi-bin/Remote/directsend?KEY=53')
elif sys.argv[1] == 'usb':
  getRequest('/cgi-bin/Remote/directsend?KEY=85')
elif sys.argv[1] == 'screenmirror':
  getRequest('/cgi-bin/Remote/directsend?KEY=56')
elif sys.argv[1] == 'mute':
  getRequest('/cgi-bin/Remote/directsend?KEY=3E')
elif sys.argv[1] == 'volumeDown':
  getRequest('/cgi-bin/Remote/directsend?KEY=57')
elif sys.argv[1] == 'volumeUp':
  getRequest('/cgi-bin/Remote/directsend?KEY=56')
elif sys.argv[1] == 'longforward':
  getRequest('/cgi-bin/Remote/directsend?KEY=D5')
elif sys.argv[1] == 'forward':
  getRequest('/cgi-bin/Remote/directsend?KEY=D7')
elif sys.argv[1] == 'longrewind':
  getRequest('/cgi-bin/Remote/directsend?KEY=D4')
elif sys.argv[1] == 'rewind':
  getRequest('/cgi-bin/Remote/directsend?KEY=D6')
elif sys.argv[1] == 'play':
  getRequest('/cgi-bin/Remote/directsend?KEY=D1')
elif sys.argv[1] == 'pause':
  getRequest('/cgi-bin/Remote/directsend?KEY=D3')
elif sys.argv[1] == 'stop':
  getRequest('/cgi-bin/Remote/directsend?KEY=D2')
else:
  print("cmd not found .... Run script with parameter eg with 'on' or 'off'")
  sys.exit(1)

sys.exit(0)



Hier ein doif mit dem ich die hdmi-Kanäle und on/off schaltet. Für das Einschalten muss dieses Setting aktiv sein --> Eco / Standby-Modus / Komunik.ein
Meinen DIY-Lift fahre ich erst ganz rein, wenn der Beamer kalt ist. Das ist hier auch zum Teil abgebildet. Der Rest der Steuerung ist in der 'großen' TV-Scene.

([Switch_Beamer:state] eq "on")
## 1 on
({ system("python /opt/fhem/erna_cfg/bin/epson_tw650.py on") })
(setreading $SELF BeamerSTATUS warm)

DOELSEIF ([Switch_Beamer:state] eq "off")
## 2 off
({ system("python /opt/fhem/erna_cfg/bin/epson_tw650.py off") })
(setreading $SELF BeamerSTATUS kuehlen)


DOELSEIF ( [$SELF:BeamerSTATUS] eq "kuehlen" and  [TempBeamer_esp67:temperature] < ([TempWoZi_esp67:temperature]+3) )
## 3 kalt
(setreading $SELF BeamerSTATUS kalt)



DOELSEIF ([Scene_TV_Eingang:state] eq "laptop")
## 4 hdmi 2 = 5.Wege switch
## Y-Peitsche @teufel daher kodi mute ...
(set ErnaMC4_Wozi mute on, set ErnaMC4_Wozi stop all)
(set WoZi_HDMIswitch on)
(setreading $SELF BeamerINPUT HDMI2)
({ system("python /opt/fhem/erna_cfg/bin/epson_tw650.py hdmi2") })

DOELSEIF ([Scene_TV_Eingang:state] eq "playsi")
## 4 hdmi 2 = 5.Wege switch
## Y-Peitsche @teufel daher kodi mute ...
(set ErnaMC4_Wozi mute on, set ErnaMC4_Wozi stop all)
(set PlayStation on, set WoZi_HDMIswitch on)
(setreading $SELF BeamerINPUT HDMI2)
({ system("python /opt/fhem/erna_cfg/bin/epson_tw650.py hdmi2") })

DOELSEIF ([Scene_TV_Eingang:state] eq "tv")
## 5 hdmi 1 = tv@kodi
(set PlayStation off, set WoZi_HDMIswitch off)
({ system("python /opt/fhem/erna_cfg/bin/epson_tw650.py hdmi1") })
(setreading $SELF BeamerINPUT HDMI1)
(set ErnaMC4_Wozi mute off)






Vielen Dank noch einmal und ich hoffe es hilft jemandem.


 
3*FB-Mesh ,FHEM+MariaDB+TVH+TriaxSatIPGrafana@Docker/DS220+, 6*Kodi-RPis, EpsonTW650+DIY-Lift, 3*IPCam@TVH, 2*AI@EspCAM, Robo.S6
6*Maxcio bulbs, 15*Nodemcu&WemosD1, 20*GosundSP1, 25*Shelly, 8*MC400A, 7*CometDect, abgelöst: diyCurls, 433Mhz, JeeLink, DenonAVR, FS20, HM ...

Frank_Huber

#43
Moin,

Ich bin auch gerade das Heimkino am fertigstellen.
Der Epson eb2250u läuft 1a mit dem ursprünglichen Script.
Ich überlege aber ob es sich nicht auch mit einem HTTPMOD abbilden lassen würde. Damit könnte man auch den Status abfragen ob an oder aus.
Das fehlt mir bei dem Script.
Ich versuche mich mal daran und geb hier wieder laut wenn es läuft. 😉
Schönen Feiertag noch!

Frank_Huber

#44
So, habe das mit dem HTTPMOD aufgegeben. Der Epson kann aber auch das pjlink Protokoll. damit hab ich es jetzt gelöst.

Infos: https://www.heimkino-praxis.de/pjlink-projektor-steuerung/
Install auf Raspi: https://pypi.org/project/pypjlink/
sudo pip install pypjlink

Abfragen sind dann möglich:
root@pi4-octoprint:~# pjlink -p 192.168.12.95 info
Name: BEAMER_KINO
Manufacturer: EPSON
Product Name: EPSON 2250U
Other Info: 111.111.---
root@pi4-octoprint:~# pjlink -p 192.168.12.95 lamps
Lamp 1: off (6 hours)
root@pi4-octoprint:~# pjlink -p 192.168.12.95 power
off
root@pi4-octoprint:~# pjlink -p 192.168.12.95 power on
root@pi4-octoprint:~# pjlink -p 192.168.12.95 power
warm-up
root@pi4-octoprint:~# pjlink -p 192.168.12.95 power
on
root@pi4-octoprint:~# pjlink -p 192.168.12.95 power off
root@pi4-octoprint:~# pjlink -p 192.168.12.95 power
cooling
root@pi4-octoprint:~#


in FHEM habe ich zwei CustomReadings angelegt:
defmod Beamer CustomReadings
attr Beamer interval 15
attr Beamer readingDefinitions PowerState:qx(pjlink -p 192.168.12.95 power)
attr Beamer stateFormat PowerState

defmod BeamerLampe CustomReadings
attr BeamerLampe interval 3600
attr BeamerLampe readingDefinitions Lamp:qx(pjlink -p 192.168.12.95 lamps), LampState:{(split " ", (ReadingsVal("$name","Lamp","")))[2]}, LampHours:{my $v=(split " ",(ReadingsVal("$name","Lamp","")))[3];;;;$v =~ s/^.//;;;;return $v;;;;}
attr BeamerLampe stateFormat Lamp

zum schalten hab ich ein DOIF welches ich mit einem Dummy GPIO über meine Handy App NetIO toggle:
defmod Beamer_OnOff DOIF ([GPIO_IN_dummy5:"^on$"] and [Beamer:PowerState] eq "off") {system "pjlink -p 192.168.12.95 power on &";;;;return undef}\
DOELSEIF ([GPIO_IN_dummy5:"^on$"] and [Beamer:PowerState] eq "on") {system "pjlink -p 192.168.12.95 power off &";;;;return undef}
attr Beamer_OnOff cmdState on|off
attr Beamer_OnOff do always
attr Beamer_OnOff webCmd on:off


Hoffe es hilft jemandem. Für mich funktioniert das jetzt so wie ich es mir vorstelle.