FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: sokkederheld am 29 Juli 2015, 12:48:53

Titel: FileLog/get - letzten Eintrag auslesen
Beitrag von: sokkederheld am 29 Juli 2015, 12:48:53
Ich habe ein Logfile, das extern mit Werten im fhem-Logfileformat befüllt wird. Es kommt genau alle 5 Minuten ein Eintrag hinzu (von einem Stromzähler).

Ich habe das Logfile als FileLog eingebunden und plotte es als SVG. Das ist jedoch begrenzt hilfreich, da man bei einem Stromzähler ja eher den Tagesverbrauch etc. als Balken visualisieren will und nicht den Zählerstand als Kurve.

Also möchte ich den externen Wert in einen Dummy übertragen, so dass ich damit rechnen kann. Dazu würde ich gern die get-Methode vom FileLog verwenden.

also ungefähr so:

get stromTagLog - - {vor 5 minuten} {jetzt}

Hierzu habe ich zwei Fragen:

Danke schonmal für jegliche Hilfe!
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: Otto123 am 29 Juli 2015, 13:09:50
Schau mal hier  (http://forum.fhem.de/index.php/topic,38948.msg310965.html#msg310965)
Vielleicht hilft das ...
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: sokkederheld am 29 Juli 2015, 13:25:54
Ja, ich könnte natürlich versuchen linux-seitig ein Logfile zu erzeugen in dem nur ein Wert steht. Dann könnte ich das aber wiederum nicht plotten. Ich würde schon gern auf fhem-Ebene den Wert einlesen und dazu wäre wie gesagt eine Funktion sehr hilfreich, um den aktuellen sowie den "vor 5 Minuten" Zeitstempel zu erzeugen. Es wäre sehr toll wenn mir ein Perl-erfahrener Mensch da zur Hilfe eilte!  ::) *hoff*
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: sokkederheld am 29 Juli 2015, 14:04:30
So, ich will mir ja nicht nachsagen lassen dass ich es nicht auch selbst versuche. Das ist mein aktueller Stand des Herumprobierens:

fhem> get stromTagLog - - { strftime "%Y-%m-%d_%H:%M:%S", localtime - 5; } { strftime "%Y-%m-%d_%H:%M:%S", localtime; }
{ %S",
#"%Y-%m-%d_%H:%M:%S",
2015-07-29_13:59:15 394716.0
#localtime
2015-07-29_13:59:15 394716.0
#-
#5

Unknown command }, try help.
Unknown command }, try help.


Das ganz oben ist der Befehl. Wie man sieht, schluckt fhem ihn nicht, ehrlich gesagt verstehe ich die Ausgabe kaum...

(OT: Es ist echt immer wieder erstaunlich wie bescheuert man sich anstellt, wenn man eine neue Programmiersprache/Umgebung kennenzulernen versucht und deren Paradigmen nicht kapiert hat...  :-[)
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: Hans Franz am 29 Juli 2015, 14:15:09
Hallo,
Lass die Semikola hinter localtime weg.

Gruss
Hans

Edith:
Und so
{ strftime "%Y-%m-%d_%H:%M:%S", localtime time- 5*60 }
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: sokkederheld am 29 Juli 2015, 15:44:24
Hm, er meldet zwar keinen Syntaxfehler, aber mit der Ausgabe kann ich nicht so richtig was anfangen. Das hier passiert:

Eingabe:
get stromTagLog - - { strftime "%Y-%m-%d_%H:%M:%S", localtime time- 5*60} { strftime "%Y-%m-%d_%H:%M:%S", localtime time } 3:stromZaehlerTag:0:int

Ausgabe:
{ %S",
#"%Y-%m-%d_%H:%M:%S",
2015-07-29_13:59:15 394716.0
#localtime
2015-07-29_13:59:15 394716.0
#time-
#5*60}
2015-07-29_13:59:15 394716.0
#{
2015-07-29_13:59:15 394716.0
#strftime
{ %S",
#"%Y-%m-%d_%H:%M:%S",
2015-07-29_13:59:15 394716.0
#localtime
2015-07-29_13:59:15 394716.0
#now
2015-07-29_13:59:15 394716.0
#}
2015-07-29_13:54:15 70069
#3:stromZaehlerTag:0:int


Wenn ich alles richtig gemacht hätte, müsste nach meinem Verständnis ein numerischer Wert herauskommen. Woher diese Zeilen mit der Raute kommen verstehe ich nicht und die Einträge die dazwischen erscheinen sind zwar inhaltlich richtig, aber abgesehen von der Formatierung sind das auch nicht die aktuellsten...

Aber danke, ich bin schon mal einen Schritt weiter jetzt!
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: Hans Franz am 29 Juli 2015, 15:56:00
Scheibenkleister.Hab' mir nur die Teilausdrücke angeschaut.
Evtl. so ähnlich:
{my $a=strftime "%Y-%m-%d_%H:%M:%S", localtime time-5*60;;my $b=strftime "%Y-%m-%d_%H:%M:%S", localtime now;; fhem(" get stromTagLog - - $a $b 3:stromZaehlerTag:0:int")}
Gruss
Hans
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: sokkederheld am 29 Juli 2015, 17:27:18
Ich nähere mich dank deiner Hilfe dem, was ich erreichen will!  :D

Ich habe ein "at" erstellt, das folgendes ausführt:

{my $a=strftime "%Y-%m-%d_%H:%M:%S", localtime time-5*60;;my $b=strftime "%Y-%m-%d_%H:%M:%S", localtime time; fhem("get stromTagLog - - $a $b 3:stromZaehlerTag:0:int")}

Im Haupt-Log erscheint dann periodisch folgendes:
2015.07.29 17:15:40 3: stromValueExtract: 2015-07-29_17:14:15 70076
#3:stromZaehlerTag:0:int


Ich gehe mal davon aus, dass der Zeitstempel am Anfang, die Zahl dahinter (Verbosity level?) und der Name des "at" (stromValueExtract) zum Log gehören. Was anschließend kommt wäre also das "Ergebnis" o.g. Operation und es sieht schon verdammt gut aus. Da steht jetzt nur noch der Zeitstempel und der Zahlenwert aus dem ursprünglichen Logfile.

Allerdings möchte ich den Zeistempel gar nicht haben und verstehe nicht ganz, woher der kommt (ich habe ja angegeben dass ich nur Spalte 3 möchte).

Und diese Extra-Zeile mit der Raute verstehe ich auch nicht.

Schließlich möchte ich dieses Resultat natürlich auch nicht ins Haupt-Log schreiben, sondern in einen Dummy.
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: sokkederheld am 29 Juli 2015, 18:46:31
So, ich glaube ich habe es... wow, ist das ein Okolyt von einem Aufruf für so eine Kleinigkeit.

{my $a=strftime "%Y-%m-%d_%H:%M:%S", localtime time-5*60;;my $b=strftime "%Y-%m-%d_%H:%M:%S", localtime time; my $c = 0; ($c) = split("\n",substr(fhem("get stromTagLog - - $a $b 3:stromZaehlerTag::"),20)); fhem("set stromValueTag $c")}

Eventuell geht es auch einfacher, aber so scheint es tatsächlich zu klappen.
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: inter#79 am 13 Dezember 2016, 17:43:12
Hallo,

stehe vor dem gleichen Problem, aber ich verstehe den Code nicht, und wenn ich diesen abändere und in fhem eingebe, erscheint schon ein Fehler mit my.

{my $a=strftime "%Y-%m-%d_%H:%M:%S", localtime time-5*60;;my $b=strftime "%Y-%m-%d_%H:%M:%S", localtime time; fhem("get test_log - - $a $b 7:::")}

Geb ich diesen Code in Fhem ein?
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: Otto123 am 13 Dezember 2016, 23:40:36
Zitat von: inter#79 am 13 Dezember 2016, 17:43:12
Geb ich diesen Code in Fhem ein?
Hi,

ja aber eben nicht einfach so:
ZitatIch habe ein "at" erstellt, das folgendes ausführt:
War der Originalansatz.  :-X

Gruß Otto
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: inter#79 am 15 Dezember 2016, 16:46:25
Hallo, danke für die Info.

Möchte gerne die Zeile verstehen und wissen ob ich richtig dabei vorgehe, wenn ich den Wert minütlich auslesen will

1.
define Sromzaehler

2.
define Wert_lesen_minute at +*00:01:00 {my $a=strftime "%Y-%m-%d_%H:%M:%S", localtime time-1*60;;my $b=strftime "%Y-%m-%d_%H:%M:%S", localtime time; my $c = 0; ($c) = split("\n",substr(fhem("get test_log - - $a $b 7:::"),20)); fhem("set Stromzaehler $c")}

Wozu steht die 20 hinter substr(fhem("get test_log - - $a $b 7:::"),20))


Vielen Dank schonmal an Eure Vorarbeit und Hilfe

Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: Otto123 am 15 Dezember 2016, 20:58:36
Hi,

zu 1. - das macht keinen Sinn -> http://fhem.de/commandref_DE.html#define

zu der Frage nach substr - ich habe keine Ahnung von dieser Funktion aber die Doku  (http://perldoc.perl.org/functions/substr.html) (gegoogelt) besagt:
Extrahiere ab Position 20 einen Substring aus dem String den der fhem Aufruf liefert.

Gruß Otto
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: inter#79 am 16 Dezember 2016, 20:21:41
Hallo Otto,

Vielen Dank für deine Infos, Habe nun einen Dummy angelegt.

define Stromzaehler dummy

Und dann folgenden Befehl im fhem eingegeben

define Wert_lesen_minute at +*00:01:00 {my $a=strftime "%Y-%m-%d_%H:%M:%S", localtime time-1*60;;my $b=strftime "%Y-%m-%d_%H:%M:%S", localtime time; my $c = 0; ($c) = split("\n",substr(fhem("get test_log - - $a $b 7:::"),20)); fhem("set Stromzaehler $c")}

Wenn ich das so eingebe erscheint folgende Fehler

Unknown command my, try help.
Unknown command ($c), try help.
Unknown command fhem("set, try help.


Was mache ich falsch?
Titel: Antw:FileLog/get - letzten Eintrag auslesen
Beitrag von: Otto123 am 17 Dezember 2016, 12:04:07
Moin,
im define müssen für ein Semikolon immer zwei geschrieben werden!
In der DEF steht dann nur noch ein Semikolon.
Richtig: ;;my $b
Falsch: ; my $c
Falsch: ; fhem("set

Gruß Otto