Wert aus Logdatei anzeigen lassen

Begonnen von inter#79, 03 Dezember 2016, 16:28:41

Vorheriges Thema - Nächstes Thema

inter#79

Hallo,

leider habe ich nicht die passende Antwort/Lösung im Netz gefunden. Ich habe eine Logdatei mit folgendem Inhalt:

2016-12-03_09:46:00 E: 12342.970070 28271.910000 0.000000 1800.000000 3


Die beiden hohen Werte (Spalte 3 und 4) möchte ich in Fhem als Zahl angezeigt bekommen. Mit dem get testfile - - 2016-12-03_09:46:00 2016-12-03_09:46:01 wird mir die Zeile ausgelesen und in einem sparraten Fenster angezeigt.

Jedoch möchte ich in einem Raum die beiden Werte direkt sehen können.

Bin ich mit get auf dem richtigen Weg? Wie kann ich einen solchen Wert visualisieren?



hartenthaler

Ich denke, dass Du genau auf dem richtigen Weg bist.

Ich habe gerade zufällig im wiki folgende Funktion gefunden, die einen gleitenden Durchschnitt aus Werten in einem Logfile berechnet.

sub
myAverage($$$)
{
my ($offset,$logfile,$cspec) = @_;
my $period_s = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime(time-$offset);
my $period_e = strftime "%Y-%m-%d\x5f%H:%M:%S", localtime;
my $oll = $attr{global}{verbose};
$attr{global}{verbose} = 0;
my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec"));
$attr{global}{verbose} = $oll;
my ($cnt, $cum, $avg) = (0)x3;
foreach (@logdata){
  my @line = split(" ", $_);
  if(defined $line[1] && "$line[1]" ne ""){
   $cnt += 1;
   $cum += $line[1];
  }
}
if("$cnt" > 0){$avg = sprintf("%0.1f", $cum/$cnt)};
Log 4, ("myAverage: File: $logfile, Field: $cspec, Period: $period_s bis $period_e, Count: $cnt, Cum: $cum, Average: $avg");
return $avg;
}


Die zentrale Zeile ist
my @logdata = split("\n", fhem("get $logfile - - $period_s $period_e $cspec"));

Also kannst Du es genau so machen und eine Funktion erstellen, die Du in einem dummy Device mit einem attr userReading mit dieser Funktion aufrufst um das Reading entsprechend zu setzen.
fhem 5.8 auf RaspberryPi 3 mit HMLAN und CCU2, ZWave, JeeLink, FHZ1000 für FS20, HMS, Fritz!Box, Fritz!DECT200, Harmony, Sonos, hue, netatmo, SSCam, Wetter- und Verkehrsmodule, Chat-Bot mit RiveScript/Telegram, IFTTT, pushover, ...

rudolfkoenig

Das Problem ist nicht exakt beschrieben, deswegen muss ich raten, und viele Unbekannten durchgehen, was aufwendig ist.

ZitatBin ich mit get auf dem richtigen Weg?
Soweit ich das vestehe, nein. Ich gehe davon aus, dass der Wert per FileLog in die Datei kam, das bedeutet aber, dass es vorher als Event zur Verfuegung stand, evtl. auch als Reading. Falls Reading existiert, dann kann man es mit userReadings so umformatieren, dass nur die gewuenschten Zahlen enthalten sind.

Falls die Daten nicht von FHEM generiert werden, dann ist es "gesuender" mit dem Programm, was diese Daten erstellt, in fhem ein Event zu generieren (trigger XXX), womit wir bei den vorherigen Punkt waeren.

ZitatWie kann ich einen solchen Wert visualisieren?
Was ist damit gemeint? Als Zahl alleinstehend anzeigen kann man in FHEMWEB. z.Bsp. mit stateFormat oder readingsGroup. Zu den anderen Frontends muss man die entsprechenden Maintainer fragen. Um einen zeitlichen Verlauf zu generieren braucht man das vorher beschriebene gar nicht, SVG kann die Daten direkt aus der FileLog-Datei lesen. Im FileLog Detailfenster gibt es ein "Create SVG plot" Link dafuer.

inter#79

Hallo,

bin noch nicht weitergekommen.
Habe nun veruscht nur die letzte Zeile auszulesen, aber auch hier scheitere ich gerade

get  test_log - - strftime("%Y-%m-%d_00:00:00") strftime("%Y-%m-%d_12:00:00")

Wie kann ich die Uhrzeit einschränken?

Optimal wäre folgendes:
get  test_log - - strftime("%Y-%m-%d_%H:(%M-1):%S") strftime("%Y-%m-%d_%H:%M:%S")

Also vor allem die Startzeit sollte ja eine Minute zurückliegen, deshalb das %M-1, was aber sich so einfach nicht realisieren lässt.

Die Logdatei wird nicht von Fhem erzeugt, sondern lediglich bereits im Plot dargestellt.

Aber ich möchte ja die Werte auch nummerisch in einem "Dummy" oder Variable angezeigt bekommen.

Wohin schreibt man den Code, den Kollege Hartenthaler abgebildet hat? in die cfg?