Patch für TRX_Light zum Repeaten von Kommandos beim Senden

Begonnen von dero, 17 Januar 2016, 19:30:09

Vorheriges Thema - Nächstes Thema

dero

Manchmal verschluckt mein RFXTRX Kommandos, evtl. Sendequalität, Störungen, Kollisionen...

Folgender Patch fügt ein Attribut "repeat" zu TRX_LIGHT hinzu.

Bespiel: attr SD_Light repeat 5

Kommandos an SD_Light werden 5 mal gesendet.



diff --git a/fhem/FHEM/46_TRX_LIGHT.pm b/fhem/FHEM/46_TRX_LIGHT.pm
index 304dadd..23e74e8 100755
--- a/fhem/FHEM/46_TRX_LIGHT.pm
+++ b/fhem/FHEM/46_TRX_LIGHT.pm
@@ -159,7 +159,7 @@ TRX_LIGHT_Initialize($)
   $hash->{DefFn}     = "TRX_LIGHT_Define";
   $hash->{UndefFn}   = "TRX_LIGHT_Undef";
   $hash->{ParseFn}   = "TRX_LIGHT_Parse";
-  $hash->{AttrList}  = "IODev ignore:1,0 do_not_notify:1,0 ".
+  $hash->{AttrList}  = "IODev ignore:1,0 do_not_notify:1,0 repeat ".
                         $readingFnAttributes;

}
@@ -509,7 +509,9 @@ TRX_LIGHT_Set($@)
        return "No set implemented for $device_type . Unknown protocol type";   
   }

-  IOWrite($hash, $hex_prefix, $hex_command);
+  for (my $repeat = $attr{$name}{repeat} || 1; $repeat >= 1; $repeat = $repeat - 1) {
+    IOWrite($hash, $hex_prefix, $hex_command);
+  }

   my $tn = TimeNow();
   $hash->{CHANGED}[0] = $command_state;


dero

ext23

Moin,

nicht schlecht, nimmt Willi das mit auf, haste schon mal gefragt?

Gruß
Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

dero

Hey Willi,

Würdest du bitte den Patch mergen?

Danke!

Dero

Willi

Danke für den Patch.  8)

Habe ich soeben ins SVN gepackt.
FHEM@Q600(debian) mit DS9490R (1Wire) | FHEM@Sheevaplug(debian) mit RFXCOM-Receiver(80002), CULv3 & USB-WDE1 | FHEM@odroid mit CULv2 & RFXtrx433

Timmy.m

Spitze, vielen Dank. Das ist eine echte Bereicherung!
Bisher habe ich mit Sleep die gleichen Kommandos mehrfach gesendet.
Grüße Tim
FHEM5.9@RaspPi.3B|HMLAN|CUL868V3|1Wire|HUE|FritzBox|BotVacDconnected|3xKindleDisplay|
FHEM2FHEM|
FHEM5.9@RaspPi.2B|nanoCul868|TCM310|JeeLinkClone|RFXTRX433E|ZWave|Zigbee|xiaomi
RaspberryMatic@RaspPi.3B+ in Planung

ext23

Auf jeden Fall, echt Klasse! Das fehlt mir jetzt noch für FS20 ;-) Da habe ich auch eine Dose die immer nicht so recht schalten möchte.

/Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

Markus M.

Aktuell weder Smarthome noch FHEM vorhanden

Willi

#7
Ja, habe ich nicht gesehen.

Was ist an dieser Lösung besser als an der jetzt eingebauten? Evtl. macht es ja auch Sinn beide Lösungen eingebaut zu haben. Wenn Du das so siehst, poste doch bitte das Diff. Danke!
FHEM@Q600(debian) mit DS9490R (1Wire) | FHEM@Sheevaplug(debian) mit RFXCOM-Receiver(80002), CULv3 & USB-WDE1 | FHEM@odroid mit CULv2 & RFXtrx433

Markus M.

War im Prinzip die gleiche Lösung.
Die Unterschiede sind im Attributnamen ITrepetition (weil es den im InterTechno Modul genau so bereits gibt), der Art wie die Wiederholungen gezählt werden (1 = 1 Wiederholung = 2x Senden, wie bei IT) und dass ich die Wiederholungen im Attribut und Code auf max. 9 beschränkt habe.
Wenn ich mir das nochmal genauer ansehe, gefällt mir meins doch ein klein wenig besser. Eigentlich sehr viel besser :)

Code (DIFF) Auswählen
Index: FHEM/46_TRX_LIGHT.pm
===================================================================
--- FHEM/46_TRX_LIGHT.pm (revision 10674)
+++ FHEM/46_TRX_LIGHT.pm (working copy)
@@ -159,7 +159,7 @@
   $hash->{DefFn}     = "TRX_LIGHT_Define";
   $hash->{UndefFn}   = "TRX_LIGHT_Undef";
   $hash->{ParseFn}   = "TRX_LIGHT_Parse";
-  $hash->{AttrList}  = "IODev ignore:1,0 do_not_notify:1,0 repeat ".
+  $hash->{AttrList}  = "IODev ignore:1,0 do_not_notify:1,0 ITrepetition:0,1,2,3,4,5,6,7,8,9 ".
                         $readingFnAttributes;

}
@@ -509,10 +509,15 @@
return "No set implemented for $device_type . Unknown protocol type";
   }

-  for (my $repeat = $attr{$name}{repeat} || 1; $repeat >= 1; $repeat = $repeat - 1) {
     IOWrite($hash, $hex_prefix, $hex_command);
-  }

+  if (defined($attr{$name}{ITrepetition}) ) {
+    my $repetition = int($attr{$name}{ITrepetition});
+    $repetition = 9 if($repetition > 9);
+    for (my $i = 0; $i < $repetition; $i += 1) {
+      IOWrite($hash, $hex_prefix, $hex_command);
+  } }
+
   my $tn = TimeNow();
   $hash->{CHANGED}[0] = $command_state;
   $hash->{STATE} = $command_state;
@@ -1133,6 +1138,7 @@
   <a name="TRX_LIGHTattr"></a>
   <b>Attributes</b>
   <ul>
+    <li><a href="#ITrepetition">ITrepetition</a></li>
     <li><a href="#ignore">ignore</a></li>
     <li><a href="#do_not_notify">do_not_notify</a></li>
     <li><a href="#readingFnAttributes">readingFnAttributes</a></li>


Gruss, Markus
Aktuell weder Smarthome noch FHEM vorhanden

ext23

Na Hauptsache es geht am Ende und ist Code sparend. Und bitte den Attribut Namen behalten, unter ITrepetitititit kann sich ja keine Sau was drunter vorstellen ;-) Meinetwegen noch TX_Repeat oder HF_Repeat oder sowas in der Art.

/Daniel
HM, KNX, FS20, 1-Wire, PanStamp, AVR-NET-IO, EM1000EM, PCA301, EC3000, HM-LAN, CUL868, RFXtrx433, LGW, DMX @Ubuntu-Server (Hauptsystem) & Raspberry Pi (Satellit)

Markus M.

Zitat von: ext23 am 31 Januar 2016, 14:15:35
Na Hauptsache es geht am Ende und ist Code sparend.
Eben deswegen würde ich stattdessen gerne meine Implementierung im offiziellen Modul sehen.
Der Standard-Fall wird in 99% der Fälle der sein, dass das Attribut nicht existiert. Dann wird mit meiner Lösung lediglich defined($attr{$name}{ITrepetition}) zusätzlich ausgeführt und keine Schleife mit Variablenzuweisung etc. aufgemacht.

Willi, möchtest du das vielleicht noch dahingehend ändern?
Die Doku müsste aber dementsprechend angepasst werden da repeat=1 dann insgesamt 2x Senden bedeutet.
Was aber auch Sinn macht, denn 0 Wiederholungen ist der Normalfall.

ZitatUnd bitte den Attribut Namen behalten, unter ITrepetitititit kann sich ja keine Sau was drunter vorstellen ;-) Meinetwegen noch TX_Repeat oder HF_Repeat oder sowas in der Art.
Es geht mir nicht um einen schönen Namen sondern darum dass es das funktionell (fast) identische Attribut ITrepetition in einem anderen Modul bereits gibt.
Ist jetzt für eine Änderung aber meiner Meinung nach eh zu spät.
Aktuell weder Smarthome noch FHEM vorhanden

Willi

Ich überlege mir mal wie man beide Methoden in einem Code und einer Schleife implementieren kann und melde mich dann. Ich bin dafür beide Anweisungen zu unterstützen, aber natürlich nicht zwei Schleifen zu implementieren.
FHEM@Q600(debian) mit DS9490R (1Wire) | FHEM@Sheevaplug(debian) mit RFXCOM-Receiver(80002), CULv3 & USB-WDE1 | FHEM@odroid mit CULv2 & RFXtrx433

Markus M.

#12
Das Attribut brauche ich nicht mehr, hab meine Definitionen bereits geändert.
Nur der Code sollte meiner Meinung nach so aussehen:

  $hash->{AttrList}  = "IODev ignore:1,0 do_not_notify:1,0 repeat:1,2,3,4,5 ".
                        $readingFnAttributes;


  IOWrite($hash, $hex_prefix, $hex_command);

  if (defined($attr{$name}{repeat}) ) {
    for (my $repeat = $attr{$name}{repeat}>5?5:$attr{$name}{repeat}; $repeat > 0; $repeat = $repeat - 1) {
      IOWrite($hash, $hex_prefix, $hex_command);
    }
  }


Das minimiert für den Standardfall den Impact und verhindert sinnfreies Dauersenden.

Viele Grüsse, Markus
Aktuell weder Smarthome noch FHEM vorhanden

dero

#13
Hauptsache, wir haben die Funktionalität upstream ;)

Ich hatte auch überlegt, ob repeat=1 1x oder 2x senden sollte. Gibt's vielleicht nen besseren Namen?


Willi

Danke für die Rückmeldungen. Bin das Wochenende unterwegs und schaue mir das näher nächste Woche an.
FHEM@Q600(debian) mit DS9490R (1Wire) | FHEM@Sheevaplug(debian) mit RFXCOM-Receiver(80002), CULv3 & USB-WDE1 | FHEM@odroid mit CULv2 & RFXtrx433