Autor Thema: [gelöst]Einstellungen um mit net::telnet Modul die Ausgabe des fhem commands ...  (Gelesen 619 mal)

Offline supernova1963

  • Full Member
  • ***
  • Beiträge: 365
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


« Letzte Änderung: 08 Februar 2019, 06:40:13 von supernova1963 »
Fhemserver: Mac Mini - Parallels Desktop mit Ubuntu Server 18.04,
Module: Harmony, fakeRoku, FBAHA, Fritzbox, MQTT + espBridge + TASMOTA_DEVICE, HMCCU, Nmap, ...

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19535
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.me/MOldenburg
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19053
hast du dir mal fhem2fhem und rfhem angeschaut? damit sollte das was du möchtest ohne zusätzliche perl module gehen.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19535
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.me/MOldenburg
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline justme1968

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19053
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.
FHEM5.4,DS1512+,2xCULv3,DS9490R,HMLAN,2xRasPi
CUL_HM:HM-LC-Bl1PBU-FM,HM-LC-Sw1PBU-FM,HM-SEC-MDIR,HM-SEC-RHS
HUEBridge,HUEDevice:LCT001,LLC001,LLC006,LWL001
OWDevice:DS1420,DS18B20,DS2406,DS2423
FS20:fs20as4,fs20bs,fs20di
AKCP:THS01,WS15
CUL_WS:S300TH
Gefällt mir Gefällt mir x 1 Liste anzeigen

Offline rudolfkoenig

  • Administrator
  • Hero Member
  • *****
  • Beiträge: 20331
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.

Offline supernova1963

  • Full Member
  • ***
  • Beiträge: 365
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
Fhemserver: Mac Mini - Parallels Desktop mit Ubuntu Server 18.04,
Module: Harmony, fakeRoku, FBAHA, Fritzbox, MQTT + espBridge + TASMOTA_DEVICE, HMCCU, Nmap, ...

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15848
  • s/fhem\.cfg/configDB/g
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"))};;
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Nächster Hamburg-Stammtisch: 14.06.2019

Offline Wernieman

  • Hero Member
  • *****
  • Beiträge: 5272
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

Offline supernova1963

  • Full Member
  • ***
  • Beiträge: 365
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
Fhemserver: Mac Mini - Parallels Desktop mit Ubuntu Server 18.04,
Module: Harmony, fakeRoku, FBAHA, Fritzbox, MQTT + espBridge + TASMOTA_DEVICE, HMCCU, Nmap, ...

Offline supernova1963

  • Full Member
  • ***
  • Beiträge: 365
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.
Fhemserver: Mac Mini - Parallels Desktop mit Ubuntu Server 18.04,
Module: Harmony, fakeRoku, FBAHA, Fritzbox, MQTT + espBridge + TASMOTA_DEVICE, HMCCU, Nmap, ...

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15848
  • s/fhem\.cfg/configDB/g
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?
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Nächster Hamburg-Stammtisch: 14.06.2019

Offline supernova1963

  • Full Member
  • ***
  • Beiträge: 365
Hallo betateilchen,

Meinst du das so:
sysread($client,syswrite($client,"list test"."\n"));

Danke,

Gernot
Fhemserver: Mac Mini - Parallels Desktop mit Ubuntu Server 18.04,
Module: Harmony, fakeRoku, FBAHA, Fritzbox, MQTT + espBridge + TASMOTA_DEVICE, HMCCU, Nmap, ...

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 19535
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.
« Letzte Änderung: 05 Februar 2019, 21:53:16 von CoolTux »
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.me/MOldenburg
FHEM GitHub: https://github.com/fhem/
kein Support für cfg Editierer

Offline betateilchen

  • Developer
  • Hero Member
  • ****
  • Beiträge: 15848
  • s/fhem\.cfg/configDB/g
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.
-----------------------
Unaufgeforderte Anfragen per email werden von mir nicht beantwortet. Dafür ist das Forum da.
-----------------------
Nächster Hamburg-Stammtisch: 14.06.2019

 

decade-submarginal