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.)
Hi Kharim,
aus Perl heraus verwendet man einfach die Funktion fhem()
Siehe Doku (https://fhem.de/commandref_DE.html#command).
Gruß Otto
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.
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
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.
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;