[gelöst] Fhem Befehle aus Perl Script heraus

Begonnen von Kharim, 25 März 2018, 14:29:14

Vorheriges Thema - Nächstes Thema

Kharim

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.)
Raspberry Pi 2 + Minibian + 2x MAX Cube CUN (868/433Mhz) + Thermostate + Fensterkontakte + Taster+RGB-LED Band über pigpiod + TFA Sensoren 30.3169/3125
Raspberry Pi 2 + Minibian +Z-Wave (USB) + Bewegungsmelder + Fensterkontakt + Sirene + SMS Steuer-/Benachrichtigung (ohne Internet)

Otto123

Hi Kharim,

aus Perl heraus verwendet man einfach die Funktion fhem()
Siehe Doku.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

CoolTux

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.
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

Otto123

#3
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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Kharim

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.
Raspberry Pi 2 + Minibian + 2x MAX Cube CUN (868/433Mhz) + Thermostate + Fensterkontakte + Taster+RGB-LED Band über pigpiod + TFA Sensoren 30.3169/3125
Raspberry Pi 2 + Minibian +Z-Wave (USB) + Bewegungsmelder + Fensterkontakt + Sirene + SMS Steuer-/Benachrichtigung (ohne Internet)

CoolTux

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;
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