in 99_myUtils.pm ausgelagerter Programmcode wird nicht immer ausgeführt

Begonnen von Beetle2003, 19 September 2020, 22:54:06

Vorheriges Thema - Nächstes Thema

Beetle2003

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

amenomade

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.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

Otto123

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

MadMax-FHEM

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

Otto123

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

Beetle2003

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.

Nobbynews

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.

Otto123

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