[gelöst]Einstellungen um mit net::telnet Modul die Ausgabe des fhem commands ...

Begonnen von supernova1963, 05 Februar 2019, 07:05:37

Vorheriges Thema - Nächstes Thema

supernova1963

Nur so für mein Verständnis, benötige ich Unterstützung bei der Nutzung von dem perl Modul net::telnet.

Vorbereitungen, Tests:
1. ferner fhem Server ist im Terminal per telnet über den Port 7072 mit dem globalpassword erreichbar
Nachdem die Verbindung hergestellt ist, werden fhem commands korrekt ausgeführt. Das Ergebnis des fhem commands: list TYPE=DUMMY wird auf der console korrekt ausgegeben.
2. Auch aus dem perl Script kann ich die telnet Verbindung herstellen. Ein $telnet->print('define test dummy'); funktioniert ebenfalls

Aber:

Der perl Script Befehl @a = $telnet->cmd('list test') bricht mit Fehler im telnet Modul ab und der $b = $telent->print('List test') gibt ja nur 1 zurück.

Frage:
Was muss ich tun, um an die Ausgabe des fhem commands zu kommen?

Vielen Dank,

Gernot



CoolTux

Ich habe auch noch nicht viel mit telnet gemacht. Für mich würde es aber Sinn ergeben beim zweiten auch ein

$telnet->print('

Zu machen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

justme1968

hast du dir mal fhem2fhem und rfhem angeschaut? damit sollte das was du möchtest ohne zusätzliche perl module gehen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

CoolTux

Zitat von: justme1968 am 05 Februar 2019, 08:44:10
hast du dir mal fhem2fhem und rfhem angeschaut? damit sollte das was du möchtest ohne zusätzliche perl module gehen.

Ich denke mal ihm geht darum zu lernen und zu verstehen. Aber Du hast Recht, da kann man reinschauen wie es in der Tat geht. Gerade bei rfhem.


Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

justme1968

ok. dann wäre für das lernen und verstehen wichtig drauf hin zu weisen das ganze auf jeden fall ohne potentiell blockierendes perl telnet modul zu machen sondern selber
per socket und noch blockierend.

perl telnet ist die schlechteste variante von allen.
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

rudolfkoenig

Ich gehe davon aus, dass hier nicht um ein Modul, sondern um eine standalone Loesung handelt, was blockieren kann.

Da das FHEM-telnet Modul das telnet Protokoll nur marginal implementiert, empfehle ich eher aus fhem.pl den Abschnitt mit "# Client code" anzuschauen, kopieren und anzupassen. Es sei denn, man will net::telnet kennenlernen, dazu kann ich nichts sagen.

supernova1963

Vielen Dank CoolTux, JustMe1968 und rudolfkoenig,

ok, habe verstanden, dass das perl Modul net::telnet der falsche bzw. nicht geeignete Weg ist und mir fhem2fhem und rfhem angesehen.

rfhem und fhem.pl:

Verwendet scheinbar das perl Modul IO::Socket::INET (versuche ich mal)
...
my $socket = IO::Socket::INET->new('PeerAddr' => $HOSTNAME,'PeerPort' => $HOSTPORT,'Proto' => 'tcp') ;
    my $msg = $command."\n" ;
    #Log3 $name, 3, "$msg";
my @values =  RFHEM_GetNet($hash,$HOSTNAME);
if ( $values[1] eq "present") {
Log3 $name, 3, "Host present, executing command...";
syswrite($socket, $HOSTPW . "\n")if($hash->{PASSWORD});
print $socket $msg;
Log3 $name, 3, "Command executed."; }
else { Log3 $name, 3, "Error: host not present!"; }
...


Die Zeile, wo eine Ausgabe eines auf dem entfernten fhem System ausgeführten Befehls ausgewertet wird, habe ich nicht gefunden.

fhem2fhem:

adhoc finde ich nur die sub "FHEM2FHEM_SimpleRead( ..." die in etwa in die Richtung "Rückmeldung auf fhem command" gehen könnte. Da finde ich aber den zugehörigen fhem command nicht.

Da es sich um einen System dienst außerhalb von fhem handelt, wäre "blockieren des Dienstes" nicht ganz so tragisch, da er eh nur Werte liefern soll, wenn verfügbar. Damit der Dienst nicht hängt, fand ich die Möglichkeit bei net::telnet die "Timeout" und "Errmode" Parameter sehr hilfreich.

Auf "localhost" funktioniert das abfangen der Ausgabe eines fhem commands mit dem Systembefehl:
$a=`perl /opt/fhem/fhem.pl 7072 "list test" &`
Auf einem entfernten System (mit Aufruf des System telnet) müßte ich erst "fhem>" mit "exit" verlassen. Ob ich dann den Befehl wie auf localhost auf der Systemebene aufrufen kann habe ich noch nicht getestet

Nach wie vor bin dankbar für jeden Hinweis,

Gernot

betateilchen

Warum gehst Du nicht einfach den umgekehrten Weg? Lass doch FHEM auf der entfernten Instanz die Datei ins Dateisystem schreiben und hole die Datei von dort ab, mit welchen Mitteln auch immer Du das magst - ftp, scp oder wie auch immer.

define at_test at +*00:01 {FileWrite({FileName => '/tmp/myFile', ForceType=> "file"}, fhem("list test"))};;
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

Wernieman

Die Frage ist, ob Du dann wirklich perl brauchst. Anstatt mit perl /opt/fhem/fhem.pl 7072 "list test"
geht es auch direkt mit der Commandozeile:
echo -en "list test\nquit\n" | nc <fhem-server> 7072
- Bitte um Input für Output
- When there is a Shell, there is a Way
- Wann war Dein letztes Backup?

Wie man Fragen stellt: https://tty1.net/smart-questions_de.html

supernova1963

Danke betateilchen,

das hatte ich alternativ auch noch auf dem Schirm, habe ich aber als Umgehung aufgrund fehlenden Wissens gesehen.

Danke wernieman,

funktioniert mit (************ = globalpassword):
echo -en "************\nlist test\nquit\n" | nc 192.168.1.103 7072

Ich versuche aber noch  "IO::socket::INET->..." Tip von justme1968 und rudolfkoenig.

Danke, macht echt Freude mit dieser Unterstützung im Forum,

Gernot

supernova1963

Zitat von: supernova1963 am 05 Februar 2019, 17:13:24
Ich versuche aber noch  "IO::socket::INET->..." Tip von justme1968 und rudolfkoenig.

Hab's probiert, leider stehe ich auch hier vor dem Problem, wie komme ich an die Ausgabe des fhem commands?


my $client = IO::Socket::INET->new(PeerAddr => $host.':'.$port);
die "Can't connect to $host:$port\n" if (!$client);
syswrite($client,$globalpw."\n");
syswrite($client,"list test"."\n");

Der returnCode von syswrite ist 9 = Anzahl der übertragenen Zeichen.
Zum testen der Verbindung habe ich "syswrite($client,"define test2 dummy"."\n") verwendet und, es hat funktioniert. Die Verbindung steht genau so, wie bei der Verwendung des net::telnet Moduls. Der print bzw. syswrite Befehl kommt an. Hier gab's die Funktion "cmd", die die Ausgabe zurück geben soll. Die finde ich jedoch bei IO::Socket::INET nicht.

Da komme ich zur Zeit nicht weiter und bin gespannt auf die Lösung.

betateilchen

Entschuldige die blöde Frage (ich habe mich mit der Thematik noch nie praktisch beschäftigt):

Müsstest Du nicht mit sysread() die Antwort abholen, wenn Du nach syswrite() mit einer verwertbaren Rückmeldung rechnest?
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

supernova1963

Hallo betateilchen,

Meinst du das so:

sysread($client,syswrite($client,"list test"."\n"));


Danke,

Gernot

CoolTux

Du musst dafur sorgen daß innerhalb einer Schleife alle x Sekunden ein sysread schaut ob Daten Anliegen und diese dann abholen.

Zum Spielen machst Du es ohne Schleife.

Also zuerst ein write schreiben und danach ein read.


my $leng;
syswrite($client,"list test"."\r\n");
sysread($client);
$leng = sysread($client,$buf,1024);

In $buf stehen Deine Daten in $leng die Länge der erhaltenen Daten.

Denke mal so sollte was kommen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

betateilchen

Zitat von: supernova1963 am 05 Februar 2019, 20:58:32
Hallo betateilchen,

Meinst du das so:

ich meine, Du solltest mal ein paar perl-Dokumentationen zum Thema lesen. Mit FHEM selbst hat Dein Vorhaben grundsätzlich nicht so sehr viel zu tun.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!