FileLog/get - letzten Eintrag auslesen

Begonnen von sokkederheld, 29 Juli 2015, 12:48:53

Vorheriges Thema - Nächstes Thema

sokkederheld

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:

  • wie bekomme ich diese beiden Zeitstempel im richtigen Format hin? Ich bin mir sicher dass das mit Perl-Syntax irgendwie gehen muss, aber wie?
  • wie schaffe ich es dann, nur den numerischen Wert (dritte Spalte) in einen Dummy zu verfrachten?

Danke schonmal für jegliche Hilfe!

Otto123

Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

sokkederheld

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*

sokkederheld

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...  :-[)

Hans Franz

#4
Hallo,
Lass die Semikola hinter localtime weg.

Gruss
Hans

Edith:
Und so
{ strftime "%Y-%m-%d_%H:%M:%S", localtime time- 5*60 }
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

sokkederheld

#5
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!

Hans Franz

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
Raspi
CUL, Nano-CUL
FHT8V, FHT80B, S300TH
WM1000WZ, ELRO
LW12, LD382,DS18B20

sokkederheld

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.

sokkederheld

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.

inter#79

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?

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

inter#79

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


Otto123

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 (gegoogelt) besagt:
Extrahiere ab Position 20 einen Substring aus dem String den der fhem Aufruf liefert.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

inter#79

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?

Otto123

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
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz