(W)LAN Steuerung für Epson Beamer - ESCVP21net.pm

Begonnen von hapege, 30 Januar 2022, 20:58:50

Vorheriges Thema - Nächstes Thema

hapege

Hallo fhem'ler mit einem Espon Beamer,

ich habe ein Modul geschrieben, um Epson Seiko Beamer über (W)Lan anzusteuern: 70_ESCVP21net.pm
Genutzt wird das command-set ESC/VP21, das wohl alle Epson Projektoren beherrschen, über VP.net (sprich TCP socket).
(Das hier (https://forum.fhem.de/index.php/topic,13097.0.html) vorgestellte Epson Modul kann kein LAN und wird offenbar nicht mehr gepflegt)

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", oder "Scotty" ;) - quasi ein "gib-mir-alles", wie man das von Scotty eben gewohnt ist.

Da fehlt sicher noch einiges, bin aufs Feedback gespannt.
Ich committe das auch mal in den Trunk.

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.

laserrichi

Super, ich schau es mir an wenn ich meinen MAX3232 bekommen habe um es dann mit ESPEasy anzubinden.
Berichte dann wenn ich es getestet habe.
RaspberryPi 4 Bullseye,Homematic,Z-Wave,Rademacher Duofern,Signalduino,Fritz7590,ESPEasy,Tasmota,Robonect,Kameras,1-Wire,Modbus,Solar,Maranz,VU+,ulanzi tc001 mit awtrix light

hapege

Hi,
was genau hast Du vor? RS232/TTL-Adapter am Beamer, nodeMCU dran, darauf ESPEasy um ins WLAN zu kommen, ansprechen via MQTT?
Stellt denn ESPeasy einen socket für VP.net zur Verfügung und beantwortet die init Sequenz von VP.net?
Du nutzt doch am RS232 "nur" VP21, nicht VP.net - oder verstehe ich Dich falsch?

Das Modul verbindet direkt mit dem Server im Epson Beamer per LAN, nicht per RS232. Die commands sind dieselben, aber RS232 ist halt kein TCP/VP.net...
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

hopsi

prima, das scheint schneller auf's Aufwachen zu reagieren als die alte Lösung. Ich teste mal ein wenig rum.

Nutze einen EH-TW7400W mit zusätzlichem WLAN-Modul. Eingerichtet als Modell 'Scotty' liefert ein GetAll zumindest schon eine Handvoll Resultate:

2022-02-01 19:56:06 ESCVP21net Epson CONNECTED
2022-02-01 19:56:36 ESCVP21net Epson GetAll
2022-02-01 19:56:36 ESCVP21net Epson LAMP: 55
2022-02-01 19:56:36 ESCVP21net Epson PWR: Standby (Net on)
2022-02-01 19:56:36 ESCVP21net Epson GetAll: LAMP,PWR
2022-02-01 19:56:41 ESCVP21net Epson GetAll undefined


Lamp ist natürlich ganz interessant, sind das die Betriebsstunden? Ansonsten interessiert mich eigentlich nur, ob das Teil angeschaltet wird, damit ich die Leinwand runterfahre.
Was da 'undefined' ist, weiß ich nicht.

Im log habe ich einige Meldungen dieser Art:
2022.02.01 19:54:01 1: PERL WARNING: Use of uninitialized value $rv in concatenation (.) or string at ./FHEM/70_ESCVP21net.pm line 857.
2022.02.01 19:54:01 3: eval: {ESCVP21net_setValueDone('Epson|PWR|ERROR!')}
2022.02.01 19:54:06 3: [Epson]: DevIo_Open has FD but no NEXT_OPEN, next timer set


Danke jedenfalls dafür,
Christian

hapege

#4
Hi,

der TW7400 sollte (im hochgefahrenen Zustand) realitv umfangreiches Feedback geben. Dein Output kommt im Standby ("Standby (Net on)"), da liefert er  nur PWR und LAMP (Ja, LAMP sind die Betriebsstunden). Wenn er läuft, sollte auch ASPECT, SOURCE etc ein Ergebnis liefern.
Das "undefined" ist unkritisch, kommt vom "GetAll" selbst, muss mal sehen wie ich das abfangen kann.
Danke für die Perl Warning - der Beamer hat auf PWR als Antwort "ERROR" geschickt, das hab ich zwar abgefangen aber wohl eine Variable übersehen. Unkritisch, wird gleich gefixed :-)
Die DevIo_open Meldung ist nur zur info und besagt, dass der Beamer erreichbar ist, und der "next timer" für den connection check gesetzt wurde. Schiebe ich in den LogLevel 5.
Was sagt Dein TW7400 denn bei GetAll im Betriebszustand?

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

hopsi

#5
2022-02-01 22:33:10 ESCVP21net Epson CONNECTED
2022-02-01 22:33:19 ESCVP21net Epson GetAll
2022-02-01 22:33:19 ESCVP21net Epson ASPECT: Normal
2022-02-01 22:33:19 ESCVP21net Epson ILLUM: on
2022-02-01 22:33:19 ESCVP21net Epson MUTE: OFF
2022-02-01 22:33:19 ESCVP21net Epson LAMP: 57
2022-02-01 22:33:19 ESCVP21net Epson SOURCE: WirelessHD
2022-02-01 22:33:19 ESCVP21net Epson GetAll: ASPECT,ILLUM,PWR,MUTE,LAMP,SOURCE


Hm. Habe ich wohl schon wieder 2 Stunden Ferngesehen...

event-on-change-reading habe ich auf .* gesetzt. Bekomme ich die Statusmeldung 'ESCVP21net Epson CONNECTED' im Minutentakt noch zum Schweigen?

Hier noch eine Perl-Warnung:
PERL WARNING: Use of uninitialized value $attr_value in concatenation (.) or string at ./FHEM/70_ESCVP21net.pm line 391.

Christian

hapege

Sieht doch gut aus - faszinierend ;-)
Die connected Meldung habe ich in den loglevel 5 verschoben und die erste warning gefixed, aktualisierte version ist im Trunk, sollte also morgen per update verfügbar sein.
Die zweite Warning sieht danach aus, als hättest Du ein attribut gesetzt ohne Wert, kann das sein?
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

hopsi

Das kann durchaus sein, dass ich da was ohne Wert gesetzt habe, das log habe ich erst im Anschluss überprüft. Konnte ich jetzt auch nicht reproduzieren.
Evtl. kann auch '[Epson]: Socket opened to 10.75.157.212 on port 3629' noch in level 5. Das erscheint im Intervall von statusCheckInterval im log.

Christian

betateilchen

@hapege: achte bitte bei Deinen svn-commits darauf, nur die Dateien einzuchecken, die Dir auch wirklich gehören. Die fhem.cfg gehört da definitiv nicht dazu. Danke.

-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

hopsi

Zitat von: hopsi am 01 Februar 2022, 23:24:28
Evtl. kann auch '[Epson]: Socket opened to 10.75.157.212 on port 3629' noch in level 5. Das erscheint im Intervall von statusCheckInterval im log.

Christian

Ich mach mal die Ingrid. Nachtrag: muss die Verbindung wirklich immer neu aufgebaut werden? Oder kann die einfach offen bleiben, bis sie zusammenbricht?

hapege

#10
@betateilchen: Oh, SORRY!
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

Frank_Huber

#11
Hi,

So, hab das auch endlich mal eingerichtet auf dem Testsystem. kurzes Feedback bis jetzt:
- warum machst den IP port nicht auch optional im Define? ohne Angabe wird 3629 genommen.
- trotz gesetztem Stateformat Attribut wird STATE immer wieder mit "opened" vom Reading state überschrieben.
- ein "set PWR toggle" wäre evtl hilfreich. :-)
- funktional super! das eine Gerät ersetzt mir bald 3 Geräte der alten Variante über pjlink. :-)

Danke!
Grüße
Frank

hapege

#12
Hi,

danke fürs Feedback :)
- port als default setzen ist natürlich eine gute Idee, baue ich ein
- überschreiben des state: Ja, da funkt Dev_Io dazwischen, da muss ich mir noch was einfallen lassen... --> {devioNoSTATE} ist vermutlich die Lösung, baue ich ein.
- die statusCheck Meldung kommt auch in den loglevel5
- freut mich wenns Euch gefällt und nützt :)

Und mit Grüßen an Ingrid: Wenn der Port offen bleibt, können andere apps (Epson tool etc) evtl. nicht auf den Beamer zugreifen. Auf - lesen - zu - dann erst mal Ruhe scheint mir der ressourcenschonendere und kooperative Ansatz zu sein. Ich hatte aber anfangs tatsächlich ein "stayconnected" flag mit drin, um den socket offen zu halten, verworfen wegen siehe oben.
Developer: 70_ESCVP21net.pm, 70_SVDRP.pm
Mitglied FHEM e.V.

laserrichi

Zitat von: hapege am 01 Februar 2022, 16:05:54
Hi,
was genau hast Du vor? RS232/TTL-Adapter am Beamer, nodeMCU dran, darauf ESPEasy um ins WLAN zu kommen, ansprechen via MQTT?
Stellt denn ESPeasy einen socket für VP.net zur Verfügung und beantwortet die init Sequenz von VP.net?
Du nutzt doch am RS232 "nur" VP21, nicht VP.net - oder verstehe ich Dich falsch?

Das Modul verbindet direkt mit dem Server im Epson Beamer per LAN, nicht per RS232. Die commands sind dieselben, aber RS232 ist halt kein TCP/VP.net...

Ja ich will quasi das serielle über IP dann in den Raspi führen. Im Beamer hab ich ja kein LAN Interface.
ESPEasy ist einfach nur serial Server und reicht das einfach nur durch.
Mit modbus usw. mach ich das ja genauso.

im prinzip müsste man nur die init sequenz dann weglassen...
vp.net ist übrigens eine Cloud....   
RaspberryPi 4 Bullseye,Homematic,Z-Wave,Rademacher Duofern,Signalduino,Fritz7590,ESPEasy,Tasmota,Robonect,Kameras,1-Wire,Modbus,Solar,Maranz,VU+,ulanzi tc001 mit awtrix light

hapege

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