Guten Abend,
ich habe verschiedene Schalter mit denen ich mein Garagentor ansteuere. An der Torsteuereung habe ich parallel eine Relais zum Taster angeschlossen.
Das ansteuern des Relais habe ich in ein Unterprogramm der 99_myUtils gelegt.
Durch Tests habe ich festgestellt, dass das Unterprogramm nicht angesprochen wird und somit die eingestellten Funktionen nicht aufgerufen werden.
Was muss ich einstellen, damit das Unterprogramm eine Rückmeldung an das Hauptprogramm gibt und ich entsprechend reagieren kann?
Danke
Eine Rückmeldung gibt eine Funktion mit dem Perl Befehl "return"
https://perldoc.perl.org/functions/return.html
Du kannst auch ein Reading mit fhem("setreading device reading wert");
setzen.
Mehr können wir anhand der fehlenden Informationen nicht sagen.
Hi,
zwischen wird nicht immer ausgeführt und nicht angesprochen wird liegt irgendwie noch ein Unterschied?
Wenn Du den Code aus Deiner myUtils posten würdest könnte man mitdenken. So fehlen quasi alle Infos.
Die Sub in deiner myUtils ist Perlcode, klar kannst Du dort einen ReturnWert zurückgeben und den abfragen.
Also etwa so Deine sub:
sub Test1 {return "Willi"}
sub Test2 {fhem("setreading Dummy Test2 gelaufen")}
Kannst Du so abfragen:
{if (Test1 eq "Willi"){"Melde Erfolg"} }
Bei Test2 siehst Du das gesetzte Reading im Dummy Test2.
Allerdings klingt Dein Fehler eher danach, dass die Sub nicht aufgerufen wird, der Fehler also höher liegt? Dann kannst Du in deinem FHEM Code auch parallel zum Aufruf Kontrollen einfügen.
Gruß Otto
Nur weil du eine Funktion/Sub in der myUtils hast wird diese nicht automatisch "benutzt"...
Es bedeutet nur, dass du sie nutzen kannst...
D.h. irgenein "Mechanismus" muss die Funktion nutzen.
Z.B. kannst du sie mit einem notify nutzen und so auf Events reagieren...
Oder mit einem at nutzen und somit z.B. zyklisch aufrufen...
Schreib doch mal was du tun willst, was die Sub tut/tun soll und wann/wodurch sie aufgerufen werden soll...
EDIT: oder schon aufgerufen wird...
Gruß, Joachim
Da haben sich ja wieder drei zeitlich getroffen ;D ;D ;D
Hallo,
danke für die schnellen Antworten.
Ich rufe aus einem notify folgendes auf:
Tor_fahren_Schalter("Tor_2", "RFID");
In diesem Fall steht Tor_2 für Garagentor2 und RFID das der RFID Kartenleser benutzt wurde. Ich habe mehrere Funkschalter zu Torsteuerung im Haus verteilt. Bei den Schaltern ist im Aufruf Schalter angegeben.
Die Routine in 99_myUtils sieht wie folgt aus:
sub Tor_fahren_Schalter($$) {
my ($tor, $betaetigt) = @_;
my $sw_tor = "SW_"."$tor";
my $tor_wait = "SW_"."$tor"."_wait";
my $zustand_tor = ReadingsVal("$tor","state",0);
my $zustand_tor_old = ReadingsVal("$tor","zustand_old",0);
my $alias_tor = AttrVal("$tor","alias",0);
my $status = "";
if (ReadingsVal("Familie","state",0) eq "home") {
Log 1, ("1");
if ($zustand_tor eq "Closed") {
Log 1, ("2");
$zustand_tor = "geöffnet";
$status = "done";
fhem ("set $tor open");
fhem ("setreading $tor zustand_old open")
}
elsif (($zustand_tor eq "Open") or $zustand_tor_old eq "stopped"){
Log 1, ("3");
$zustand_tor = "geschlossen";
fhem ("set $tor close");
$status = "done";
fhem ("setreading $tor zustand_old close")
}
elsif ($zustand_tor eq "DrivingUp" or $zustand_tor eq "DrivingDown"){
Log 1, ("4");
$zustand_tor = "gestoppt";
fhem ("set $tor stop");
$status = "done";
fhem ("setreading $tor zustand_old stopped")
}
elsif ($status ne "done"){
fhem ("set $sw_tor on-for-timer 2");
fhem ("set TeleBot message Tor done");
}
if ($betaetigt eq "Schalter") {
my $text = "Tor ";
my $tmp = " wurde durch Schalter ";
my $boddytext = "$text"."$alias_tor"."$tmp"."$zustand_tor";
fhem ("set TeleBot message $boddytext");
};
if ($betaetigt eq "RFID") {
my $rfid = " Kartenleser ";
fhem ("set TeleBot message $rfid");
};
};
}
Da im Log kein entsprechender Eintrag vorhanden und auch die Telegram Nachricht nicht angekommen ist, wurde aus meiner Sicht die Routine nicht ausgeführt.
Warum???
Sehr oft funktioniert alles wie gewünscht - leider nicht zuverlässig.
Das das notify ausgeführt wurde erkenne ich, da die Nachricht
{fhem("set TeleBot message Tor Garage 2 wurde durch $token betätigt.")};
gesendet wurde.
Danke für Eure Hilfe.
Zitat von: Beetle2003 am 20 September 2020, 00:17:53
Da im Log kein entsprechender Eintrag vorhanden und auch die Telegram Nachricht nicht angekommen ist, wurde aus meiner Sicht die Routine nicht ausgeführt.
Warum???
So, wie Deine Log-Einträge generiert werden, kannst Du das Ausführen der Routine nicht vollständig überprüfen.
Dein Code ist von einer zentralen if-Anweisung abhängig.
Nur wenn
if (ReadingsVal("Familie","state",0) eq "home") {
wahr ist, werden alle anderen Anweisungen ausgeführt.
Ich tippe mal darauf, dass in den Fällen wo es nicht funktioniert hat, der Status von "Familie" ungleich "home" war.
Bau doch mal vor der if-Abfrage einen zusätzlichen Log-Eintrag ein, am besten mit dem Status von "Familie". Dann kannst Du sehen ob:
a) die Routine angesprochen wurde
b) der entscheidende Status von "Familie" stimmt.
Moin,
Was in dem notify alles passiert ist ja nun auch nicht klar. Wenn da noch ne Bedingung ist?
Hier ein paar Tipps was und wie man posten sollte :)
https://forum.fhem.de/index.php/topic,71806.0.html
Gruß Otto