VRRoom -Telnet und Weboberfläche

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

filmgucker2
Beiträge: 237
Registriert: 8. Apr 2020 20:59
Answers: 0

VRRoom -Telnet und Weboberfläche

Beitrag von filmgucker2 »

Hallo,

mal wieder was Neues, vielleicht interessant für einige:
Ich habe eine HdFury VRRoom als HDMI Splitter/Converter, die über eine Weboberfläche und
auch über Telnet gesteuert und ausgelesen werden kann. Über Befehle in der Browserzeile
geht aber nichts. Über Telnet auf der Konsole eigentlich alles. Was befohlen und empfangen
werden kann, das wird als Liste vom Hersteller gleich mitgeliefert. Gibt es eine Möglichkeit,
das in openhab, etwa mit mqtt reinzubringen?

Mal wieder vielen Dank für Hinweise!
Raspberry Pi 4, OH 4.0.3

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: VRRoom -Telnet und Weboberfläche

Beitrag von udo1toni »

mqtt ist ein Protokoll, so wie z.B. http oder (Trommelwirbel) telnet.
openHAB hat kein telnet Binding, aber Du kannst das exec Binding verwenden, um einen Befehl per telnet abzusetzen.
telnet ist heute eher unüblich, entsprechend wirst Du es vermutlich erst installieren müssen. Außerdem gibt es bei telnet nicht wie bei ssh die Möglichkeit, beim Aufruf einfach einen Befehl zu übergeben, der dann remote ausgeführt wird.
Stattdessen bildest Du einen String, der die Befehle in passender Form enthält und sendest diese per Pipe an telnet. Z.B. unter https://stackoverflow.com/questions/701 ... sh-scripts ist das ganz gut erläutert, mit verschiedenen Beispielen.

Wenn Du einen Login brauchst, wird es allerdings tricky, dann läuft es darauf hinaus, expect zu verwenden (ist ebenfalls unter dem Link erläutert)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 237
Registriert: 8. Apr 2020 20:59
Answers: 0

Re: VRRoom -Telnet und Weboberfläche

Beitrag von filmgucker2 »

ok. Und wie kriege ich das Ergebnis dieses telnet aufrufs in mein item oder meine rule? Einen user, ein Passwort
oder keys brauche ich nicht. Auf der commandline in openhab brauche ich nur "telnet + ip und port einzugeben,
dann Befehl und schwubs liefert er mir - auf der commandline - die Antwort...
Raspberry Pi 4, OH 4.0.3

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: VRRoom -Telnet und Weboberfläche

Beitrag von udo1toni »

Wenn Du das exec Binding für den Aufruf nutzt, dann gibt es sowohl einen input Channel, als auch einen output Channel. Beide sind vom Typ String, beide kannst Du mit einem Item koppeln. Wenn Du dann noch den Parameter autorun=true setzt, wird jedes Mal, wenn Du ein sendCommand an das mit input verlinkte Item schickst, der Befehl ausgeführt und die Ausgabe erscheint im mit dem output Channel verlinkten Item.
Als Text Definition mutmaßlich etwa so:
Thing:

Code: Alles auswählen

Thing exec:command:vrroom "HDFure VRRoom" [
    command="/usr/bin/echo %2$s | /usr/bin/telnet 192.168.178.200",  // hinten steht die IP des VRRoom
    autorun=true ]
Items:

Code: Alles auswählen

String vrroomInput "HDFure Input" {channel="exec:command:vrroom:input"}
String vrroomOutput "HDFure Output" {channel="exec:command:vrroom:output"}
An vrroomInput schickst Du dann den Befehl, in vrroomOutput findest Du anschließend die Antwort.

Es gibt noch eine Datei namens /etc/openhab/misc/exec.whitelist, in der der Inhalt des command Parameters als Zeile exakt wie im Thing nochmals angegeben werden muss (das ist der Versuch, Missbrauch zu verhindern)

Falls es mit dem exec Binding nicht klappen sollte (das ist definitiv eines der anspruchsvolleren Bindings, weil es so viele Stellen gibt, wo kleinste Fehler zum totalen Ausfall führen), könntest Du auch direkt aus einer Rule heraus mit executeCommandLine() arbeiten. Weniger anspruchsvoll :) aber auch kein völliger Selbstläufer. Die Funktion ist aber analog zu exec, der Befehl wird über eine Variable in den Befehl eingebaut, der Rückgabewert wird einer anderen Variablen zugewiesen.

Code: Alles auswählen

val input = "\"befehl\""
val output = executeCommandLine(Duration.ofSeconds(5), "echo",input,"| telnet 192.168.178.200")
Ausprobiert habe ich das jetzt aber noch nicht, also nur graue Theorie :)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 237
Registriert: 8. Apr 2020 20:59
Answers: 0

Re: VRRoom -Telnet und Weboberfläche

Beitrag von filmgucker2 »

Danke! Das ist ein Einstieg!
Raspberry Pi 4, OH 4.0.3

filmgucker2
Beiträge: 237
Registriert: 8. Apr 2020 20:59
Answers: 0

Re: VRRoom -Telnet und Weboberfläche

Beitrag von filmgucker2 »

Die Verbindung kann ich mit dem exec binding herstellen, meinen Kampf gegen die exec whitelist habe ich schon vor Jahren
gewonnen ;-)...
Aber telnet schließt die Verbindung gleich wieder, lässt mich meinen Befehl nicht auswerten. Ich habe im Netz irgendwas mit "expect"
gesehen, aber das hat nicht geklappt. Gibt es da einen Trick?
Raspberry Pi 4, OH 4.0.3

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: VRRoom -Telnet und Weboberfläche

Beitrag von udo1toni »

filmgucker2 hat geschrieben: 24. Sep 2023 13:32 Aber telnet schließt die Verbindung gleich wieder, lässt mich meinen Befehl nicht auswerten.
Was meinst Du damit? telnet bekommt den Input über echo per Pipe, baut die Verbindung auf, leitet die eingegebene Zeichenfolge weiter, empfängt eine Antwort, speichert diese im Output und baut die Verbindung ab.

expect ist ein Programm, welches anhand eines Scripts auf eine erwartete (expected) Aufforderung eine definierte Antwort schickt. telnet baut die Verbindung auf, empfängt die Zeichenfolge login:, expect findet in seiner Datei die Zeichenfolge login: und die darauf zu sendende Antwort username und sendet nun username an die telnet Console.
Du kannst also in Grenzen eine bidirektionale Kommunikation automatisieren, wenn Du auf eine feststehende Liste von "Fragen" eine feststehende Liste von Antworten hast.
Wenn der Kommunikationskanal offen bleiben soll, wäre es vermutlich sinnvoller, einen Dienst dafür zu programmieren.
Man könnte z.B. ein Python Script schreiben, welches beim Start eine telnet Verbindung zum gewünschten Ziel aufbaut und zusätzlich ein paar mqtt Topics anlegt, über die die Kommunikation läuft. Dann kannst Du über mqtt topic 1 einen Befehl senden, den das Python Script an telnet weiterleitet, woraufhin telnet die Antwort empfängt und das Python Script leitet diese Antwort an mqtt Topic 2 weiter, welches Du in openHAB auswerten kannst.
Das wäre vermutlich sogar mit recht geringem Aufwand realisierbar :)

Oder Du findest jemanden, der ein telnet Binding programmiert... Ich könnte mir sogar vorstellen, dass es da reges Interesse gäbe, insbesondere, wenn es zusätzlich noch ssh unterstützen könnte...
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 237
Registriert: 8. Apr 2020 20:59
Answers: 0

Re: VRRoom -Telnet und Weboberfläche

Beitrag von filmgucker2 »

Also: Ich hab das Gefühl, ich bin kurz davor...
Python lernen, Binding programmieren. Wäre etwas aufwendig.
Ich hab das exec thing in der UI angelegt. Über eine rule kriegt der Eingabewert seinen string, der den
Platzhalter im Befehl ersetzt:
/usr/bin/echo %2$s | /usr/bin/telnet 192.168.188.176 2222

Auf der Konsole in openhab:

Code: Alles auswählen

telnet 192.168.188.176 2222
Trying 192.168.188.176...
Connected to 192.168.188.176.
Escape character is '^]'.
get status tx0
TX0: ff or not connected
Der log sagt:

Code: Alles auswählen

2023-09-25 16:31:44.447 [TRACE] [ng.exec.internal.handler.ExecHandler] - The command to be executed will be '[sh, -c, /usr/bin/echo get status tx0 | /usr/bin/telnet 192.168.188.176 2222]'
2023-09-25 16:31:44.459 [DEBUG] [ng.exec.internal.handler.ExecHandler] - Exec [OUTPUT]: 'Trying 192.168.188.176...'
2023-09-25 16:31:44.460 [DEBUG] [ng.exec.internal.handler.ExecHandler] - Exec [OUTPUT]: 'Connected to 192.168.188.176.'
2023-09-25 16:31:44.460 [DEBUG] [ng.exec.internal.handler.ExecHandler] - Exec [OUTPUT]: 'Escape character is '^]'.'
2023-09-25 16:31:44.462 [DEBUG] [ng.exec.internal.handler.ExecHandler] - Exec [ERROR]: 'Connection closed by foreign host.'
2023-09-25 16:31:44.464 [DEBUG] [ng.exec.internal.handler.ExecHandler] - Transformed response is 'Trying 192.168.188.176...
Connected to 192.168.188.176.
Escape character is '^]'.
Connection closed by foreign host.
Connection closed by foreign host.'
Die letzte Zeile aus der Konsole: "TX0: ff or not connected". Das ist der Wert, den ich fischen will. Da kommt er aber nicht hin,
weil vorher die Verbindung gekappt wird. Wenn mein thing mit dem Befehl in OH aktiviert ist, wird übrigens in der telnet Verbindung
der Status munter weiter ausgegeben...
Raspberry Pi 4, OH 4.0.3

Benutzeravatar
udo1toni
Beiträge: 15247
Registriert: 11. Apr 2018 18:05
Answers: 242
Wohnort: Darmstadt

Re: VRRoom -Telnet und Weboberfläche

Beitrag von udo1toni »

Ah, da fehlen Anführungszeichen...

Code: Alles auswählen

The command to be executed will be '[sh, -c, /usr/bin/echo get status tx0 | /usr/bin/telnet 192.168.188.176 2222]'
//                                                   hier ^              ^ und hier
evtl so:

Code: Alles auswählen

/usr/bin/echo \"%2$s\" | /usr/bin/telnet 192.168.188.176 2222
Ansonsten die Anführungszeichen mit in den Status packen.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

filmgucker2
Beiträge: 237
Registriert: 8. Apr 2020 20:59
Answers: 0

Re: VRRoom -Telnet und Weboberfläche

Beitrag von filmgucker2 »

klappt noch nicht mit:
/usr/bin/echo \"%2$s\" | /usr/bin/telnet 192.168.188.176 2222
/usr/bin/echo "%2$s" | /usr/bin/telnet 192.168.188.176 2222
/usr/bin/echo "%2$s"\r | /usr/bin/telnet 192.168.188.176 2222
/usr/bin/echo \"%2$s"\" | /usr/bin/telnet 192.168.188.176 2222
/usr/bin/echo "\"%2$s"\" | /usr/bin/telnet 192.168.188.176 2222
/usr/bin/echo \"%2$s"\ | /usr/bin/telnet 192.168.188.176 2222

Das \r sagen sie in den Dateien zu den ip Befehlen soll rein...

und auch nicht mit:/usr/bin/echo \"%2$s\" | /usr/bin/telnet 192.168.188.176 2222 #hab ich als Erstes ausprobiert
Raspberry Pi 4, OH 4.0.3

Antworten