FHEM Forum

FHEM - Entwicklung => FHEM Development => Thema gestartet von: justme1968 am 21 Mai 2014, 20:37:52

Titel: NTFY_ORDER in CommandDefine setzen
Beitrag von: justme1968 am 21 Mai 2014, 20:37:52
ich habe gerade zwei stunde damit verbracht zu suchen warum für readingsProxy die NotifyFn nicht aufgerufen wird wenn ich ein neues proxy device anlege.

als ursache hat sich herausgestellt das %ntfyHash das jeweils letzte device nicht enthalten hat.

der grund hierfür war das ich in der DefineFn schon ein readingsUpdate aufrufe.

dieses readingsUpdate für dazu das über DoTrigger createNtfyHash() aufgerufen wird bevor $hash{NTFY_ORDER} initialisiert ist weil das in CommandDefine erst nach dem aufruf von DefFn passiert. und ohne NTFY_ORDER wird das device nicht berücksichtig.

deshalb schlage ich vor in CommandDefine die initialisierung von NTFY_ORDER vor den aufruf der DefFn zu verschieben. --- /Users/andre/fhem-code/fhem/fhem.pl 2014-05-18 17:49:04.000000000 +0200
+++ fhem.pl 2014-05-21 20:35:47.000000000 +0200
@@ -1545,6 +1545,11 @@
   $hash{CFGFN} = $currcfgfile
         if($currcfgfile ne AttrVal("global", "configfile", ""));

+  if($modules{$m}{NotifyFn}) {
+    $hash{NTFY_ORDER} = ($modules{$m}{NotifyOrderPrefix} ?
+              $modules{$m}{NotifyOrderPrefix} : "50-") . $name;
+  }
+
   # If the device wants to issue initialization gets/sets, then it needs to be
   # in the global hash.
   $defs{$name} = \%hash;
@@ -1559,10 +1564,6 @@
     foreach my $da (sort keys (%defaultattr)) {     # Default attributes
       CommandAttr($cl, "$name $da $defaultattr{$da}");
     }
-    if($modules{$m}{NotifyFn} && !$hash{NTFY_ORDER}) {
-      $hash{NTFY_ORDER} = ($modules{$m}{NotifyOrderPrefix} ?
-                $modules{$m}{NotifyOrderPrefix} : "50-") . $name;
-    }
     DoTrigger("global", "DEFINED $name", 1) if($init_done);

   }
Titel: Antw:NTFY_ORDER in CommandDefine setzen
Beitrag von: betateilchen am 21 Mai 2014, 21:23:41
Das heißt, Du willst schon eine notifyOrder setzen, bevor Du weisst, ob das danach erfolgende define überhaupt funktioniert oder eventuell mit einem Fehler abbricht?

Das ergibt für mich keinen Sinn.
Titel: Antw:NTFY_ORDER in CommandDefine setzen
Beitrag von: justme1968 am 21 Mai 2014, 21:39:22
das macht genau so viel sinn wie alle anderen parameter im hash zu setzen. und das etwas schief gehen könnte heisst ja nicht das es schief geht. die gesetzte NTFY_ORDER ist im fehler fall völlig unschädlich und wird wieder gelöscht. so wie die restliche initialisierung.

der hash wird angelegt und initialisiert bevor die DefFn aufgerufen wird damit set und get in define geht. aus genau dem gleichen grund muss die initialisierung vollständig sein damit ein readingsUpdate geht.

wenn das nicht passiert steht in %ntfyHash schlicht und einfach etwas falsches und es wird so lange nicht aktualisiert bis sich wieder etwas an der device liste ändert.


alternativ könnte man auch das löschen von %ntfyHash hinter den aufruf der DefFn und direkt vor den trigger für das global:DEFINED verschieben. --- /Users/andre/fhem-code/fhem/fhem.pl 2014-05-18 17:49:04.000000000 +0200
+++ fhem.pl 2014-05-21 21:35:59.000000000 +0200
@@ -1518,7 +1518,6 @@
   return "Invalid characters in name (not A-Za-z0-9.:_): $name"
                         if($name !~ m/^[a-z0-9.:_]*$/i);

-  %ntfyHash = ();
   my $m = $a[1];
   if(!$modules{$m}) {                           # Perhaps just wrong case?
     foreach my $i (keys %modules) {
@@ -1563,8 +1562,8 @@
       $hash{NTFY_ORDER} = ($modules{$m}{NotifyOrderPrefix} ?
                 $modules{$m}{NotifyOrderPrefix} : "50-") . $name;
     }
+    %ntfyHash = ();
     DoTrigger("global", "DEFINED $name", 1) if($init_done);
-
   }
   return $ret;
}

das ist vielleicht sogar noch sauberer.
Titel: Antw:NTFY_ORDER in CommandDefine setzen
Beitrag von: rudolfkoenig am 22 Mai 2014, 09:08:34
Hab die zweite Version eingecheckt.