FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Kharim am 25 März 2018, 14:29:14

Titel: [gelöst] Fhem Befehle aus Perl Script heraus
Beitrag von: Kharim am 25 März 2018, 14:29:14
Hallo Zusammen,

wie realisier ich Fhem Befehle aus einem (auf dem System laufenden) Perl Script heraus?

Ich habe auf meinem Raspi einige Perl Scripte, welche direkt auf dem System (also außerhalb von Fhem) laufen.
Aus diesen heraus möchte ich nun (zb.) list/set/define Befehle an Fhem senden.
Dabei möchte ich bei list auch die Rückgabe auf eine Variable schreiben, um diese auszuwerten.
(system() ist also keine Lösung, da dies wohl nur True/False zurück gibt - aber nicht den eigentlichen Inhalt.)

Der klassische Weg für die Shell, soweit ok.

#!/bin/sh
test=$(/opt/fhem/fhem.pl 7072 "list #device#");
echo $test;


Wie setzte ich das nun aber in einem Perl-Script um?

Danke,
Kharim

-------
bisherige Idee/Versuch:
#!/usr/bin/perl

use strict;
use warnings;
use lib '.';

sub getfhem{

my ($device) =@_;
local @ARGV = (7072, "list $device");
my $ergebnis;
open my $fh, ">>", \$ergebnis;
select $fh;
do '/opt/fhem/fhem.pl';
#print "No device";
select STDOUT;
#print $ergebnis;
if(substr($ergebnis, 0, 2) eq "No")
        {
        0;
        }
        else
        {
        1;
        }

}
1;

Dabei erfolgt der Aufruf aus einem weiteren Script mittels getfhem(#device#).
Aber egal wie ich es drehe und wende, es scheint als stoppe die gesamte Verarbeitung nach einem "do fhem.pl".
Der gesamte nachfolgende Code wird nur ausgeführt, wenn ich die do Zeile auskommentiere.
Die Umleitung des STDOUT ist eine "Notlösung" Es scheint, als gebe die fhem.pl zwangsweise das Ergebnis aus.
(Ohne die Umleitung erfolgt eine "korrekte" Ausführung des Fhem Befehls, nur bekomm ich die Rückgabe nicht in eine Variable gespeichert.)
Titel: Antw:Fhem Befehle aus Perl Script heraus
Beitrag von: Otto123 am 25 März 2018, 14:57:18
Hi Kharim,

aus Perl heraus verwendet man einfach die Funktion fhem()
Siehe Doku (https://fhem.de/commandref_DE.html#command).

Gruß Otto
Titel: Antw:Fhem Befehle aus Perl Script heraus
Beitrag von: CoolTux am 25 März 2018, 15:01:34
Du Otto das geht nur über eine aus FHEM geladene Sub.

Ich würde hier auch den Shellaufruf wählen oder über telnet 7072 gehen.
Titel: Antw:Fhem Befehle aus Perl Script heraus
Beitrag von: Otto123 am 25 März 2018, 15:05:54
ach Mist sorry, hab ich nicht alles gelesen  :-[

Dann aber mit qx der liefert doch die Ausgaben wie gewünscht zurück.

Ich hatte die unterschiedlichen Aufrufe mal getestet und für mich zusammengeschrieben, allerdings aus fhem heraus.
Aber vielleicht hilft das -> https://heinz-otto.blogspot.de/2018/02/in-fhem-externe-programme-aufrufen.html

Gruß Otto
Titel: Antw:Fhem Befehle aus Perl Script heraus
Beitrag von: Kharim am 25 März 2018, 15:33:09
Zitat von: Otto123 am 25 März 2018, 15:05:54
Dann aber mit qx der liefert doch die Ausgaben wie gewünscht zurück.


Die Welt kann so einfach sein.....
Super Tipp! Funktioniert :-)

Beispiel:

test.sh (Aufruf)
#!/usr/bin/perl

use strict;
use warnings;
use lib '.';
require('getfhem.sh');

my $device = $ARGV[0];
my $test = getfhem($device);
print $test;


getfhem.sh
#!/usr/bin/perl

use strict;
use warnings;
use lib '.';

sub getfhem{

my ($device) =@_;
my $ergebnis = qx(/opt/fhem/fhem.pl 7072 "list $device");
if(substr($ergebnis, 0, 2) eq "No")
        {
        0;
        }
        else
        {
        1;
        }

}
1;


Ein Aufruf "test.sh #device#" gibt 1 zurück wenn das Device vorhanden, 0 wenn nicht.
Titel: Antw:Fhem Befehle aus Perl Script heraus
Beitrag von: CoolTux am 25 März 2018, 15:34:31
Hier Mal ein telnet Beispiel.


use IO::Socket::INET;

my $HOSTNAME = "127.0.0.1";
my $HOSTPORT = "7072";
my $socket = IO::Socket::INET->new('PeerAddr' => $HOSTNAME,'PeerPort' => $HOSTPORT,'Proto' => 'tcp') ;

print $socket "setreading dummyTest ok\n";

$socket->close;