TSCUL für CUL mit HM-Timestamp

Begonnen von noansi, 18 September 2016, 10:46:28

Vorheriges Thema - Nächstes Thema

noansi

Hallo Rudolf, hallo Martin,

hier https://forum.fhem.de/index.php/topic,24436.msg489979.html#msg489979 liegt die aktuelle CUL Timestamp Variante.
Diese kann fast neben den letzten standard Versionen in FHEM existieren, da die geänderten Module weitgehend eigenständig sind, also TSCUL, TSSTACKED etc. neben CUL, STACKABLE_CC etc. .


Eine neue Utility Datei "CUL_Util.pm" habe ich dazu kreiert, in der Hilfs-Funktionen zur Zusammenarbeit enthalten sind:

##############################################
# $Id: CUL_Util.pm 0003 2016-09-18 00:14:47Z noansi $
package main;

sub IsRealCUL($);
sub IsCULTYPE($);
sub IsTSCULTYPE($);
sub PrefixCULCommonClients($);
sub AppendCULCommonClients($);


########################
sub
IsRealCUL($)
{
  my ($t) = @_; # TYPE
  return (
              ($t eq "TSCUL")
           || ($t eq "CUL")
         );
}

########################
sub
IsCULTYPE($)
{
  my ($t) = @_; # TYPE
  return (
              ($t eq "TSCUL")
           || ($t eq "TSSTACKED")
           || ($t eq "CUL")
           || ($t eq "STACKABLE_CC")
         );
}

########################
sub
IsTSCULTYPE($)
{
  my ($t) = @_; # TYPE
  return (
              ($t eq "TSCUL")
           || ($t eq "TSSTACKED")
         );
}


########################
sub
PrefixCULCommonClients($)
{
  my ($Clients) = @_;
  $Clients = ':'.$Clients  if ($Clients !~ m/^:/);
  $Clients = "TSSTACKED:STACKABLE_CC".$Clients;
  return $Clients;
}

########################
sub
AppendCULCommonClients($)
{
  my ($Clients) = @_;
  $Clients .= ':' if ($Clients !~ m/:$/);
  $Clients .= "TSSTACKED:STACKABLE_CC";
  return $Clients;
}

1;



@Martin: In 10_CUL_HM.pm sind dafür folgende mit TSCUL markierte Änderungen erforderlich. Ich habe auch noch die nur einfache pair request Unterdrückung rein gebracht, da sie meiner Ansicht nach notwendig ist.

--- org/10_CUL_HM.pm Sun Sep 18 09:37:46 2016
+++ changed/10_CUL_HM.pm Sun Sep 18 09:38:10 2016
@@ -1,7 +1,7 @@
##############################################
##############################################
# CUL HomeMatic handler
-# $Id: 10_CUL_HM.pm 12138 2016-09-11 15:21:08Z martinp876 $
+# $Id: 10_CUL_HM.pm 12138a 2016-09-18 09:07:08Z martinp876/noansi $

package main;

@@ -131,6 +131,8 @@
sub CUL_HM_Initialize($) {
   my ($hash) = @_;

+  require "$attr{global}{modpath}/FHEM/CUL_Util.pm";  # ToDo TSCUL
+
   $hash->{Match}     = "^A....................";
   $hash->{DefFn}     = "CUL_HM_Define";
   $hash->{UndefFn}   = "CUL_HM_Undef";
@@ -155,6 +157,9 @@
                        ."msgRepeat "
                        ."hmProtocolEvents:0_off,1_dump,2_dumpFull,3_dumpTrigger "
                        ."aesKey:5,4,3,2,1,0  "
+#                       ."hmDstDly:slider,104,4,136 "     # Change noansi # TSCUL destination answer delay, for testing
+#                       ."sndThrRep:0,1 "                 # Change noansi # TSCUL force expectation of send through repeater, for testing
+#                       ."repBstAddDly:slider,0,4,600 "   # Change noansi # TSCUL additional first answer delay for burst devices using repeater to device, 512 is a good value for HM-LC-SW1-BA-PCB, for testing
                        ;
   $hash->{Attr}{chn} =  "repPeers "            # -- channel only attributes
                        ."peerIDs "
@@ -2875,6 +2880,7 @@
                              $devHlpr->{HM_CMDNR} < 250);# this is power on
   $devHlpr->{HM_CMDNR} = hex($mhp->{mNo});# sync msgNo
   my $repeat;
+  $devHlpr->{supp_Pair_Rep} = 0 if ($mhp->{mTp} ne "00"); # reset suppress flag as we got something different from device # Change noansi 
   if   ($mhp->{mTp} eq "02"){# Ack/Nack/aesReq ####################
     my $reply;
     my $success;
@@ -3038,9 +3044,12 @@
   }

   elsif($mhp->{mTp} eq "00"){######################################
-    if (InternalVal($mhp->{devN},"lastMsg","") =~ m/t:00/){# repeated
+    if ($devHlpr->{supp_Pair_Rep}){# repeated  # Change noansi
+      $devHlpr->{supp_Pair_Rep} = 0; # reset flag, suppress only once not to lockup if device answer is not received # Change noansi
       return "done";  # suppress handling of a repeated pair request
     }
+    $devHlpr->{supp_Pair_Rep} = 1;  # suppress next handling of a repeated pair request # Change noansi
+
     my $paired = 0; #internal flag
     CUL_HM_infoUpdtDevData($mhp->{devN}, $mhp->{devH},$mhp->{p})
                   if (!$modules{CUL_HM}{helper}{hmManualOper});
@@ -3097,7 +3106,7 @@
       $respRemoved = 1;#force command stack processing
     }

-    $devHlpr->{HM_CMDNR} += 20;  # force new setting. Send will take care of module 255
+    $devHlpr->{HM_CMDNR} += 0x27;  # force new setting. Send will take care of module 255
     $ret = "done";
   }
   elsif($mhp->{mTp} eq "10"){######################################
@@ -8473,7 +8482,7 @@
     next if (!$defs{$ioN});
     if (  $defs{$ioN}{TYPE} =~ m/^(HMLAN|HMUARTLGW)$/){;
     }
-    elsif(($defs{$ioN}{TYPE} eq "CUL")||($defs{$ioN}{TYPE} eq "STACKABLE_CC")){
+    elsif( IsCULTYPE($defs{$ioN}{TYPE}) ){  # ToDo TSCUL
       CommandAttr(undef, "$ioN rfmode HomeMatic")
             if (AttrVal($ioN,"rfmode","") ne "HomeMatic");
     }



@Rudolf: Hier die dazu nötigen Änderungen für 00_CUL.pm

--- old/00_CUL.pm Sun Aug 21 12:05:23 2016
+++ changed/00_CUL.pm Sun Sep 18 01:40:03 2016
@@ -1,5 +1,5 @@
##############################################
-# $Id: 00_CUL.pm 12027 2016-08-21 12:05:23Z rudolfkoenig $
+# $Id: 00_CUL.pm 12027 2016-08-21 12:05:23Z rudolfkoenig/noansi $
package main;

use strict;
@@ -45,14 +45,15 @@

my @ampllist = (24, 27, 30, 33, 36, 38, 40, 42); # rAmpl(dB)

-my $clientsSlowRF    = ":FS20:FHT.*:KS300:USF1000:BS:HMS: ".
+my $clientsSlowRF    = " :FS20:FHT.*:KS300:USF1000:BS:HMS: ".
                        ":CUL_EM:CUL_WS:CUL_FHTTK:CUL_HOERMANN: ".
                        ":ESA2000:CUL_IR:CUL_TX:Revolt:IT:UNIRoll:SOMFY: ".
-                       ":STACKABLE_CC:CUL_RFR::CUL_TCM97001:CUL_REDIRECT:";
-my $clientsHomeMatic = ":CUL_HM:HMS:CUL_IR:STACKABLE_CC:";
-my $clientsMAX       = ":CUL_MAX:HMS:CUL_IR:STACKABLE_CC:";
-my $clientsWMBus     = ":WMBUS:HMS:CUL_IR:STACKABLE_CC:";
-my $clientsKOPP_FC   = ":KOPP_FC:HMS:CUL_IR:STACKABLE_CC:";
+                       ":CUL_RFR: ".
+                       ":CUL_TCM97001:CUL_REDIRECT";  # ToDo TSCUL
+my $clientsHomeMatic = ":CUL_HM:HMS:CUL_IR";          # ToDo TSCUL
+my $clientsMAX       = ":CUL_MAX:HMS:CUL_IR";         # ToDo TSCUL
+my $clientsWMBus     = ":WMBUS:HMS:CUL_IR";           # ToDo TSCUL
+my $clientsKOPP_FC   = ":KOPP_FC:HMS:CUL_IR";         # ToDo TSCUL

my %matchListSlowRF = (
     "1:USF1000"   => "^81..(04|0c)..0101a001a5ceaa00....",
@@ -112,6 +113,7 @@
{
   my ($hash) = @_;

+  require "$attr{global}{modpath}/FHEM/CUL_Util.pm";  # ToDo TSCUL
   require "$attr{global}{modpath}/FHEM/DevIo.pm";

# Provider
@@ -180,7 +183,7 @@
     my $x = $1;
     foreach my $d (keys %defs) {
       next if($d eq $name);
-      if($defs{$d}{TYPE} eq "CUL") {
+      if(IsCULTYPE($defs{$d}{TYPE})) {  # ToDo TSCUL
         if(uc($defs{$d}{FHTID}) =~ m/^$x/) {
           my $m = "$name: Cannot define multiple CULs with identical ".
                         "first two digits ($x)";
@@ -193,7 +196,7 @@
   $hash->{FHTID} = uc($a[3]);
   $hash->{initString} = "X21";
   $hash->{CMDS} = "";
-  $hash->{Clients} = $clientsSlowRF;
+  $hash->{Clients} = PrefixCULCommonClients($clientsSlowRF);  # ToDo TSCUL
   $hash->{MatchList} = \%matchListSlowRF;

   if($dev eq "none") {
@@ -522,9 +525,10 @@
   my ($hash, $arg, $anydata, $regexp) = @_;
   my $ohash = $hash;

-  while($hash->{TYPE} ne "CUL") {   # Look for the first "real" CUL
-    $hash = $hash->{IODev};
-  }
+  while($hash) {  # Look for the first "real" CUL  # ToDo TSCUL
+    last if (IsRealCUL($hash->{TYPE}));            # ToDo TSCUL
+    $hash = $hash->{IODev};                        # ToDo TSCUL
+  }                                                # ToDo TSCUL
   return ("No FD", undef)
         if(!$hash || ($^O !~ /Win/ && !defined($hash->{FD})));

@@ -1036,7 +1040,7 @@
     if($aVal eq "HomeMatic") {
       return if($hash->{initString} =~ m/Ar/);
       if($hash->{CMDS} =~ m/A/ || IsDummy($hash->{NAME}) || !$hash->{FD}) {
-        $hash->{Clients} = $clientsHomeMatic;
+        $hash->{Clients} = PrefixCULCommonClients($clientsHomeMatic);  # ToDo TSCUL
         $hash->{MatchList} = \%matchListHomeMatic;
         CUL_SimpleWrite($hash, "Zx") if ($hash->{CMDS} =~ m/Z/); # reset Moritz
         $hash->{initString} = "X21\nAr";  # X21 is needed for RSSI reporting
@@ -1050,7 +1054,7 @@
     } elsif($aVal eq "MAX") {
       return if($hash->{initString} =~ m/Zr/);
       if($hash->{CMDS} =~ m/Z/ || IsDummy($hash->{NAME}) || !$hash->{FD}) {
-        $hash->{Clients} = $clientsMAX;
+        $hash->{Clients} = PrefixCULCommonClients($clientsMAX);  # ToDo TSCUL
         $hash->{MatchList} = \%matchListMAX;
         CUL_SimpleWrite($hash, "Ax") if ($hash->{CMDS} =~ m/A/); # reset AskSin
         $hash->{initString} = "X21\nZr";  # X21 is needed for RSSI reporting
@@ -1064,7 +1068,7 @@
     } elsif($aVal eq "WMBus_S") {
       return if($hash->{initString} =~ m/brs/);
       if($hash->{CMDS} =~ m/b/ || IsDummy($hash->{NAME}) || !$hash->{FD}) {
-        $hash->{Clients} = $clientsWMBus;
+        $hash->{Clients} = PrefixCULCommonClients($clientsWMBus);  # ToDo TSCUL
         $hash->{MatchList} = \%matchListWMBus;
         $hash->{initString} = "X21\nbrs"; # Use S-Mode
         CUL_WriteInit($hash);
@@ -1076,7 +1080,7 @@
     } elsif($aVal eq "WMBus_T") {
       return if($hash->{initString} =~ m/brt/);
       if($hash->{CMDS} =~ m/b/ || IsDummy($hash->{NAME}) || !$hash->{FD}) {
-        $hash->{Clients} = $clientsWMBus;
+        $hash->{Clients} = PrefixCULCommonClients($clientsWMBus);  # ToDo TSCUL
         $hash->{MatchList} = \%matchListWMBus;
         $hash->{initString} = "X21\nbrt"; # Use T-Mode
         CUL_WriteInit($hash);
@@ -1087,7 +1091,7 @@
       }
     } elsif($aVal eq "KOPP_FC") {
       if($hash->{CMDS} =~ m/k/ || IsDummy($hash->{NAME}) || !$hash->{FD}) {
-        $hash->{Clients} = $clientsKOPP_FC;
+        $hash->{Clients} = PrefixCULCommonClients($clientsKOPP_FC);  # ToDo TSCUL
         $hash->{MatchList} = \%matchListKOPP_FC;
         $hash->{initString} = "krS"; # krS: start Kopp receive Mode
         CUL_WriteInit($hash);
@@ -1099,7 +1103,7 @@

     } else {
       return if($hash->{initString} eq "X21");
-      $hash->{Clients} = $clientsSlowRF;
+      $hash->{Clients} = PrefixCULCommonClients($clientsSlowRF);  # ToDo TSCUL
       $hash->{MatchList} = \%matchListSlowRF;
       $hash->{initString} = "X21";
       CUL_SimpleWrite($hash, "Ax") if ($hash->{CMDS} =~ m/A/); # reset AskSin
@@ -1131,11 +1135,16 @@
{
   my ($isadd, $hash, $msg) = @_;
   my $t = $hash->{TYPE};
-  while($t ne "CUL") {
+#  while(!IsRealCUL($t)) {  # ToDo TSCUL
+#    $msg = CallFn($hash->{NAME}, $isadd ? "AddPrefix":"DelPrefix", $hash, $msg);
+#    $hash = $hash->{IODev};
+#    last if(!$hash);
+#    $t = $hash->{TYPE};
+#  }
+  while($hash) {  # avoid endless loop if $hash is not defined
+    last if (IsRealCUL($hash->{TYPE}));  # ToDo TSCUL
     $msg = CallFn($hash->{NAME}, $isadd ? "AddPrefix":"DelPrefix", $hash, $msg);
     $hash = $hash->{IODev};
-    last if(!$hash);
-    $t = $hash->{TYPE};
   }
   return ($hash, $msg);
}


und 16_STACKABLE_CC.pm

--- org/16_STACKABLE_CC.pm Sun Sep 18 10:19:14 2016
+++ changed/16_STACKABLE_CC.pm Sun Sep 18 10:19:37 2016
@@ -1,5 +1,5 @@
##############################################
-# $Id: 16_STACKABLE_CC.pm 11984 2016-08-19 12:47:50Z rudolfkoenig $
+# $Id: 16_STACKABLE_CC.pm 11984a 2016-08-19 12:47:50Z rudolfkoenig/noansi $
package main;
use strict;
use warnings;
@@ -40,7 +40,7 @@

   my $io = $defs{$a[2]};
   return "$a[2] is not a CUL/STACKABLE_CC"
-    if(!$io || !($io->{TYPE} eq "CUL" || $io->{TYPE} eq "STACKABLE_CC"));
+    if(!$io || !IsCULTYPE($io->{TYPE}));  # ToDo TSCUL

   return "$io->{NAME} has alread a stacked device: $io->{STACKED}"
     if($io->{STACKED});


In der Form überschaubar und leicht wartbar, denke ich. Und die TS-Variante kann nebenher oder auch im Mischbetrieb genutzt werden. Oder hast Du noch eine bessere Idee?

Könnt Ihr bitte diese Änderungen einpflegen und die CUL_Util.pm ergänzen? Damit würde es "updatesicher", nur ein unüberlegter CUL Firmwareupdate kann dann dazwischen funken.

Danke, Ansgar.

rudolfkoenig

Eigentlich lese ich die Wunschliste nicht, aber man hat mich auf diesen Beitrag aufmerksam gemacht.

Was ich nicht verstehe: Wenn durch ein CUL_Util.pm fuer CUL_HM.pm eine Parallelexistenz von 00_TSCUL.pm und 00_CUL.pm ermoeglicht wird, wieso sind Aenderungen in 00_CUL.pm noetig?

noansi

Hallo Rudolf,

es liegt daran, dass SCC beliebig nutzbar sein soll, sprich der Mischbetrieb der Module in einem SCC Stapel sollte möglich sein, was ohne Änderungen scheitert.
Oder es müsste völlig unsinnigerweise ein parallel 00_CULxx und 16_STACKABLE_CCxx Modul geben, was das ermöglicht, ansonsten aber völlig gleiche Funktionalität wie 00_CUL und 16_STACKABLE_CC bietet.

Ansonsten werden die * Nachrichten von SCC nicht oder nicht korrekt weiter gereicht, wenn im SCC Stapel CUL/TSCUL/STACKABLE_CC/TSSTACKED gemischt wird, da jeweils der Modul TYPE relevant ist.

Das Mischen macht dann Sinn, wenn von der einen oder anderen Firmware Funk Protokolle nicht unterstützt werden, die aber genutzt werden möchten.

Natürlich kann man die Abfragen/Ergänzung zu den Modulen auch direkt in 00_CUL.pm und 16_STACKABLE_CC.pm an den verschiedenen Stellen einbauen, aber das ist sehr unübersichtlich und fehleranfällig.
Die angebotene Lösung wäre auch offen für weitere Alterantivmodule.

Gruß, Ansgar.

rudolfkoenig

Sorry fuer die spaete Antwort, bin erst jetzt dazugekommen die Aufgabe naeher anzuschauen.

Ich habe zwei Probleme mit deinem Vorschlag:

- ich will nicht von einem Modul (CUL_Util.pm) abhaengig sein, was durch externe Aenderungen die Funktionalitaet meines Moduls beeintraechtigt.

- ich sehe Bugs in deinem Patch. Oder sagen wir Fragen, vielleicht habe ich was uebersehen:
  - da in 00_CUL.pm MatchList nicht modifiziert wird, wird TSSTACKABLE nie eine Nachricht erhalten. Wie kann man die Nachrichten an TSSTACKABLE von STACKABLE_CC unterscheiden? Vermutlich gar nicht (sonst koennte man das Firmware nicht mischen), und damit muesste ich beide Module in allen MatchLists mit gleichem Regexp auffuehren.
  - "# Look for the first "real" CUL" statt den Letzten macht kein Sinn, es koennen keine 2 CULs im Stack sein.

Ich war bisher der Ansicht, dass die Staerke von deinem culfw-Variante (und damit TSCUL) in der besseren Unterstuetzung von HomeMatic liegt. Weiterhin greift CUL_HM direkt auf CUL Funktionen zu, ist damit nicht faehig STACKABLE_CC, FHEM2FHEM, usw. zu unterstuetzen. Damit waere ein TSSTACKED Unterstuetzung wenig sinnvoll. Vermutlich habe ich eine Entwicklung verschlafen. Kannst du mir bitte sagen, wo?

Will aber keinem im Weg stehen, und habe deswegen die Unterstuetzung von TSCUL und TSSTACKED in meinen beiden Modulen eingebaut, testen konnte ich es nicht. Immerhin ist der Diff klein ausgefallen, was mich freut.
Kannst du es bitte testen und Feedback geben?

noansi

Hallo Rudolf,

danke, dass Du Dich dem annimst!

Zitat- ich will nicht von einem Modul (CUL_Util.pm) abhaengig sein, was durch externe Aenderungen die Funktionalitaet meines Moduls beeintraechtigt.
Muss auch nicht sein, das war nur ein Vorschlag meinerseits, Tests auf unterschiedliche CUL (Modul) Typen zentral unterzubringen -> müsste dann nur dort erweitert oder gewartet werden.
Schon bei CUL_HM wurde STACKABLE_CC nicht abgefragt, eben weil keiner an diesen CUL Typ als HM_IO gedacht hat. Daher der Gedanke.

Zitat- da in 00_CUL.pm MatchList nicht modifiziert wird, wird TSSTACKABLE nie eine Nachricht erhalten
Hmm, guter Hinweis, muss ich mir nochmal ansehen. Ist schon lange her. Aber ich meine, das wäre jeweils über da IODEV oder Stacked device gelöst/zu lösen. Ob das * in der Nachricht über TSSTACKED oder STACKABLE_CC dazu/weg kommt ist dann eigentlich egal.
Nur bei der jeweils passenden CUL/TSCUL Parse Funktion muss die Nachricht ankommen.
Das habe ich vielleicht übersehen in der TSSTACKED und STACKABLE_CC Parse Funktion. Die Parse Funktion zum HASH müsste aufgerufen werden, statt direkt xxx_Parse.
Das muss bei beiden Modulen dann gleich funktionieren.

Zitat- "# Look for the first "real" CUL" statt den Letzten macht kein Sinn, es koennen keine 2 CULs im Stack sein.
??? der Kommentar stammt aus STACKABLE_CC, wenn ich das richtig im Kopf habe.
Und es ging da darum, von "aufgesteckten" Stack Modulen zum untersten durch zu hangeln, der dann als CUL/TSCUL definiert ist. Das first ist vielleicht schlecht im Kommentar.

ZitatIch war bisher der Ansicht, dass die Staerke von deinem culfw-Variante (und damit TSCUL) in der besseren Unterstuetzung von HomeMatic liegt.
Das ist auch mein primärer Fokus.
Aber da ich auch noch einige SlowRF Sensoren nutze und mit dem Empfang noch nicht glücklich war, habe ich da auch dran gedreht. Warten und Slow-RF Sendetiming habe ich auch in der Funktionalität geändert, um sowohl die Kommunikation zum Host zu stabilisieren, als auch das Sendetiming präziser hin zu bekommen.

ZitatWeiterhin greift CUL_HM direkt auf CUL Funktionen zu, ist damit nicht faehig STACKABLE_CC, FHEM2FHEM, usw. zu unterstuetzen. Damit waere ein TSSTACKED Unterstuetzung wenig sinnvoll.
Welche Funktionen meinst Du? So lange das gleiche mit dem HASH passiert, ist das ja kein Problem (bis auf Nebenwirkungen bei Änderungen an CUL).
STACKABLE_CC und TSSTACKED dienen ja eigentlich nur als Hilfs-IO, um die Nachrichten durch den Stapel zu bekommen.
Einige Funktionen zur Sendewarteschlangenverarbeitung in TSSTACKED machen bis auf das Logging auch das gleiche, wie in TSCUL, bzw. werden benötigt, um zur speziellen TSSTACKED Funktion gelangen zu können.

ZitatKannst du es bitte testen und Feedback geben?
Mach ich, dauert aber was.

Gruß, Ansgar.

noansi

Hallo Rudolf,

- "# Look for the first "real" CUL" statt den Letzten macht kein Sinn, es koennen keine 2 CULs im Stack sein.
Aber ich meine, Du musst da auf beide Typen (CUL und TSCUL) testen, denn STACKABLE_CC oder TSSTACKED wissen nicht, wo sie drauf sitzen, wenn sie CUL/TSCUL Funktionen aufrufen, aber direkt oder indirekt ReadAnswer in der jeweiligen Variante ausführen.

In CUL_Define musst Du hier

  if(uc($a[3]) =~ m/^([0-6][0-9A-F])/ && $1 ne "00") {
    my $x = $1;
    foreach my $d (keys %defs) {
      next if($d eq $name);
      if($defs{$d}{TYPE} =~ m/$culNameRe/) {


zumindest auch auf TSSTACKED testen, da TSSTACKED auch eine FHTID haben kann.

Hier habe ich mir was dabei gedacht, erst auf den definierten hash zu testen, weil es mir mal passiert ist, dass der hash undefiniert war und das hat lange gedauert, das Problem zu lokalisieren.
sub
CUL_prefix($$$)
{
  my ($isadd, $hash, $msg) = @_;
  my $t = $hash->{TYPE};
#  while(!IsRealCUL($t)) {  # ToDo TSCUL
#    $msg = CallFn($hash->{NAME}, $isadd ? "AddPrefix":"DelPrefix", $hash, $msg);
#    $hash = $hash->{IODev};
#    last if(!$hash);
#    $t = $hash->{TYPE};
#  }
  while($hash) {  # avoid endless loop if $hash is not defined
    last if (
                ($hash->{TYPE} eq "TSCUL")
             || ($hash->{TYPE} eq "CUL")
            );  # ToDo TSCUL
    $msg = CallFn($hash->{NAME}, $isadd ? "AddPrefix":"DelPrefix", $hash, $msg);
    $hash = $hash->{IODev};


  }

So
    $msg = CallFn($hash->{NAME}, $isadd ? "AddPrefix":"DelPrefix", $hash, $msg);
    $hash = $hash->{IODev};
    last if(!$hash);

wird die Funktion bei undefiniertem hash wieder aufgerufen, bevor auf den hash getestet wird ->  bis der Stack mit am Ende ist und es gibt dann keinen sinnvollen Fehlerhinweis.

Gruß, Ansgar.

rudolfkoenig

ZitatIn CUL_Define musst Du hier.. zumindest auch auf TSSTACKED testen, da TSSTACKED auch eine FHTID haben kann.
Naja, muessen tu ich ja nicht, weiterhin:
- es wird auch nicht auf STACKABLE_CC geprueft
- eine TSSTACKED oder STACKABLE_CC Definition kommt meist nach der CUL Definition, die Pruefung in CUL.pm hilft nicht.
- die Wahrscheinlichkeit dass man bei eiem externen USB-CUL das gleiche FHT-ID vergibt wie auf einem der TSCUL/STACKABLE_CC, ist gering
-> Es bleibt bei der alten Pruefung.

Zitatweil es mir mal passiert ist, dass der hash undefiniert war
Das ist auch nicht normal, STACKABLE_CC prueft bei der Definition, ob es einen passenden IODev gibt.
Habs aber umbgebaut, da es wenig Aufwand ist.


noansi

Hallo Rudolf,

das unterste Modul als CUL für SlowRF definiert (mit CUL_WS Sensoren und ein CUL_TX Sensor)
und darauf ein TSSTACKED als HM IO definiert funktioniert schon mal.

Die Nachrichten kommen in beide Richtungen richtig auch bei den richtigen Modulen an.

Anders rum,
also unterstes Modul als TSCUL HM IO
und darauf ein STACKABLE_CC Modul für SlowRF definiert,
knallts hier bzw. wird endlos schon beim FHEM Start, da Du nicht auch auf TSCUL testest, wie gewünscht, also dann nach TSCUL nur noch undefinertes IODEV und somit dann endlos einen undefinierten hash hast:

sub
CUL_ReadAnswer($$$$)
{
  my ($hash, $arg, $anydata, $regexp) = @_;
  my $ohash = $hash;

  while($hash->{TYPE} ne "CUL") {   # Look for the first "real" CUL
    $hash = $hash->{IODev};
  }


Gruß, Ansgar.

noansi

Hallo Rudolf,

Zitat- da in 00_CUL.pm MatchList nicht modifiziert wird, wird TSSTACKABLE nie eine Nachricht erhalten
ZitatDas habe ich vielleicht übersehen in der TSSTACKED und STACKABLE_CC Parse Funktion. Die Parse Funktion zum HASH müsste aufgerufen werden, statt direkt xxx_Parse.
Die Dispatcherfunktion macht es richtig mit dem Aufruf der TSSTACKED bzw. STACKABLE_CC Parse Funktion, deswegen geht es, da hatte ich mir richtig n'en Kopf drum gemacht.

ZitatAnders rum,
also unterstes Modul als TSCUL HM IO
und darauf ein STACKABLE_CC Modul für SlowRF definiert,
knallts hier bzw. wird endlos schon beim FHEM Start, da Du nicht auch auf TSCUL testest, wie gewünscht, also dann nach TSCUL nur noch undefinertes IODEV und somit dann endlos einen undefinierten hash hast:

So geht es und wird auch nicht endlos, wenn das "reale" IO mal anders lautet.
Zitatsub
CUL_ReadAnswer($$$$)
{
  my ($hash, $arg, $anydata, $regexp) = @_;
  my $ohash = $hash;

  while($hash && $hash->{TYPE} ne "CUL" && $hash->{TYPE} ne "TSCUL") {   # Look for the first "real" CUL
    $hash = $hash->{IODev};
  }

ZitatNaja, muessen tu ich ja nicht
es bezieht sich nur auf, "wenn es funktionieren soll". Ansonsten bist Du frei in Deinem Willen. ;)

Gruß,

Ansgar.

rudolfkoenig

ZitatSo geht es und wird auch nicht endlos, wenn das "reale" IO mal anders lautet.
Danke fuer den Hinweis, habe hier den gleichen Code wie sonst auch verwendet, kannst du es bitte testen?

noansi

Hallo Rudolf,

nun kommen in beiden Testszenarien die Werte richtig an und Befehle gehen richtig raus.
(gestestet # $Id: 00_CUL.pm 12983 2017-01-06 13:53:27Z rudolfkoenig $)

Hier:
sub
CUL_prefix($$$)
{
  my ($isadd, $hash, $msg) = @_;
  while($hash && $hash->{TYPE} !~ m/$culNameRe/) {
    $msg = CallFn($hash->{NAME}, $isadd ? "AddPrefix":"DelPrefix", $hash, $msg);
    $hash = $hash->{IODev};
    last if(!$hash);
  }

ist "    last if(!$hash);" nun überflüssig, da nun eh in der while Bedingung, und Du könntest den noch einsparen.

Die Matchlistergänzung um
    "M:TSSTACKED"=>"^\\*",
müßte eigentlich überflüssig sein. Wenn ich es richtig im Kopf habe wird eh nur der erste erfolgreich gefundene und ausgeführte Match in der Liste ausgeführt, richtig?

Mit Blick auf die IO-Performance wäre
    "H:STACKABLE_CC"=>"^\\*",
als
    "0:STACKABLE_CC"=>"^\\*",
am Anfang der Matchlist besser aufgehoben. Da in der Reihenfolge in der Liste nach dem Match gesucht wird. Und der Match auf "^\\*" ist kurz und schnell im Vergleich zu anderen. (für HM suche ich inzwischen immer jedes bisschen verschwendete Zeit)

Zitat- eine TSSTACKED oder STACKABLE_CC Definition kommt meist nach der CUL Definition, die Pruefung in CUL.pm hilft nicht.
In TSSTACKED ist eine drin.

Gruß und Danke für die Änpassungen!

Ansgar.

rudolfkoenig

Hallo Ansgar,

koenntest Du bitte bei Gelegenheit das neue 16_STACKABLE.pm Modul testen?
Es soll STACKABLE_CC und TSSTACKED abloesen, da generischer ist, und die Weiterreichung der DISCONNECT/CONNECT Events unterstuetzt. Die "Syntax" schaut so aus:

define TSCUL_1 TSCUL /dev/xy 0000

define STACK1 STACKABLE TSCUL_1
define CUL_1 CUL FHEM:DEVIO:STACK1:9600 0000

define STACK2 STACKABLE CUL_1
define TSCUL_2 TSCUL FHEM:DEVIO:STACK2:9600 0000


Du muesstest in TSCUL nur STACKABLE unterstuetzen, die Unterstuetzung fuer STACKABLE_CC und TSSTACKED koennte raus. Ich habe das auch in CUL vor, wenn ich sicher bin, dass STACKABLE funktioniert :)

Gruss,
  Rudi

noansi

Hallo Rudolf,

teste ich.

Muss ich noch weitere Module dafür aktualisieren? Ich bin auf einem 5.7er Stand.

Gruß, Ansgar.

rudolfkoenig

ZitatMuss ich noch weitere Module dafür aktualisieren? Ich bin auf einem 5.7er Stand.
Nach meinem Bauchgefuehl nicht, habs aber nicht getestet.

noansi

Hallo Rudolf,

nach einigen Änderungen bei mir habe ich jetzt mal eine IO-Funktion mit STACKABLE laufen.

Allerdings mußte ich auf mein DevIoTS.pm erst mal verzichten, weil Du DevIo_Disconnected und DevIo_SimpleRead in STACKABLE direkt aufrufst.
Können wir da eine Abfrage auf TSCUL einbauen, damit dann jeweils die DevIoTS Funktions-Variante aufgerufen wird?

In DevIOTS.pm hatte ich einige Änderungen im Bezug auf nicht mehr erreichbare devices einfließen lassen, so dass bei Disconnect z.B. eines CUL Busy Waiting vermieden wird.
Auf die möchte ich höchst ungern verzichten, da es bei HM extrem stört, auch wenn nicht das HM IO device disconnected ist. (Das hat mir mal das System ziemlich lahm gelegt, als ich noch deutliche CUL USB Probleme hatte)

Oder möchtest Du Dir mal mein Lösungsansatz zum Disconnect Busy Waiting näher anschauen und DevIo.pm anpassen?
Statt des Busy Waitings teste ich mittels Timer mehrfach, ob doch noch was vom device kommt, bevor ich wirklich den Status Disconnected setze.

Gruß, Ansgar.