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
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 );
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?
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.
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
Falschen Code mitgeben der nicht unterstützt wird? Keine Ahnung kenne das nicht was du da machst.
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ß
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.
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
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
Schlechte Idee. Schleifen im Blocking Modus ist kein guter Plan. Fhem blockiert solange die Schleife läuft
Alternativ: du machst ein bisschen C++ und änderst den Code von sendcode damit es einen vernünftigen Rückgabewert liefert.
Gruß
Oder Du fragst den Rückgabewert in $? ab.
@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
Zitat von: tklein am 12 Mai 2017, 19:50:52
Ab wann hat es geklappt?
Wenn der returncode in $? == 0 (Null) ist.
nee, ich hatte ja beim erfolgreichen senden: "sending code[15883553]" in der Variable drin gehabt.
In $ergebnis, ja, aber nicht in $?.
Zitat von: tklein am 12 Mai 2017, 20:35:15
nee, ich hatte ja beim erfolgreichen senden: "sending code[15883553]" in der Variable drin gehabt.
https://books.google.de/books?id=XhGuAgAAQBAJ&pg=PA296&lpg=PA296&dq=$?+perl&source=bl&ots=_250EENqyL&sig=3Ov44PY5YFiveVrBBFJ5bh3_lPI&hl=de&sa=X&ved=0ahUKEwiYuqfTjuzTAhULJMAKHbwAA6oQ6AEIIzAC#v=onepage&q=%24%3F%20perl&f=false
Gleich oben der erste Satz
$? liefert jetzt bei mir immer -1 obwohl der Befehl erfolgreich gesendet wurde.
EDIT: Da müsste doch "0" drinstehen, oder?