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?
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.
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.
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.
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.
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.
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?
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
das klingt doch sehr gut.
Wer kann das umsetzten?
Da ich fuer SVG und FileLog zustaendig bin, habe ich erstmal den schwarzen Peter.
Die Aufgabe ist auf der TODO-Liste, Prio unklar :)
Habe die Umwandlung in Regexp ausgelagert in das Modul-Eigene SVG_regexpFn.
Parameter: Quell-Instanz-Name, und alle FileLog-Parameter, die diese Instanz betreffen.
@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;
}
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?
mit dieser erweiterung kommt mein fhem nicht zurecht.
http://forum.fhem.de/index.php/topic,40293.0.html (http://forum.fhem.de/index.php/topic,40293.0.html)
@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.
hast du die zeile in logProxy oder in DbLog geändert? oder in beiden?
gruss
andre
in beiden
im logproxy allein reichte nicht
dblog allein hab ich nicht getestet
Edit:
Habs nochmal getestet
für log proxy reichts, wenn es nur im logproxy geändert wird. Nur im DBLog funktioniert hier nicht bei mir.
Für DBLog weiss ich es nicht mangels testumgebung
Zitat
@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.
Stimmt
Bitte mal testen.....
Edit: update, ein Semikolon hat gefehlt....
Ist es getestet?
Solange ich keine Rückmeldung bekomme das das Modul wie erwartet funktioniert, checke ich es nicht ein.....
Habs eingecheckt, scheint bei mir mit DbLog und longpollSVG zu funktionieren.
@Rudi, Nicht unbedingt notwendig allerdings könntest du bei Gelegenheit die fhemweb commandref zu longpollSVG anpassen damit die DbLog Kompatibilität erwähnt wird.
Gruß
Claudiu
Da dieser Abschnitt FileLog spezifisch ist, und ich nicht genau weiss, ob/was man im DbLog/logProxy tun muss, haette ich gerne eine Erklaerung. Oder Patch.
Was "genau" zutun ist kann ich nicht sagen,
Tobias bat mich nur das Ganze bei Gelegenheit in DbLog einzubauen, selber verwenden tut er (und ich) es nicht.
Zum Testen bei mir hat es allerdings gereicht das Attribut longpollSVG auf 1 zu setzen.
Anschließend hat es wie erwartet, ohne weitere Anpassungen, mit DbLog funktioniert.
logProxy reicht zur zeit nur 1:1 nach fileLog und dbLog durch.
Hab die Doku leicht geaendert, wer es verbessern will, soll sich melden.