Neues Modul für Epson-Projektoren

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

Vorheriges Thema - Nächstes Thema

fheminist

#45
Hallo zusammen,

habe nun den Epson TW750, da der TW650 anscheinend auf dem Versandweg beschädigt wurde...
Bei dem Epson TW750 wurde die Authentifizierung vom "Epson Web Control" auf "digest" Authentifizierung umgestellt....

Die get-Request-Commants sind gleich geblieben (also wie beim TW650 mit aktualisierter FW).


Hier das angepasste python-Skript:

#!/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
##  20210506 ab Epson tw750 wurde die Auth-Methode geändert...
##       nicht mehr HTTPBasicAuth (alt) sondern... HTTPDigestAuth (neu)
## -- ------------------------------------------------------------ --

import requests
import re
import time
import sys
from requests.auth import HTTPDigestAuth    ## 20210506 auth neu ab tw750

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


## auth = requests.auth.HTTPBasicAuth(username, password)   ## 20210506 bis tw650 geht das hier
auth = requests.auth.HTTPDigestAuth(username, password)     ##    ab epson tw750 geht nur diese zeile...
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  ## klappt nun auch...
    print(retval)
    return retval


def turnProjectorOn():
  if not 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)



Pypjlink hat bei mir leider nicht geklappt... Das hatte ich zwischenzeitlich auch mal probiert. Entweder ich hab die Installation verbockt, oder evtl. schlägt hier auch die auth ins leere.

VG


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

Zitat von: fheminist am 06 Mai 2021, 20:44:01
Pypjlink hat bei mir leider nicht geklappt... Das hatte ich zwischenzeitlich auch mal probiert. Entweder ich hab die Installation verbockt, oder evtl. schlägt hier auch die auth ins leere.

Wenn Du PJLink im Beamer Menü hast kannst Du dort die Auth abschalten. (ist per Default ohne Passwort)

Wenn Du keine Einstellungen dafür findest kann er es vermutlich nicht.

fheminist

Hallo Frank,

ne die Einstellung habe ich nicht, dann ist zumindest klar, warum es bei mir nicht geklappt hat.

Danke für den Tipp.
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 ...

hapege

#48
Hallo,

Ich steuere meinen Epson Beamer aktuell auch über ein eigenes Python Script. Aber nachdem mir das Handling mit externen Bibliotheken und Skripten doch ein wenig umständlich scheint, und die das vorhandene Modul 70_ESCVP21 kein LAN "spricht", habe ich mal ein wenig rumgespielt und mir ein Modul für die Ansteuerung via VP.net über (W)Lan gebaut. Das muss doch auch eleganter gehen als mit Konvertern und externen Tools :-)
Ich bin kein Experte, aber habe versucht mich an die fhem Entwicklungsrichtlinien zu halten - die Fachleute mögen mir eventuelle Verbrechen gegen diese oder Perl bitte beratend verzeihen ;-)

Das neue Modul läuft bei mir mit einem Epson TW5650 aktuell stabil in Test- und Produktivsystem - hat jemand Lust und Interesse das mal auszuprobieren? Die commands sind ja offenbar bei allen Epsons grundsätzlich gleich.

CU,

Hermann
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

Frank_Huber

Zitat von: hapege am 17 Januar 2022, 13:47:45
Ich steuere meinen Epson Beamer aktuell auch über ein eigenes Python Script. Aber nachdem mir das Handling mit externen Bibliotheken und Skripten doch ein wenig umständlich scheint, und die das vorhandene Modul 70_ESCVP21 kein LAN "spricht", habe ich mal ein wenig rumgespielt und mir ein Modul für die Ansteuerung via VP.net gebaut. Das muss doch auch eleganter gehen als mit Konvertern und externen Tools :-)
Ich bin kein Experte, aber habe versucht mich an die fhem Entwicklungsrichtlinien zu halten - die Fachleute mögen mir eventuelle Verbrechen gegen diese oder Perl bitte beratend verzeihen ;-)

Das neue Modul läuft bei mir mit einem Epson TW5650 aktuell stabil in Test- und Produktivsystem - hat jemand Lust und Interesse das mal auszuprobieren? Die commands sind ja offenbar bei allen Epsons grundsätzlich gleich.

Mahlzeit,

Ich stehe sehr gerne zum testen bereit. :-)

Grüße
Frank

hapege

Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

Frank_Huber


hapege

Hi,
Hast Du eine Doku zu den VP21 commands für den 2250U?
Ich habe im Netz einiges gefunden (siehe anbei), aber nicht spezifisch für den 2250U.
Standards wie PWR, LAMP, SOURCE etc sollten aber hoffentlich generisch sein...
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

hapege

Hab was gefunden, anbei. Der VP21 Befehlssatz ist übersichtlich ;-) Ich probiere mal ob ich das mit einer Modellauswahl einbauen kann.
PWR und MUTE gehen out-of-the-box :-)
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

Frank_Huber

Ich habe nie groß gesucht da das mit dem pjlink soweit funktioniert. :-)

Was ich nutze ist:
- Überwachung an/aus.
- an/aus schalten
- Info Lampenstunden

hapege

- ein/aus (PWR) sollte auch per VP21 gehen
- Lampenstunden (LAMP - mein zweiter Hauptanwendungszweck ;-) ) ist beim EB-2250U nicht explizit genannt, taucht aber eigentlich bei allen Projektoren aus --> let's test...
- was meinst Du mit "Überwachung"?
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

Frank_Huber

Zitat von: hapege am 17 Januar 2022, 15:41:34
- was meinst Du mit "Überwachung"?
Na zu wissen ob er an oder aus ist. ;)

defmod Beamer CustomReadings
attr Beamer event-on-change-reading .*
attr Beamer group Beamer
attr Beamer interval 15
attr Beamer readingDefinitions PowerState:qx(pjlink -p 192.168.12.95 power)
attr Beamer stateFormat PowerState

hapege

OK, das ist ein Argument ;-) Ich prüfe aktuell nur die IP Verbindung, weil ich meinen Beamer nach dem Herunterfahren vom Strom nehme. Aber so ein periodischer Check macht Sinn...ich schau mal was mir dazu einfällt.
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

hapege

#58
Update 2022-01-26

  • Version 1.01.02
  • Unterstützung mehrerer Devices
  • debug Attribut (blendet im Normalbetrieb unnötige sets aus)
  • Code cleanup


Update 2022-01-21

  • Version 1.01.01
  • rescheduling aufeinanderfolgender set commands
  • TW6100 hinzugefügt
  • modellspezifische Results eingebaut


Update 2022-01-19

  • Version 0.3
  • Optimierung der "disconnect" Erkennung
  • Neues Attribut "statusOfflineMessage" (Text im Reading statusCheckCmd [default: PWR] der bei STATE=disconnected agesetzt wird [default: "offline"])
  • Helptext hinzugefügt


Helptext

ESCVP21net implements Epson VP21 controlvia (W)LAN, uses VP.net.
Define
define <name> ESCVP21net <IP_Address> <port> <[model]>
       
This module controls Epson Seiko Devices via TCP, using VP.net and ESC/VP21 commands.
For the time being, only Epson initilization is implemented (needs a special initialization string "ESC/VP.net").

  • "IP_Address" is the IP Address of the projector
  • "port" is ... guess? Yes, the port (Epson standard is 3629)
  • model defines your type of projector. It is used for loading a suitable pre-defined command set. No parameter or default; will provide you with a limit "set" (PWR, MUTE, LMP, KEY, GetAll). You can try TW5650; to get a nearly full set of implemented commands. Providing the maintainer with a suitable set for your projector will extend the module's capabilities ;-)
    Individually supported by now: TW5650, EB2250U, TW6100
    "Hidden Feature:" Type "Scotty" will give you everything (as he does always ;) ). Not every command will work for you. You are the Captain, so decide wisely what to choose...
Example: define EPSON ESCVP21net 10.10.0.1 3629 TW5650


Set
set <name> <option> <value>
Available set commands depend on your model, see above.
For the predefined commands, "nice" names will be shown in the readings, e.g. for PWR: Standby (Net on) instead of the boring PWR=04 (which is the device's answer if the projector is in Standby with LAN on).
Default set commands are

  • PWR
    on or off to switch power, get to query current value
  • MUTE
    on or off to mute video signal (i.e. blank screen), get to query current state
  • LAMP
    get to query lamp hours
  • KEY
    sends the value you enter to the projector.
    E.g.KEY 03 should open the OSD menu, KEY 05 should close it.
  • GetAll
    This is a little bit special - it does not send just one command to the projector, but will select every command defined which has a get option, send it to the projector and update the correspnding reading. If a command gives no result or an error, this will be suppressed, the old value is silently kept.
    The status of GetAll is shown in the GetAll reading. It will either show the read commands, or inform if an error was received.
  • reRead
    Also "special". Will just restore the available set commands for your projector type in case they got "lost" (which will happen if you e.g. reload the module...)

Attributes
attr <name> <attribute> <value>
Use those Attributes to control the behaviour of your device.

  • Manufacturer: Epson|default
    Is not used currently.
  • AdditionalSettings: cmd1:val_1,...,val_n cmd2:val_1,...,val_n
    You can specify own set commands here, they will be added to the set list.
    Multiple own sets can be specified, separated by a blank.
    command and values are separated by ":", values are separated by ",".
    Example: ASPECT:get,10,20,30 SN:noArg
    Each command with get will we queried when doing set <name> GetAll
  • connectionCheck: off|(value in seconds)
    value defines the intervall in seconds to perform an connection check. This is required, since the standard connection handling of fhem (DevIo) will not detect an broken TCP connection, so the state disconnected; will only trigger after TCP timeout (60-90 minutes). If you are ok with this, just set it to off.
    Default value is 60 seconds.
  • statusCheckIntervall: off|(value in seconds)
    value defines the intervall in seconds to perform an status check. Each interval the projector is queried with the command defined by statusCheckCmd (default: PWR to get power status).
    Default value is 60 seconds.
  • statusCheckCmd: (any command you set)
    Defines the command used by statusCheckIntervall. Default: PWR to get power status.
  • statusOfflineMsg: (any message text you set)
    Defines the message to set in the Reading related to statusCheckCmd when the device goes offline. Status of device will be checked after each statusCheckIntervall (default: 60s), querying the statusCheckCmd command (default: PWR), and if STATE is disconnected the Reading of statusCheckCmd will be set to this message. Default: "offline".



Hi,

OK ... dann lasse ich meine Gehversuche mal auf die fhem Welt los :-)

Ein bisschen Erklärung:

Das Modul "ESCVP21net":


       
  • nutzt DevIO für ein Monitoren der Verbindung. Ich habe es nicht geschafft, via DevIo direkt Kommandos an den socket des Eson zu schicken oder von dort empfangen, nutze es als nur zum non-blocking Prüfen der TCP Verbindung (hab ich bei 70_STV abgeschaut, mein Samsung Receiver hört auch nur auf direkte sockets)
  • die Kommunikation mit dem Beamer läuft deshalb über einen im Modul gesteuerten Socket
  • das ganze passiert damit non-blocking, da ein ausgeschalteter Beamer zwecks Timeout fhem sonst für ein paar Sekunden blockiert
  • Das interne Absetzen von commands ist ebenfalls non-blocking implementiert, da die Antwort vom Epson wohl auch mal ein paar Sekunden dauern kann. Ist evtl. unnötig, aber sicher ist sicher ;-)
  • das Modul kommt mit einem Basis-Set an Kommandos (Power, Mute, Lamp, Key)...
  • ...sowie einem "GetAll", welches alle commands abfragt die ein "get" enthalten (z.B. PWR:get,on,off in der internen setList)
  • über attr "AdditionalSettings" kann man, getrennt durch blanks, eigene Set-Kommandos dazufügen:
    <cmd1>:[get|noArg],<val1>,...,<valn> <cmd2>:[get|noArg],<val1>,...,<valn>
  • ich kann auch im Modul Sub-sets für betimmte Projektortypen anlegen, z.B. für Kommandos die nur ein bestimmter Typ beherrscht; diese würden dann aktiviert wenn bei der Definition des Devices der entsprechende Typ angegeben sind (momentan kennt das Modul nur 2 Typen: TW5650 und EB-2250U ;-), der TW5650 hat das umfangreichere set)
  • DevIo bekommt nicht von selbst mit, wenn der Projektor stromlos geschaltet wird, i.e. die TCP Verbindung stirbt. Erst nach einem ca 60 minütigen Timeout geht der Status auf "disconnected". Deshalb gibts attr "connectionCheck", um ein KeepAlive Intervall anzugeben. Es wird dann über einen internen Timer regelmäßg via DevIo geprüft ob der Beamer noch erreichbar ist. Der Timer "stirbt" praktischerweise bei einem "disconnect" und erwacht wieder bei "connected".
  • Zur Überwachung gibt's auf besonderen Wunsch das attr "statusCheckInterval". Ist es gesetzt, wird alle <n> Sekunden ein Wert vom Beamer abgefragt. Default wird "PWR" benutzt, das kann per attr "statusCheckCmd" angepasst werden.
  • Das attr "Manufacturer" wird aktuell nicht abgefragt, wird evtl gebraucht wenn mal z.B. ein Seiko Beamer (der auch VP21 spricht) einen andren Initialisierungsstring bräuchte.
  • via set "GetAll" werden alle Werte vom Beamer abgefragt, die ein "get" definiert haben. Im Reading "GetAll" werden dann jeweils die letzen geschickten commands angezeigt.
Definition des Devices via

define <Name> ESCVP21net <ip> <port> [<model>]


Port ist normalerweise 3629. Ohne Angabe von <model> wird "default" genommen. Ich empfehle zum Testen TW5650.

Da fehlt sicher noch einiges, bin aufs Feedback gespannt. Was ich nicht hinbekomme ist die "Device Specific help". Im Modul hab ich die html section gefüllt (nur mit "Teiltexten"), aber sie wird nicht angezeigt. Vielleicht kann mir jemand einen Tipp geben was ich hier falsch mache, oder ob ich die Help noch irgendwo eintragen muss...

Feedback, Kommentare, Hilfen wie es besser oder sauberer geht jederzeit gerne - wie gesagt, ich bin kein Experte...

CU,

Hermann
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

eldrik

Ich teste auch einmal etwas, ich habe auch einen TW5650.

Positiv ist mir bereits aufgefallen, dass der Standby erkannt wird, bisher ermittle ich dieses über httpmod und dem auslesen der im Stb. verfügbaren Website.

Source, Mute, Volume, on/off steuere ich derzeit über ein python Skript an (hier im Thread verlinkt) mal sehen ob ich dieses mit dem Modul elegant abgelöst bekomme.

Greetz
Eldrik