2024-01-14 iiyama ProLite X4071UHSU-B1 Seriell-Steuerung SSH Node-Red

RS232 Seriell-Anschluss am Monitor

Monitorsteuerung per COM-Port

Mein Monitor ist ein ⎇iiyama ProLite X4071UHSU-B1, welchen ich schon lange über meine, auf ⎇Node-RED basierende Hausautomatisation steuern möchte. (Quelle, Helligkeit, Ein/Aus etc.) Es liegt nahe die Steuerung vom angeschlossenen PC aus durchzuführen. Dafür gäbe es das ⎇Display Data Channel/Command Interface (DDC/CI), welches sich mit verschiedenen Softwaren ansteuern läßt. Zum Beispiel mit, vom immer wieder genialen Nir Sofer entwickelten, ⎇ControlMyMonitor. Das Problem: Unter Windows haben die Programme nur von der Desktop-Sitzung aus zugriff auf die Schnittstelle. Eine Steuerung z.B. per SSH ist so nicht möglich. Zwar kann man sich mit Tricks, wie per Aufgabenplanung "Nur ausführen, wenn der Benutzer angemeldet ist" SCHTASKS /Run, auf die Desktop-Sitzung bugsieren, aber das Verlangt nach zu vielen Rechten, die man nicht seiner Haussteuerung anvertrauen sollte. Bzw. ein Stapeln von Tricks/Hacks die nicht schön sind, wenn man eine Alternative hat.
Serielles RS232 Kabel
In diesem konkreten Fall ist die Alternative, das der Monitor über einer serielle RS232-Schnittstelle verfügt. Das passende Kabel gehört zum Lieferumfang und die Beschreibung des sehr einfachen Protokolls gibt es auf der Herstellerwebseite. ⎇X4071_LE4041_RS232Serial Communication Control Specification

Um mit dem Protokoll zu experimentieren habe ich ⎇PuTTY verwendet. Hier die Passenden Einstellungen: Putty Session Einstellung
Putty Terminal Einstellungen
Putty Kontrollopitionen der COM-Verbindung

Achtung, ohne "Local line editing" auf "Force on" funktioniert es nicht!

Das nächste Problem war nun, das die Befehle nur mit PuTTY funktioniert haben. Dasselbe Profil mit "plink -load" geladen funktionierte nicht. Und auch die Befehle einfach per CMD ECHO an >COM1 leiten funktionierte nicht. Natürlich waren per Geräte-Manager die Einstellungen laut Spezifikation gesetzt:
Geräte-Manager Anschlusseinstellungen COM1

Erst nach einer peinlich langen Zeit habe ich mir dann den genauen Hex-Code für "Enter" aus der Spezifikation in der ⍈ASCII-Tabelle angeschaut.
Beispiel eines Monitorbefehls
Es ist Hex 0D, aka CR bzw. Carriage Return! Windows sendet bei einem Enter CR und LF, *inux sendet LF. Früher™ sendeten MACs CR. (Sind jetzt ja UNIX und damit LF.) Offensichtlich stört sich der Monitor am LF. Warum PuTTYs Local line editing dafür sorgt, das nur CR übertragen wird, verstehe ich am allerwenigsten!
Jedenfalls ist die Lösung für eine einfache Steuerung von Windows aus, die Gewünschten Befehle jeweils in einer Datei abzuspeichern und den Zeilenumbruch dann nur mit CR zu kodieren. Das geht z.B. mit ⎇Nodepad++: Nodepad++ Line Encoding

Zum Ausführen eines Befehls sendet man die Datei einfach an den COM-Port: type X4071_Brightness_50 >COM1

(Das geht wie zu DOS-Zeiten und ist der Grund warum bis heute unter Windows Dateinamen nicht mit COM-NrX beginnen dürfen.)

Nun der Endspurt für die Befehligung von Node-RED aus:
Auf dem Windows-PC ⎇SSH installieren. Eine Gruppe sshdusers anlegen. Die Gruppe in C:\ProgramData\ssh\sshd_config ⎇als einzige erlaubte Gruppe eintragen. sshd_config AllowGroups
(Dienst neu starte nicht vergessen.)
Neuen Benutzer anlegen, der nur Mitglied der Gruppe sshdusers ist.
Windows Benutzer ccu3 Mitglied von

Auf Node-RED die Palette ⎇@insectos/ssh-exec installieren. Das Paket hat einen Beispiel-Flow den man importieren kann. Und das war es im Grunde. Unter Network Nodes gibte es nun ssh-exec.
Node-RED edit ssh-exec node

Die Befehle ans Zielsystem übergibt man per msg.payload, wobei man darauf achten muss "Enter zu drücken", sonst passiert nix. Das heißt die Befehl-String muss bei einem Linux- mit \n und bei einem Windows-Ziel mit \t\n abgeschlossen werden.
Node-RED ssh-exec Beispiel

Download: X4071_Examples.zip

BTW: Die Funktion "ECO Mode" des Monitors läßt sich weder per DDC/CI noch per Seriell-Schnittstelle kontrollieren. Meine Vermutung ist, das es sich dabei um eine an die Firmware angeflanschte Funktion handelt, um irgendwelchen Regularien zu entsprechen. Die verschiedenen ECO Modes sind lediglich vordefinierte Helligkeitseinstellungen der LED-Hintergrundbeleuchtung. (Mode 2 entspricht Helligkeit 50. etc.) Der ECO Mode muss deaktiviert sein, damit der per Schnittstelle gesetzte Helligkeitswert Anwendung findet. (Ansonsten wird der Wert zwar vom Monitor angenommen, aber die Beleuchtung ändernd sich nicht.)

⍈Homepage

#