Rückgabe von (Linux)-Funktion in FHEM

Begonnen von tklein, 12 Mai 2017, 15:03:16

Vorheriges Thema - Nächstes Thema

tklein

Hallo zusammen,

wie kann ich es sicherstellen, dass Linuxprogramme (codesend etc.) korrekt ausgeführt werden?


sub test() {

my $ergebnis = "";
$ergebnis = {system("/home/pi/433Utils/RPi_utils/codesend 15883553")};
Log 1, "Hier der Logtext von Test mit Ergebnis: $ergebnis"; return  $ergebnis;
}


Hier bekomme ich als Ergebnis z.B.:
2017.05.12 13:24:28 1 : Hier der Logtext von Test mit Ergebnis: HASH(0x5f997f0) angezeigt.

Beim notify rufe ich codesend direkt auf:

defmod off_StripeSchlafzimmer notify StripeSchlafzimmer:off {\
if ((Value("status_StripeSchlafzimmer") eq "on")){\
fhem ("set status_StripeSchlafzimmer off");;\
} \
else {\
fhem ("set status_StripeSchlafzimmer on");;\
}\
system(" /home/pi/433Utils/RPi_utils/codesend 15883553 &")\
}


Allerdings bekomme ich nicht einheitliche Logausgaben bei ähnlichen Devices:

1) 2017.05.01 00:16:42 3: off_StripeSchlafzimmer return value: -1
2) off_StripeBadezimmer return value: sending code[9680721]
3) 2017.05.11 07:53:37 3: off_StripeBadezimmer return value: -1
sending code[9680721]

Wie könnte ich den Befehl codesend solange ausführen, bis er erfolgreich vom Linuxsystem ausgeführt wurde bzw eine Rückmeldung erhalten?

Bei den Stripes handelt es sich nicht um IT-Geräte sondern um dummy Devices:

Internals:
   NAME       StripeSchlafzimmer
   NR         145
   STATE      off
   TYPE       dummy
   Readings:
     2017-05-12 14:44:48   state           off
Attributes:
   alexaName  Schlafzimmerled
   alexaRoom  Schlafzimmer
   genericDeviceType light
   group      Stripes
   icon       light_led_stripe
   room       Homekit,Schlafzimmer,Stripes,alexa
   setList    toggle up down on off
   webCmd     toggle:up:down:on:off



Grüße
Thomas

FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

CoolTux

Zitat von: tklein am 12 Mai 2017, 15:03:16
$ergebnis = {system("/home/pi/433Utils/RPi_utils/codesend 15883553")};



$ergebnis = qx( /home/pi/433Utils/RPi_utils/codesend 15883553 );
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

tklein

thx, jetzt bekomme ich zumindest
sending code[15883553] zurück.

Was würde denn drin stehen, wenn der Befehl nicht korrekt abgearbeitet werden könnte?
FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

CoolTux

Zitat von: tklein am 12 Mai 2017, 15:48:23
thx, jetzt bekomme ich zumindest
sending code[15883553] zurück.

Was würde denn drin stehen, wenn der Befehl nicht korrekt abgearbeitet werden könnte?

Das was das jeweilige Programm als Rückgabewert bereit hält bei einem Fehler.
Probiere es doch aus.
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

tklein

wie kann ich denn einen Fehler "produzieren"/hervorrufen? Eine Schleife von 100 Codesendaufrufen? Oder Stecker am Sendebauteil ziehen? Kann ich auf Terminalebene ein Programm blocken? SPrich, das es dann aus FHEM nicht aufrufbar wäre?


Grüße
Thomas
FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

CoolTux

Falschen Code mitgeben der nicht unterstützt wird? Keine Ahnung kenne das nicht was du da machst.
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

amenomade

Zitat von: CoolTux am 12 Mai 2017, 17:04:03
Keine Ahnung kenne das nicht was du da machst.

Wahrscheinlich das: https://github.com/ninjablocks/433Utils/blob/master/RPi_utils/codesend.cpp

(mit einem schönen "return 0;" am Ende  ;) )

Gruß
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Manul

Ein Fehler bei der Ausführung eines Linuxbefehls sollte eigentlich nicht (nur) durch eine Ausgabe, sondern (vor allem) durch den Rückgabewert überprüft werden. Zum Testen: Der Befehl "false" ("do nothing, unsuccessfully") gibt einen Fehlercode zurück.

MadMax-FHEM

#8
Zitat von: amenomade am 12 Mai 2017, 17:18:21
Wahrscheinlich das: https://github.com/ninjablocks/433Utils/blob/master/RPi_utils/codesend.cpp

(mit einem schönen "return 0;" am Ende  ;) )

Gruß

Dann einfach "nix" übergeben, dann sollte -1 und die "Bedienungsanleitung" kommen ;)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

tklein

ohne Parameter bekomme ich jetzt:

2017.05.12 18:15:35 1 : Hier der Logtext von Test mit Ergebnis: Usage: /home/pi/433Utils/RPi_utils/codesend decimalcode [protocol] [pulselength] decimalcode - As decoded by RFSniffer protocol - According to rc-switch definitions pulselength - pulselength in microseconds

zurück.

Dann werde ich in einer Schleife codesend xyz so lange aufrufen, bis das Ergebnis == sending code[xyz] ist. --> Irgendwie unschön

Grüße & Danke
Thomas
FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

CoolTux

Schlechte Idee. Schleifen im Blocking Modus ist kein guter Plan. Fhem blockiert solange die Schleife läuft
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

amenomade

Alternativ: du machst ein bisschen C++ und änderst den Code von sendcode damit es einen vernünftigen Rückgabewert liefert.

Gruß
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Manul

Oder Du fragst den Rückgabewert in $? ab.

tklein

@Manul

aus was soll ich denn abfragen? Ab wann hat es geklappt? Daher ja meine unglücklicher Variante mit dem Vergleich

Ich sende codesend xyz und wenn das return dem gleich ist, ist alles okay
FHEM auf Pi 3, Echo (Plus, Dot und Connect), CUL868/433, HM Komponenten, Broadlink, Enigma (VU DUO2), Alexa/Homebridge, Sonoffs (POW, RF, Basic), Wemos D1 (IR, DHT, BH1750, OLED, BMP180), IT/Steckdosen, Fritzbox mit SIP, Wifilight, MQTT, Pilight, Xiaomi Flower Sensor, Spotify, Dooya, Shelly, Conbee2

Manul

Zitat von: tklein am 12 Mai 2017, 19:50:52
Ab wann hat es geklappt?

Wenn der returncode in $? == 0 (Null) ist.