FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: Michael am 28 September 2013, 20:09:46

Titel: Eigenes Logfile erstellen
Beitrag von: Michael am 28 September 2013, 20:09:46
Moin

Wahrscheinlich eine dumme Frage von mir.
Aber ich habe noch kein Möglichkeit gefunden.

Ist es möglich ein Logfile von verschiedenen Device und deren Redings
in eine Datei zu Schreiben?

Bitte um Hilfe.
Titel: Aw: Eigenes Logfile erstellen
Beitrag von: betateilchen am 28 September 2013, 20:21:20
Natürlich...


Internals:
   DEF        ./log/out_Balkon-%Y-%m.log (out_Balkon.T:.*|BMP180.T:.*|Helligkeit|sunDummy|out_Regen_Sensor.*)
   NAME       FileLog_out_Balkon
   REGEXP     (out_Balkon.T:.*|BMP180.T:.*|Helligkeit|sunDummy|out_Regen_Sensor.*)
   STATE      active
   TYPE       FileLog


in dieser Definition werden Readings der devices

- out_Balkon
- BMP180
- Helligkeit
- sunDummy
- out_Regen_Sensor

gemeinsam in die Datei FileLog_out_Balkon-2013-09.log geschrieben.

Die Definition, was geloggt werden soll, besteht einfach aus regex-Anteilen auf events (das ist der Teil, der in der Klammer steht), die Du gestalten kannst, wie Du möchtest.


---
Titel: Aw: Eigenes Logfile erstellen
Beitrag von: Michael am 29 September 2013, 10:10:17
Danke.

Das klappt, aber jedes Device wird in eine Zeile geschrieben.

Ich hatte mich bei meiner Frage schlecht Ausgedrückt, weil mir
die Zeit im Nacken saß. Sorry !!! ;-)

Vorgestellt hatte ich es mir so:
out_Balkon.T:.*|BMP180.T:.*|Helligkeit|sunDummy|out_Regen_Sensor.*
nur alles in einer Zeile.
Titel: Aw: Eigenes Logfile erstellen
Beitrag von: betateilchen am 29 September 2013, 10:20:21
Das macht doch keinen Sinn, weil die Werte von unterschiedlichen Devices nicht gleichzeitig in fhem ankommen.
Das Schreiben der Logdatei wird aber von jedem Event einzeln (also nacheinander) getriggert.

Das was Du machen möchtest, müsstest Du Dir als Funktion selbst programmieren und z.B. in die 99_myUtils unterbringen.

Oder Du schaust mal das Modul DbLog an, dort wird jeweils die letzten Werte aller geloggten Devices in einer gesonderten Tabelle abgelegt, was Deinen Plan erheblich vereinfacht.
Titel: Aw: Eigenes Logfile erstellen
Beitrag von: Michael am 29 September 2013, 19:26:40
Hallo betateilchen

ZitatDas macht doch keinen Sinn, ....
Da hast du wohl Recht, aber mir reichen die Werte alle x Minuten.

ZitatDas was Du machen möchtest, müsstest Du Dir als Funktion selbst programmieren und z.B. in die 99_myUtils unterbringen.
Das habe ich getan.

Könntest du mal dir den Code ansehen aber keine grauen Haare bekommen.
Und das eine oder andere kritisieren.

fhem.cfg
define updatetest at +*00:15:00 {eigenLog}

99_myUtils.pm
sub eigenLog()
{
 
  my $tm = localtime(time);

  my $T  = int(ReadingsVal("Wittingen","temperature",0));
  my $H  = int(ReadingsVal("Wittingen","humidity",0));
  my $W  = int(ReadingsVal("Wittingen","wind",0));
  my $R  = int(ReadingsVal("Wittingen","rain",0));
  my $IR = int(ReadingsVal("Wittingen","israining",0));
  my $D  = int(ReadingsVal("Wittingen","dewpoint",0));
  my $cB = int(ReadingsVal("Wittingen","cloudBase",0));
  my $RD = int(ReadingsVal("Wittingen","rain24",0));
  my $wI = int(ReadingsVal("Wittingen","windIndex",0));
  my $wT =     ReadingsVal("Wittingen","windText",0);

  my $pT = int(ReadingsVal("Luftdruck","temperature",0));
  my $P  = int(ReadingsVal("Luftdruck","pressure",0));
  my $PN = int(ReadingsVal("Luftdruck","pressure-nn",0));

  open (DATEI, ">>/opt/fhem/log/test.csv") or die $!;
   print DATEI "$tm T: $T H: $H W: $W R: $R IR: $IR D: $D cB: $cB RD: $RD wI: $wI wT: $wT pT: $pT P: $P PN: $PN\n";
  close (DATEI);

  return
}
Titel: Aw: Eigenes Logfile erstellen
Beitrag von: betateilchen am 29 September 2013, 19:40:57
Jetzt hab ich zumindest mal verstanden, was Du eigentlich genau vorhast.

Das wird so sicher funktionieren, aber ich würde einen anderen Weg gehen und keine eigene Datei schreiben.

Definiere in fhem einen dummy und weise diesem den gewünschten Sammelwert (ohne Timestamp) zu, dann kann fhem das selbst "fhem-konform" loggen.
Vermutlich könnte man das sogar per stateFormat abdecken.

(Und wenn man einer Datei die  Endung .csv gibt, sollte man auch den Inhalt entsprechend angeben (C = comma S = separated V = values) und Kommata kann ich in Deinem Code nicht finden.)


---
Titel: Antw:Eigenes Logfile erstellen
Beitrag von: fredolino am 02 April 2015, 15:50:43
Hallo ,

ich kriegs nicht in meinen Schädel. Ich möchte

define SB_THL_T ModbusRegister 0 14804
attr SB_THL_T IODev SB
attr SB_THL_T alias UG-Temp
attr SB_THL_T plcDataType REAL
attr SB_THL_T room Smartbox
attr SB_THL_T stateFormat {sprintf("%0.1f °C", ReadingsVal($name,"state",0))}
attr SB_THL_T updateInterval 60

den hier erfassten Wert in ein log schreiben und als Plot abbilden. Was ich auch mache nüscht will klappen.

Kann mir wer das so für "Dummies" erklären.  Der Mechanismus ist mir nicht klar.

Hab das hier oben durch Anpassung mit copy&paste hinbekommen.

Danke
Fredolino

Titel: Antw:Aw: Eigenes Logfile erstellen
Beitrag von: chr2k am 13 September 2015, 19:44:41
Zitat von: betateilchen am 28 September 2013, 20:21:20


Internals:
   DEF        ./log/out_Balkon-%Y-%m.log (out_Balkon.T:.*|BMP180.T:.*|Helligkeit|sunDummy|out_Regen_Sensor.*)
   NAME       FileLog_out_Balkon
   REGEXP     (out_Balkon.T:.*|BMP180.T:.*|Helligkeit|sunDummy|out_Regen_Sensor.*)
   STATE      active
   TYPE       FileLog



Wo trage ich diesen Code ein? Ich habe bisher immer nur mit der oberen "Kommandozeile" gearbeitet. Danke.
Titel: Antw:Eigenes Logfile erstellen
Beitrag von: Puschel74 am 13 September 2015, 19:52:52
define FileLog_out_Balkon FileLog ./log/out_Balkon-%Y-%m.log (out_Balkon.T:.*|BMP180.T:.*|Helligkeit|sunDummy|out_Regen_Sensor.*)
sollte in
Zitatder oberen "Kommandozeile"
klappen wenn KEIN Device namens FileLog_out_Balkon existiert - sonst bekommst du eine Meldung.
Titel: Antw:Eigenes Logfile erstellen
Beitrag von: chr2k am 14 September 2015, 22:55:54
Zitat von: Puschel74 am 13 September 2015, 19:52:52
define FileLog_out_Balkon FileLog ./log/out_Balkon-%Y-%m.log (out_Balkon.T:.*|BMP180.T:.*|Helligkeit|sunDummy|out_Regen_Sensor.*)
sollte inklappen wenn KEIN Device namens FileLog_out_Balkon existiert - sonst bekommst du eine Meldung.

Herzlichen Dank! Aber wo kann ich derartige AUflistungen von Codes in FHEM (oder der passenden Datei im System) einfügen. Bspw hab ich dasselbe Problem mit folgendem Thread (erstes Posting) http://forum.fhem.de/index.php/topic,23912.msg171292.html#msg171292 (http://forum.fhem.de/index.php/topic,23912.msg171292.html#msg171292)

Zitat von: betateilchen

Definition des SVG plots:



Internals:
   CFGFN
   DEF        sunDummyLog:SVG_sunDummy:CURRENT
   GPLOTFILE  SVG_sunDummy
   LOGDEVICE  sunDummyLog
   LOGFILE    CURRENT
   NAME       SVG_sunDummy
   NR         276
   STATE      initialized
   TYPE       SVG
Attributes:
   fixedrange year
   room       19 Balkon
   title      {"".dec2hms($data{min1})." - ".dec2hms($data{max1})." - ".dec2hms($data{min2})." - ".dec2hms($data{max2})}



zugehörige gplot-Datei:



# Created by FHEM/98_SVG.pm, 2014-05-18 23:36:13
set terminal png transparent size <SIZE> crop
set output '<OUT>.png'
set xdata time
set timefmt "%Y-%m-%d_%H:%M:%S"
set xlabel " "
set title '<TL>'
set ytics
set y2tics
set grid ytics
set ylabel "Sonnenaufgang"
set y2label "Sonnenuntergang"
set yrange [4:10]
set y2range [16:22]

#FileLog 4:sunDummy.sunrise\x3a::time2dec($fld[3])
#FileLog 4:sunDummy.sunset\x3a::time2dec($fld[3])
#FileLog 4:sunDummy.sunset\x3a::time2dec($fld[3])

plot "<IN>" using 1:2 axes x1y1 title 'Sonnenaufgang' ls l6fill lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title 'Sonnenuntergang' ls l0 lw 1 with lines,\
     "<IN>" using 1:2 axes x1y2 title ' ' ls l4fill lw 1 with lines