FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Beetle2003 am 19 September 2020, 22:54:06

Titel: in 99_myUtils.pm ausgelagerter Programmcode wird nicht immer ausgeführt
Beitrag von: Beetle2003 am 19 September 2020, 22:54:06
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
Titel: Antw:in 99_myUtils.pm ausgelagerter Programmcode wird nicht immer ausgeführt
Beitrag von: amenomade am 19 September 2020, 23:24:07
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.
Titel: Antw:in 99_myUtils.pm ausgelagerter Programmcode wird nicht immer ausgeführt
Beitrag von: Otto123 am 19 September 2020, 23:25:48
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
Titel: Antw:in 99_myUtils.pm ausgelagerter Programmcode wird nicht immer ausgeführt
Beitrag von: MadMax-FHEM am 19 September 2020, 23:26:37
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
Titel: Antw:in 99_myUtils.pm ausgelagerter Programmcode wird nicht immer ausgeführt
Beitrag von: Otto123 am 19 September 2020, 23:27:35
Da haben sich ja wieder drei zeitlich getroffen  ;D ;D ;D
Titel: Antw:in 99_myUtils.pm ausgelagerter Programmcode wird nicht immer ausgeführt
Beitrag von: Beetle2003 am 20 September 2020, 00:17:53
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.
Titel: Antw:in 99_myUtils.pm ausgelagerter Programmcode wird nicht immer ausgeführt
Beitrag von: Nobbynews am 20 September 2020, 06:02:57
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.
Titel: Antw:in 99_myUtils.pm ausgelagerter Programmcode wird nicht immer ausgeführt
Beitrag von: Otto123 am 20 September 2020, 09:07:35
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