longpollSVG und logproxy oder DBLog

Begonnen von nccfast, 19 August 2015, 12:40:59

Vorheriges Thema - Nächstes Thema

nccfast

Ich benutze zum plotten SVG und logproxy. Meine Daten sind in iner mysql DB.
Ich hätte gerne, dass sich die Graphen von selbst refreshen, sobald ein neuer Messwert dazukommt.

In der Commandref steht aber, dass das longpollSVG nur mit Filelogs funktioniert.
Heisst das also, dass, wenn man zum Plotten die DB benutzt, das longpollSVG nicht geht? Wenn ja, ist es geplant, das zu ändern?

rudolfkoenig

Ich plane das nicht, aber wenn jemand mir dafuer ein Patch schickt, baue ich das gerne ein.
Es geht darum, das flog Attribut im <svg> Tag korrekt zu setzen, diese muss ein Regexp aller Events beinhalten, die ein reload ausloesen sollten.

nccfast

#2
habe mal bei mir in der 98_SVG.pm ungefär bei Zeile 1288 folgendes ersetzt:

  $filter =~ s/ [^: ]*:/ /g;
  $filter =~ s/:[^ ]* / /g;
  $filter =~ s/(^ | $)//g;
  $filter =~ s/ /|/g;
  $filter =~ s/"/./g;


durch


  if (index($filter, " DbLog:") >= 0) #logproxy
  {
    $filter =~ s/ [^: ]*:/ /g;
    $filter =~ s/ [^: ]*:/ /g;
    $filter =~ s/:[^ ]* / /g;
    $filter =~ s/(^ | $)//g;
    $filter =~ s/ /|/g;
    $filter =~ s/"/./g;
  }
  else #Filelog
  {
    $filter =~ s/ [^: ]*:/ /g;
    $filter =~ s/:[^ ]* / /g;
    $filter =~ s/(^ | $)//g;
    $filter =~ s/ /|/g;
    $filter =~ s/"/./g;
  }
 
 


Dadurch werden bei mir meine mit logproxy erstellten Plots aktualisiert, weil im flog-Attribut nun die entprechenden Devices stehen.
Für DBLog pur hab ich noch keine Lösung.

Ausserdem habe ich in der svg.js in der Funktion FW_svgUpdateDevs in Zeile ca. 363 das "break" rausgemacht, da sonst nur der erste plot des Devices aktualisiert wird.



rudolfkoenig

Dein Patch samt Kommentar ist verwirrend:
- du redest von logproxy, im Code wird auf DbLog geprueft.
- die Aenderung kopiert den vorhandenen Abschnitt fuer DbLog, und dupliziert da die erste Zeile, was mAn unter dem Strich keine Aenderung bewirkt.

nccfast

Filelog-Zeile sieht so aus:
4:TH_Wohnzimmer.T\x3a:: 6:TH_Wohnzimmer.T\x3a::

logproxy sieht so aus:
DbLog:logdb:TH_Wohnzimmer:temperature:0:

Die besagte erste Zeile
$filter =~ s/ [^: ]*:/ /g;
ersetzt beim Filelog den String " 4:" durch " ".
Beim logproxy " DbLog:" durch " ". Ich möchte aber nochmal dasselbe drauf anwenden, damit auch " logdb:" ersetzt wird, das ja nach dem ersten Aufruf  am Anfang im filter steht.

Ich prüfe auf DBLog, um rauszufinden, dass es sich um ein logproxy gplot file handelt. Wenn es schönere Prüfungen an dieser stelle gibt, gerne.



rudolfkoenig

Zitatlogproxy sieht so aus:
DbLog:logdb:TH_Wohnzimmer:temperature:0:

Es sei denn die logproxy Quelle ist kein DbLog, sondern FileLog oder ein logProxy built-In. Ich habe hier mal $filter fuer die SVGs aus fhem.cfg.demo als >$filter< ausgegeben (2xlogProxy, 2xFileLog):
> Func:logProxy_Func2Plot($from,$to,'{logProxy_hms2dec(sunrise_abs_dat($sec))}') Func:logProxy_Func2Plot($from,$to,'{logProxy_hms2dec(sunset_abs_dat($sec))}') ConstX:TimeNow(),4,10 <
> Polar::[11,15,21,14,16] Polar::[11,15,21,14,16] Polar::[14,16,23,24,21] Polar::["Livingroom","Bath","Children","Kitchen","Floor"] <
> 4:Cellar.dewpoint\x3a:10: 4:Garden.dewpoint\x3a:10: <
> 4:Garden.T\x3a:15: 10:Garden.T\x3a:0:delta-h 10:Garden.T\x3a:0:delta-d 4:predicted.*:15: <


Das hier genannte Patch wuerde mit diesen Werten nicht funktionieren.
Ich will dein Patch nicht verhindern, aber auch nicht mit falschen Kommentaren versehen.
Am liebsten waere, wenn andre (als logProxy Author) was dazu sagen koennte.

nccfast

Da hast du recht. Es war nur ein erster Schuss. Irgendwie muss man erkennen, ob es sich um logproxy, DBlog oder Filelog handelt. Abhängig davon dann die Variable $filter auf die Devices/Readings verodert reduzieren.
Andre, kannst du was anbieten?

justme1968

ich glaube den filter nachträglich aus $srcDesc->{all} zu extrahieren funktioniert nicht wenn dbLog und logProxy noch mit berücksichtigt werden sollen. erst recht nicht da in einem plotfile auch alle drei Quellen gemischt sein können.

ich würde vorschlagen in jeder möglichen log quelle eine funktion vorzusehen der zur  devspec zeile jeweils den dazu gehörenden filter teil liefert.

dann steckt die 'intelligenz' jeweils dezentral in dem modul das dafür zuständig ist.

logProxy wurde für fileLog und dbLog die anfrage jeweils weiterleiten und für die logProxy eigenen plot typen müssen wir dann schauen ob es hier auch welche gibt bei denen longpollSVG sinnvoll ist.

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

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

nccfast

das klingt doch sehr gut.
Wer kann das umsetzten?

rudolfkoenig

Da ich fuer SVG und FileLog zustaendig bin, habe ich erstmal den schwarzen Peter.
Die Aufgabe ist auf der TODO-Liste, Prio unklar :)

rudolfkoenig

Habe die Umwandlung in Regexp ausgelagert in das Modul-Eigene SVG_regexpFn.
Parameter: Quell-Instanz-Name, und alle FileLog-Parameter, die diese Instanz betreffen.

justme1968

#11
@nccfast: ich kann es gerade nicht selber testen. aber wenn du lust hast kannst du mal folgendes probieren:

in 98_logProxy.pm in logProxy_Initialize diese zeile einfügen:$hash->{SVG_regexpFn}     = "logProxy_regexpFn";und diese sub einbauen:sub 
logProxy_regexpFn($$)
{   
  my ($name, $filter) = @_;
         
  my $ret;
         
  my @a = split( ' ', $filter );
  for(my $i = 0; $i < int(@a); $i++) {
    my @fld = split(":", $a[$i]);
    if( $a[$i] =~ m/^(FileLog|DbLog):([^:]*):(.*)/ ) {
      my @options = split( ',', $fld[1] );
      my $log_dev = shift(@options);
      my $column_specs = $3;
         
      $ret .= '|' if( $ret );
      $ret .=  CallFn($log_dev, "SVG_regexpFn", $log_dev, $column_specs);
    }   
  }   
         
  return $ret;
}


damit sollte die logProxy seite erst mal erledigt sein.

für dblog braucht es in 93_DbLog.pm in DbLog_Initialize: $hash->{SVG_regexpFn}     = "DbLog_regexpFn"

und dann eine sub in der art:sub                             
DbLog_regexpFn($$)               
{                               
  my ($name, $filter) = @_;     
                                 
  my $ret;                       
                                 
  my @a = split( ' ', $filter );
  for(my $i = 0; $i < int(@a); $i++) {
    my @fld = split(":", $a[$i]);
                                 
    $ret .= '|' if( $ret );     
    $ret .=  $fld[0] .'.'. $fld[1];
  }                             
                                 
  return $ret;                   
}
hue, tradfri, alexa-fhem, homebridge-fhem, LightScene, readingsGroup, ...

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

nccfast

Habs getestet für logproxy.
Hab ein Update gemacht, um neue 98_SVG.pm zu bekommen.
Hab alle Änderungen eingebaut in 98_logProxy.pm und 93_DbLog.pm

Ging dann erst mal nicht.

Hab dann die zeile
$ret .= ' ' if( $ret );
geändert zu
$ret .= '|' if( $ret );

Nun gehts.

Was ist mit :
ZitatAusserdem habe ich in der svg.js in der Funktion FW_svgUpdateDevs in Zeile ca. 363 das "break" rausgemacht, da sonst nur der erste plot des Devices aktualisiert wird.
Ist das ein Schmarrn von mir?


frank

FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

rudolfkoenig

@nccfast: ich vermute ja, da die Schleife ueber die Plots die aeussere ist. Die Innere prueft nur, ob Bedingungen fuer ein Reload existieren, dafuer reicht eine.

@frank: geantwortet im verlinkten Thread.