[PATCH] [10_IT] Fix for CUL disconnect with ITrepetition or ITfrequency

Begonnen von Matthias Gehre, 13 September 2014, 13:39:53

Vorheriges Thema - Nächstes Thema

Matthias Gehre

Symptome waren:
2014.09.13 13:02:08 2: IT set IkeaLampe off
2014.09.13 13:02:08 1: CUL_Get: isFFF0F0FFFF00
2014.09.13 13:02:08 2: IT IODev device didn't answer is command correctly:   raw => 12
2014.09.13 13:02:09 1: CUL_Get: X
2014.09.13 13:02:10 3: CUL0: Unknown code isfff0f0ffff00
6
21  879
, help me!
2014.09.13 13:02:13 1: CUL_Get: No answer, disconnecting now
2014.09.13 13:02:13 1: /dev/ttyACM0 disconnected, waiting to reappear (CUL0)
2014.09.13 13:02:13 1: Error in CUL_MAX_SendQueueHandler: CUL CUL0 did not answer request for current credits. Waiting 5 seconds.
2014.09.13 13:02:13 3: Setting CUL0 baudrate to 9600
2014.09.13 13:02:13 1: /dev/ttyACM0 reappeared (CUL0)


Analyse:
In fhem.cfg steht
define IkeaLampe IT ff00f0f0ff ff 00
attr IkeaLampe IODev CUL0
attr IkeaLampe ITrepetition 12


In IT_Set wird daher erst

  if(defined($attr{$name}) && defined($attr{$name}{"ITrepetition"})) {
    $message = "isr".$attr{$name}{"ITrepetition"};
    CUL_SimpleWrite($io, $message);
    Log GetLogLevel($name,4), "IT set ITrepetition: $message for $io->{NAME}";
  }

und dann
  my $v = $name ." ". join(" ", @a);
  $message = "is".uc($hash->{XMIT}.$hash->{$c});
  ## Send Message to IODev and wait for correct answer
  my $msg = CallFn($io->{NAME}, "GetFn", $io, (" ", "raw", $message));

aufgerufen.
Nach CUL_SimpleWrite antwortet der CUL mit "12". Dies holt aber erstmal niemand ab.
Dann in CallFn($io->{NAME}, "GetFn".. (d.h. CUL_Get) wird "isff00f0f0ffff" gesendet,
und als Antwort "12" abgeholt. Der CUL antwortet auf den "is.." Befehl
mit "isff00f0f0ffff".

Danach ruft irgendwer CUL_Get mit "X" auf. Als Anwort holen wir das alte
"isff00f0f0ffff" ab. Weil das nicht passt, geht 00_CUL in
($err, $msg) = CUL_ReadAnswer($hash, $a[1], 0, $gets{$a[1]}[1]);
     if(!defined($msg)) {
       DevIo_Disconnected($hash);
       $msg = "No answer";

und disconnected den CUL.

Lösung:
In 10_IT nie CUL_SimpleWrite benutzen, sondern immer
CallFn($io->{NAME}, "GetFn", um die Antwort sofort abzuholen.

diff --git a/FHEM/10_IT.pm b/FHEM/10_IT.pm
index 2db5abd..8bfcc18 100644
--- a/FHEM/10_IT.pm
+++ b/FHEM/10_IT.pm
@@ -125,7 +125,7 @@ IT_Set($@)
   ## Do we need to change ITrepetition ??     
   if(defined($attr{$name}) && defined($attr{$name}{"ITrepetition"})) {
        $message = "isr".$attr{$name}{"ITrepetition"};
-               CUL_SimpleWrite($io, $message);
+               CallFn($io->{NAME}, "GetFn", $io, (" ", "raw", $message));
                Log GetLogLevel($name,4), "IT set ITrepetition: $message for $io->{NAME}";
        }

@@ -138,7 +138,7 @@ IT_Set($@)
     
     my $arg = sprintf("%.3f", (hex($f2)*65536+hex($f1)*256+hex($f0))/65536*26);
     Log GetLogLevel($name,4), "Setting ITfrequency (0D,0E,0F) to $f2 $f1 $f0 = $arg MHz";
-    CUL_SimpleWrite($hash, "if$f2$f1$f0");
+    CallFn($io->{NAME}, "GetFn", $io, (" ", "raw", "if$f2$f1$f0"));
        }
       
   my $v = $name ." ". join(" ", @a);
@@ -159,14 +159,14 @@ IT_Set($@)
   ## Do we need to change ITrepetition back?? 
   if(defined($attr{$name}) && defined($attr{$name}{"ITrepetition"})) {
        $message = "isr".$it_defrepetition;
-               CUL_SimpleWrite($io, $message);
+               CallFn($io->{NAME}, "GetFn", $io, (" ", "raw", $message));
                Log GetLogLevel($name,4), "IT set ITrepetition back: $message for $io->{NAME}";
        }

   ## Do we need to change ITfrequency back??   
   if(defined($attr{$name}) && defined($attr{$name}{"ITfrequency"})) {
     Log GetLogLevel($name,4), "Setting ITfrequency back to 433.92 MHz";
-    CUL_SimpleWrite($hash, "if0");
+    CallFn($io->{NAME}, "GetFn", $io, (" ", "raw", "if0"));
        }

        ## Do we need to change RFMode back to HomeMatic??

justme1968

hallo matthias,

entschuldige die lange verzögerung. ich habe mir deinen patch eben angeschaut und habe noch einen anderen vorschlag:

wie wäre es auf das get ganz zu verzichten (der rückgabewert ist nicht wirklich aufschlussreich und bringt doch keinen mehrwert. oder ?) und stattdessen das ganze gleich richtig auf IOWrite umzustellen und damit auch fhem2fhem fähig zu werden.

was denkst du ?

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968

Matthias Gehre

Gute Idee. Es spricht also nichts dagegen dass du den Patch so wie oben eincheckst?

Die zweite Änderung (IOWrite) kann dann später noch oben drauf.

justme1968

ich hatte jetzt zwar gehofft das du den IOWrite patch gleich aus der schublade ziehst und ich nur ein mal einchecken brauch :) aber dann wird kommt es eben auf zwei mal.

gruss
  andre
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

https://github.com/sponsors/justme-1968