Seite 4 von 4

Re: VRRoom -Telnet und Weboberfläche

Verfasst: 30. Sep 2023 21:37
von filmgucker2
Log sagt:

Code: Alles auswählen

 Exec [OUTPUT]: 'Trying 192.168.188.176...'
2023-09-30 21:36:42.422 [DEBUG] [ng.exec.internal.handler.ExecHandler] - Exec [OUTPUT]: 'Connected to 192.168.188.176.'
2023-09-30 21:36:42.422 [DEBUG] [ng.exec.internal.handler.ExecHandler] - Exec [OUTPUT]: 'Escape character is '^]'.'
2023-09-30 21:36:42.423 [DEBUG] [ng.exec.internal.handler.ExecHandler] - Exec [OUTPUT]: 'TX0: 4K60 594MHz RGB 8b  '
2023-09-30 21:36:43.420 [DEBUG] [ng.exec.internal.handler.ExecHandler] - Exec [ERROR]: 'Connection closed by foreign host.'
2023-09-30 21:36:43.421 [DEBUG] [ng.exec.internal.handler.ExecHandler] - Transformed response is 'null'
Nur auf die 3. Zeile bin ich scharf :D

Re: VRRoom -Telnet und Weboberfläche

Verfasst: 30. Sep 2023 21:46
von udo1toni
Ja, das Log ist da leider nur bedingt hilfreich, weil es nicht den vollständigen Output liefert (so wie weiter oben).

Ich habe das gerde hier mal in einer Rule ausprobiert, da muss ich tatsächlich den \ doppelt angeben, also so:

Code: Alles auswählen

REGEX(.*character is ..\\].\\. (.*) Connection.* Connection.*)
Im Transform Feld des Channels, passend zum Beispieltext von weiter oben (wo das Connection closed doppelt drin steht)
Alternativ (entweder oder, KEINESFALLS an beiden Stellen gleichzeitig) im Link zwischen Channel und Item

Code: Alles auswählen

.*character is ..\\].\\. (.*) Connection.* Connection.*

Re: VRRoom -Telnet und Weboberfläche

Verfasst: 30. Sep 2023 22:43
von filmgucker2
Immer noch nicht ...
Auf meinem 1. Bild "Thing" in das Feld Transformation eingetragen: REGEX(.*character is ..\\].\\. (.*) Connection.* Connection.*)
Im Channel/Item: Radiobutton Profile Standard. Log sagt: Transform response is null.

Umgekehrt: Feld Transformation mit REGEX((.*))
Channel/Item: REGEX Radiobutton + Feld regulärer Ausdruck: .*character is ..\\].\\. (.*) Connection.* Connection.*
Das Item zeigt nichts. Radiobutton Standard zeigt den ganzen unveränderten string.

Du sprachst von einer rule: Kann ich in der nicht den empfangenen ganzen string mit REGEX umwandeln, wenn das Item updated?

Re: VRRoom -Telnet und Weboberfläche

Verfasst: 30. Sep 2023 22:44
von filmgucker2
Aber ich weiß natürlich nicht, wie die rule aussehen muss ...

...wenn ich so überlege, klingt das aber vielleicht etwas unelegant. Vielleicht liegt es am Verbindungs-
abbruch und REGEX hat nicht genug Zeit um zu arbeiten? Oder bei den Engländern fragen?

Re: VRRoom -Telnet und Weboberfläche

Verfasst: 30. Sep 2023 23:26
von filmgucker2
Bei REGEX Radiobutton zeigt er jetzt doch den ganzen string, sagt aber dass er nicht transformieren kann, da steht noch '%s'

...ich sehe gerade: hatte vor das erste Connection einen \ gemacht. Ohne den ist wieder nichts

Re: VRRoom -Telnet und Weboberfläche

Verfasst: 1. Okt 2023 02:59
von filmgucker2
...die lange REGEX Nacht.
Mit
.*TX0:(.*)Connection.*Connection closed by foreign host.*

und dem Radiobutton REGEX gehts. Aber noch eine Frage: Das liefert mir den Status, Und wenn ich der VRRoom Befehle
geben möchte? Über telnet geht das: etwa: set reboot.

Re: VRRoom -Telnet und Weboberfläche

Verfasst: 1. Okt 2023 07:18
von udo1toni
Na, die Befehle musst Du entsprechend an den Input Channel senden.
Wenn Du auf das TX0: verzichten kannst (oder besser: Wenn das auch statischer Anteil der Antwort ist...) ist der Filter natürlich genauso gut. Und falls z.B. die Zeichenfolge Con niemals im "interessanten" Teil der Antwort vorkommt (das ist der eigentliche Punkt...) sollte dann auch

Code: Alles auswählen

.*TX0:(.*) Con.*Con.*
ausreichen.

Transformation in Rules:
Es gibt in der DSL (Domain Specific Language) eine Core (integraler Bestandteil von openHAB) Action namens transform(<String>,<String>,<String>)
Dabei enthält
  • der erste String die zu verwendende Transformation, also z.B. "REGEX" (mit Anführungszeichen...)
  • der zweite String die eigentliche Transformation, also z.B. die reguläre Expression ".*TX0:(.*) Con.*Con.*" (und wenn dort ein Backslash verwendet wird, so dient dieser erst mal als Escape Zeichen für den String - könnte ja sein, dass ein " im String vorkommt, da müsste man dann \" schreiben. Entsprechend muss man dort für ein \ ein \\ schreiben)
  • der dritte String den zu transformierenden Wert, also gewöhnlich eine Variable oder den Status eines Items (als String)
Da ich den angelieferten String irgendwie durch REGEX schleusen muss, habe ich das per Rule gelöst, das ist aber nicht die erste Option, auch wenn Du in der Folge ohnehin mit einer Rule arbeiten musst - "TX0: 4K60 594MHz RGB 8b " wird ja vermutlich nicht das sein, was Du sehen möchtest. Ich versuche bei solchen Aufgaben immer, statischen Ballast (also hier Verbindungsaufbau und Verbindungsabbau) so früh wie möglich loszuwerden, also bestenfalls noch im Channel.

Im Anschluss kannst Du in einer Rule den String recht einfach mit der Methode split() aufteilen (hier als DSL Code):

Code: Alles auswählen

rule "VRRoom Status setzen"
when
    Item VRRoomOutput changed
then
    val vr = newState.toString.split(" ") // newState entspricht VRRoomOutput.state
    if(vr.size < 4) {
        logWarn("vrroom","unerwartete Antwort: {}",newState)
        return;
    }
    val res  = vr.get(0)
    val freq = vr.get(1)
    val col  = vr.get(2)
    val mode = vr.get(3)
    VRResolution.postUpdate(res)
    VRFrequency.postUpdate(freq)
    VRColourMode.postUpdate(col)
    VRMode.postUpdate(mode)
end
Natürlich kannst Du innerhalb der Rule die Daten beliebig weiter analysieren, also z.B. die Zeichenkette MHz von der Frequenz abtrennen und den Zahlenwert als Zahl in einem Number Item speichern, gerne auch Number:Frequency mit der Einheit MHz, das eröffnet dann in der UI eventuell mehr Möglichkeiten für die Darstellung der verschiedenen Werte.

Die Anzahl der möglichen Befehle ist ja einigermaßen erschlagend :) entsprechend wirst Du auch zum Senden der Befehle vermutlich über eine (weitere) Rule gehen wollen, die den zu sendenden String zusammensetzt.

Re: VRRoom -Telnet und Weboberfläche

Verfasst: 1. Okt 2023 22:06
von filmgucker2
Ein wie üblich wunderbarer Tipp! Danke! Aber noch einmal zurück zum Ausführen Befehl:
Den könnte ich doch auch über eine ExecuteCommandline machen. Wie müsste die denn aussehen?
Irgendwas mit usr/bin/bash telnet .... usw?

Re: VRRoom -Telnet und Weboberfläche

Verfasst: 1. Okt 2023 22:49
von udo1toni
Ja, natürlich kannst Du das auch ohne das exec Binding direkt in einer Rule machen, dann musst Du die Kommandozeile halt dort als executeCommandLine() Action absetzen. Das ist übrigens sehr ausführlich in der Original Doku erläutert...

Re: VRRoom -Telnet und Weboberfläche

Verfasst: 1. Okt 2023 22:59
von filmgucker2
Ich schau mal. Deine ausführlichen Erklärungen verführen halt dazu, immer weiter zu fragen und nicht in die Doku zu sehen...