Hauptmenü

Buffering für CUL

Begonnen von Peedy, 28 Januar 2013, 09:00:30

Vorheriges Thema - Nächstes Thema

Peedy

Hallo,

> Du bist wirklich zaeh :)
... sagt meine Frau auch immer zu mir ... ;-)

>Siehe auch FHEM/11_FHT.pm/doSoftBuffer().
hab ich schon entdeckt. Trotzdem Danke.

Ich werd sicher demnächst ein paar Versuche machen (auch mit eigener, ausgelagerter Routine).
Dann lass ich nochmal was von mir hören.

Bis denne ... Peedy

Dietmar63

Hast du in diesem Zusammenhang etwas fertig gestellt?
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

Hallo Rudi,

ich habe das Modul Heating_Control geschrieben und wie nicht anders zu erwarten, bekommen wir bei umfangreichen Installationen mit vielen FHT(Gunther) LOVF.
Link

Ich habe diesen Thread gelesen und anschließen aus Neugier "Buffering für CUL" in
11_FHT und 00_CUL eingebaut, so wie es hier im Thread und in anderen Threads für MAX beschrieben wurde.

Ich habe komplett softbuffering für fht-Befehle gewählt, so dass ich immer zunächst den Puffer untersuche,
ob sich schon ein Befehl darin befindet, wenn nicht wird das verfügbar credit geprüft und mit dem Attribut "FHT_necessaryCredit" verglichen. Nur dann wird der FHT-Befehl an das CUL übergeben und 120 Sekunden gewartet wenn im Softbuffer noch weitere Befehle warten.
Nebenbei überschreiben neuere desired-temp Kommandos ältere. So werden viele Befehlsübermittlungen eingespart, wenn Anwender verzweifelt immer neue desired-temps absetzen.

Bei mir läuft das Ganze problemlos - ich habe aber auch nur 2 FHT.
Gunter hat derer 12 und wird bei sich einen Test durchführen.

Darf ich diese Änderung dann einfach einchecken oder wie handhabt ihr das.
Ich habe gesehen, dass du und Martin diese beiden Module geändert habt.

Code in fht:

    $io->{SOFTBUFFER}{$key} = \%h;
    if($io->{TYPE} eq "CUL") {
       doSoftBufferCUL($io);
    } else {
       doSoftBuffer($io);
    }

...
#####################################
# Check the softwarebuffer and send/resend commands
sub
doSoftBufferCUL($)
{
  my ($io) = @_;

  my $necessaryCredit = AttrVal($io->{NAME}, "FHT_necessaryCredit", 850);
  my $ll              = GetLogLevel($io->{NAME},5);
  my $now             = gettimeofday();
  my $waitTime        = 0;

  # a second command of "desire-temp" overrides a previous one
  my %doppelt  = ();
  foreach my $key (keys %{ $io->{SOFTBUFFER} }) {
     my $h    = $io->{SOFTBUFFER}{$key};
     my $name = $h->{HASH}->{NAME};
     my $cmd  = $h->{CMD};

     if ($cmd =~ /^desired-temp.*/) {
        if (defined( $doppelt{$name}{DESIRED})) {
            my $dkey = $doppelt{$name}{DESIRED};
            Log 2, "FHT_CUL_SendQueueHandler: New $cmd for $name overrides old value in softbuffer!";
            delete($io->{SOFTBUFFER}{$dkey});
        }
        $doppelt{$name}{DESIRED} = $key;
     }
  }

  # is still a command in the buffer
  my ($buffer) = (CommandGet("","$io->{NAME} raw T02") =~ /[^ ]* [^ ]* => (.*)/);
  $waitTime = 30 if ($buffer ne "N/A");

  # check enought credit to avoid LOVF
  if ($waitTime==0) {
      my ($credit10ms) = (CommandGet("","$io->{NAME} credit10ms") =~ /[^ ]* [^ ]* => (.*)/);

      $waitTime = ($necessaryCredit - $credit10ms);
      $waitTime  = 0 if ($waitTime < 0);
      $waitTime += 5 if ($waitTime > 0);   # five credits more, to be sure to have enought credits after wakeup
      if ($waitTime > 0) {
         Log 2, "FHT_CUL_SendQueueHandler: Not enough credit! credit10ms is $credit10ms, but we need $necessaryCredit. Waiting $waitTime seconds.";
      }
  }

  # put first command from softbuffer into CUL buffer
  if ($waitTime==0) {
    foreach my $key (sort keys %{ $io->{SOFTBUFFER} }) {

       my $h    = $io->{SOFTBUFFER}{$key};
       my $name = $h->{HASH}->{NAME};

       IOWrite($h->{HASH}, "04", $h->{ARG});
       Log GetLogLevel($name,2), "FHT set $name $h->{CMD}";

       delete($io->{SOFTBUFFER}{$key});
       $waitTime = 120;                # next command in 115 + 0.5*(last fhtid-nibble 5 Sek.) Sekunden
       last;
    }
  }

  if(keys (%{$io->{SOFTBUFFER}}) && !$io->{SOFTBUFFERTIMER}) {
    $io->{SOFTBUFFERTIMER} = 1;
    InternalTimer($now+$waitTime, "softBufferTimer", $io, 0);
  }
}


 
 
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

rudolfkoenig

Hallo Dietmar, ich habe Probleme mit Deinem Patch:
1. das "alte" doSoftBuffer hat bereits CUL spezifisches Code.
2. auch Dein Code wuerde nur dann funktionieren, wenn beim CUL das Attribut fhtsoftbuffer aktivierbar waere, das ist aber nicht.

>  Darf ich diese Änderung dann einfach einchecken ...

Lieber nicht. Ich moechte die erwaehnten Widersprueche vorher noch klaeren.

Dietmar63

@Rudi:

Hallo Dietmar, ich habe Probleme mit Deinem Patch:
 1. das "alte" doSoftBuffer hat bereits CUL spezifisches Code.

ist im Falle eines CUL nicht aktiv - hast du selbst geschrieben, weiter oben in diesem Thread. Grund war wohl, dass cul und fhz anders funktionieren. Cul versucht immer wieder zu senden und die alte Logik vom fhz hat lt. deiner Aussage mehr Probleme erzeugt als gelöst. Ich sende deshalb immer nur einen Befehl in den Puffer des CUL, warte 120 Sekunden undn sende den nächsten Befehl. Es  wird also alles im FHEM gepuffert.

 2. auch Dein Code wuerde nur dann funktionieren, wenn beim CUL das Attribut fhtsoftbuffer aktivierbar waere, das ist aber nicht.

00_CUL.pm habe ich auch angepasst - dort ist es nicht viel. Ich habe auf die Veröffentlichhung hier verzichtet.

FHT_necessaryCredit habe ich zusätzlich als Attribut aufgenommen.

define CUL_0 CUL              /dev/ttyACM0@96 1234
attr   CUL_0                  fhtsoftbuffer 1
attr   CUL_0                  FHT_necessaryCredit 800



 > Darf ich diese Änderung dann einfach einchecken ...

 Lieber nicht. Ich moechte die erwaehnten Widersprueche vorher noch klaeren.

ich hoffe ich konnte die Widersprüche aufklären.
Mit Gunther bin ich noch in der Testphase - er hat 12 fht und noch andere Dinge, die traffic erzeugen.
Die Test haben aus meiner Sicht jetzt aufgedeckt, dass bei ihm viel traffic erzeugt wird, wir aber nicht erkennen können woher der traffic kommt - kann man den traffic irgendwie ins log loggen?


Link

Einchecken werde ich erst dann wenn wir Gunthers Problem gelöst haben.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

Dietmar63

Gib mir bitte eine kurze Antwort wenn du mit meiner Erklärung einverstanden bist und ob ich dann ggf. einchecken kann.
http://forum.fhem.de/index.php?t=msg&goto=72967&rid=405#msg_72967
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

rudolfkoenig

Ich will es einchecken, aber ich muss es vorher testen/verstehen, und dazu brauche ich mehr Freizeit am Stueck.

Dietmar63

Wenn es fertig ist kann ich dir die fertige Version der beiden Module geben.
Ich kann es aber auch selbst machen.
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm

rudolfkoenig

>  Wenn es fertig ist kann ich dir die fertige Version der beiden Module geben.

Ich dachte die Patches unten sind komplett.


> Ich kann es aber auch selbst machen.

Ich moechte Aenderungen fuer FHT selbst einchecken. Ich will langsam einfuehren, dass fuer einzelne Module genau ein Author zustaendig ist (und das am besten mit SVN erzwingen). Ich habe auch kein Problem Module abzugeben (siehe CUL_HM oder EnOcean), aber dann komplett.

Dietmar63

ok - ich werde dir dann wenn es ok ist, die Änderung als Patch schicken.

Ich bin inzwischen der Meinung, dass die Änderung vielleicht nicht ganz so wichtig ist.
Gunthers Problem mit den FHT gehen vermutlich aus der Mengean FHT, die er betreibt und derer teilweise schlechten Signalstaerken (3 unter -85) zurück.

Den Codeauszug hatte ich zur Verdeutlichung geschickt, damit du beurteilen kannst, ob meine Gedankengänge und Lösungen in Ordnung sind.

Das einchecken hätte ich dann selbst erledigen können.

ZitatIch moechte Aenderungen fuer FHT selbst einchecken. Ich will langsam einfuehren, dass fuer einzelne Module genau ein Author zustaendig ist (und das am besten mit SVN erzwingen). Ich habe auch kein Problem Module abzugeben (siehe CUL_HM oder EnOcean), aber dann komplett.

Ist dann schwierig, wenn bei Änderungen mehr als ein Modul geändert werden muss.

Gibt es denn schon eine Liste mit Modulverantwortlichen?
Gruß Dietmar
FB7390, CUL, 2 FHT, FS20
modules: 98_WOL.pm, 98_Heating_Control.pm,   98_WeekdayTimer.pm, 98_RandomTimer.pm, 59_Twilight.pm