Log-Format von Filelog anpassen möglich ?

Begonnen von TomLee, 10 April 2018, 15:58:52

Vorheriges Thema - Nächstes Thema

TomLee

Hallo,

ich kann mir bereits eine kommaseparierte Einkaufsliste die in einem Reading steht ausdrucken.
Das hab ich über eine Filelog-Datei realisiert.
Mit clear hab ich vor die Datei zu leeren nachdem die Liste ausgedruckt wurde, damit immer nur ein Eintrag vorhanden ist.

Meine Frage dazu wäre ob es möglich ist das Log-Format von FileLog für diese eine Datei so anzupassen das nur das <event> (also die kommaseparierte Liste) in die Log-Datei geschrieben wird ?

Gruß

Thomas


betateilchen

natürlich. Schau Dir die Doku zu FileLog an und verstehe, was dort steht. Grundsätzlich wird nur das geloggt, was Du in die regexp für das FileLog-device schreibst.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#2
Hab die Doku gelesen, behaupte aber nicht verstanden zu haben.

Das wir uns richtig verstehen und im Falle das meine Frage nicht eindeutig war:


Aus

ZitatSpeichert Ereignisse in einer Log-Datei mit Namen <filename>. Das Log-Format ist
YYYY-MM-DD_HH:MM:SS <device> <event>

soll in meinem Fall

ZitatYYYY-MM-DD_HH:MM:SS <device> <event>

werden.

Das steht in der Doku ?

betateilchen

#3
Zitat von: TomLee am 10 April 2018, 19:58:55
Das steht in der Doku ?

Nö. Weil das überhaupt nichts mit einem Log zu tun hat.

Wenn Du einfach nur den event ohne jegliche zusätzliche Information in eine Datei schreiben willst, kannst Du das einfach per notify und FileWrite() tun. Dazu brauchst Du überhaupt kein FileLog device.

define blub_test notify global:.* {FileWrite({ FileName=>"/tmp/globalLog.txt", ForceType=>"file" },$EVENT)}

(Die regexp und den Speicherort für die Datei musst Du natürlich Deinen Bedürfnissen anpassen)
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Klappt auf Anhieb, Danke dir.

Die Umsetzung ist das was ich suchte. In dem Textfile steht aber am Anfang trotzdem noch der Readingname.

list_SHOPPING_ITEM: feuerzeug,wecker,fanta,kamin,lampe

betateilchen

Dass man aber anstatt $EVENT auch einzelne Teile $EVTPARTx verwenden kann, steht definitiv in der Doku.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

Super.

Verstehen tue ich das zwar noch nicht ganz, kommt aber mit der Zeit.

Jetzt brauch ich noch eine Lösung für einen Zeilenumbruch, damit die Werte untereinander stehen.

Einkaufsliste halt  ;D

Hier war mein Ansatz das über ein userReading dem notify vorzubereiten:

tou {my $sl = ReadingsVal('Echo','list_SHOPPING_ITEM',''); $sl =~ tr/,/\n/; return $sl;}

Klappt auch, im userReading.
Wird aber vom notify so nicht übernommen.

Das notify schreibt dann nur den ersten Wert in das Textfile.

betateilchen

Zitat von: TomLee am 11 April 2018, 11:42:02
Hier war mein Ansatz das über ein userReading dem notify vorzubereiten:

Völlig überflüssig. Ersetze in Deinem notify "$EVTPARTx" durch "split(/\,/,$EVTPARTx)"

Erklärung:


  • FileWrite() schreibt von Haus aus ein Array zeilenweise in eine Datei. Bisher übergibst Du aber nur einen einzelnen Wert (also quasi ein Array mit nur 1 Element)
  • split() erzeugt ein Array mit mehreren Elementen durch Zerlegen von $EVTPARTx genau an jedem einzelnen Komma

Übrigens: manchmal wäre es nützlich, wenn der Fragesteller seinen bisherigen Lösungsansatz komplett posten würde, also nicht nur irgendein userreading, sondern beispielsweise das gesamte notify

Und jetzt habe ich noch eine Gegenfrage:

Warum beschäftigen sich Anwender lieber mit so "komplexen" haarsträubenden Dingen wie userReadings, anstatt sich ein paar simple perl Grundlagen anzueignen?
In meiner FHEM Installation mit inzwischen knapp 1000 definierten devices existiert kein einziges userReading...
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

#8
Danke für die Hilfe.


Übrigens: manchmal wäre es nützlich, wenn der Fragesteller seinen bisherigen Lösungsansatz komplett posten würde, also nicht nur irgendein userreading, sondern beispielsweise das gesamte notify

Dachte das nicht nötig, du verstehst wovon ich schreibe.
Merks mir.


Perl, wenn auch unabdingbar, hat mich anfangs abgeschreckt.
Denke die Masse an Möglichkeiten mit Fhem und dann aber auch der Drang etwas Produktives zu verwirklichen lässt dem durchschnittlichen Anfänger ohne Programmierkentnisse (dazu zähle auch ich) nicht viel Zeit, noch zusätzlich zu allen anderen Dingen, eine Programmiersprache zu lernen, abgesehen von der  Fähigkeit das überhaupt zu können.
Viele Dinge kann man sich anfangs durch Hilfe des Forums zusammensuchen, kopiert hier und fügt dort ein und bastelt sich sein FHEM zusammen. Dabei entstehen halt auch solche "komplexen" haarsträubenden Dinge wie userReadings.
Irgendwann ist man aber weiter wie 'gebastel' und da geb ich dir Recht sollte man sich auch mal mit Perl beschäftigen. Hat bei mir halt jetzt rd. 2 1/2 Jahre gedauert.

Zitat von: betateilchen am 11 April 2018, 12:41:54


  • FileWrite() schreibt von Haus aus ein Array zeilenweise in eine Datei. Bisher übergibst Du aber nur einen einzelnen Wert (also quasi ein Array mit nur 1 Element)
  • split() erzeugt ein Array mit mehreren Elementen durch Zerlegen von $EVTPARTx genau an jedem einzelnen Komma

Übrigens: hättest du die letzten 2 1/2 Jahre jedem Unwissenden solche detailierten, leicht verständliche Antworten gegeben, könnt ich heute schon mehr  ;)
Und verzeihe das u.a. DOIF  ;D


Hier nochmal meine Umsetzung, die Alexa-Einkaufsliste (37_echodevice.pm) auszudrucken, zusammengefasst:

defmod du_Echo_Einkaufsliste dummy
attr du_Echo_Einkaufsliste alexaName Einkaufsliste
attr du_Echo_Einkaufsliste genericDeviceType switch
attr du_Echo_Einkaufsliste room Alexacontrol,Echo
attr du_Echo_Einkaufsliste setList on off


defmod doif_Echo_Einkaufsliste DOIF ([du_Echo_Einkaufsliste] eq "on")(\
{system("lpr -P HL2035 -o media=Custom.95x138mm /tmp/einkaufsliste.txt")},\
setstate du_Echo_Einkaufsliste off,\
{my @array = split(",",ReadingsVal("Echo","list_SHOPPING_ITEM",""));;\
foreach my $sk (@array)\
{fhem ("set Echo item_shopping_delete $sk")}})\


defmod not_Echo_Einkaufsliste notify Echo:list_SHOPPING_ITEM:.* { eval ( FileWrite({FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file", NoNL => 0 }, split (/\,/,$EVTPART1)) )}
attr not_Echo_Einkaufsliste room Echo

betateilchen

Zitat von: TomLee am 11 April 2018, 15:59:13
Dachte das nicht nötig, du verstehst wovon ich schreibe.
Merks mir.

Es geht nicht darum, das ich nicht verstanden hätte, wovon Du schreibst, sondern darum, dass ich die Änderung mit dem split() direkt in Deinem notify hätte zeigen können.

Zitat von: TomLee am 11 April 2018, 15:59:13
Übrigens: hättest du die letzten 2 1/2 Jahre jedem Unwissenden solche detailierten, leicht verständliche Antworten gegeben, könnt ich heute schon mehr  ;)

Wenn in den vergangenen 2 1/2 Jahren jeder Unwissende eine solche Mitwirkungsbereitschaft gezeigt hätte wie Du, hätte ich solche Antworten auch öfters gegeben.

Zitat von: TomLee am 11 April 2018, 15:59:13
Und verzeihe das u.a. DOIF

nein.
-----------------------
Formuliere die Aufgabe möglichst einfach und
setze die Lösung richtig um - dann wird es auch funktionieren.
-----------------------
Lesen gefährdet die Unwissenheit!

TomLee

ZitatWarum beschäftigen sich Anwender lieber mit so "komplexen" haarsträubenden Dingen wie userReadings, anstatt sich ein paar simple perl Grundlagen anzueignen?
In meiner FHEM Installation mit inzwischen knapp 1000 definierten devices existiert kein einziges userReading...

Nochmal eine Verständnisfrage dazu.


Wenn ich jetzt zu dieser Frage

https://forum.fhem.de/index.php/topic,82631.msg785304.html#msg785304

diese Antwort gegeben habe

https://forum.fhem.de/index.php/topic,82631.msg785359.html#msg785359

ist das deiner Meinung nach zwar ein Lösungsweg, die korrekte Vorgehensweise aber entweder ein

{ my $sl = ReadingsVal('Echo','list_TASK','');; $sl =~ tr/_/ /;; {fhem("set Sonos_Wohnzimmer_PLAY3 Speak 20 de $sl")}}

oder ein auslagern von

my $sl = ReadingsVal('Echo','list_TASK','');; $sl =~ tr/_/ /;;

in eine 99_Utils.pm ?







TomLee

#11
defmod not_Echo_Einkaufsliste notify Echo:list_SHOPPING_ITEM:.* {FileWrite({ FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file" },split(/\,/,$EVTPART1))}
attr not_Echo_Einkaufsliste room Echo


Gibt's vielleicht noch nen Stupps dazu wie ich das notify dazu bringe nur zu reagieren wenn das Reading auch einen Inhalt hat.

Aktuell reagiert es nämlich mit folgender Meldung wenn die Liste gelöscht wird (also das Reading keinen Inhalt hat):

2018.06.14 16:21:47 1: ERROR evaluating my $EVTPART0='list_SHOPPING_ITEM:';
my $TYPE='echodevice';my $NAME='Echo';my $SELF='not_Echo_Einkaufsliste';
my $EVENT='list_SHOPPING_ITEM: ';{FileWrite({ FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file" },split(/\,/,$EVTPART1)); }:
Global symbol "$EVTPART1" requires explicit package name at (eval 944807) line 1.
2018.06.14 16:21:47 3: not_Echo_Einkaufsliste return value: Global symbol "$EVTPART1" requires explicit package name at (eval 944807) line 1.




Das hier klappt schon mal nicht:

Echo:list_SHOPPING_ITEM:.* { if ($EVTPART1 ne ""){FileWrite({ FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file" },split(/\,/,$EVTPART1)); }}

Echo:list_SHOPPING_ITEM:.* { if(defined($EVTPART1)){FileWrite({ FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file" },split(/\,/,$EVTPART1)); }}

Echo:list_SHOPPING_ITEM:.* { if(Value($EVTPART1) ne""){FileWrite({ FileName=>"/tmp/einkaufsliste.txt", ForceType=>"file" },split(/\,/,$EVTPART1)); }}

TomLee

Besser spät wie nie, oder ?  8)

Echo:list_SHOPPING_ITEM:.* if ($EVTPART0 ne "") {FileWrite({ FileName=>"/opt/fhem/einkaufsliste.txt", ForceType=>"file", NoNL => 0},split(/\,/,$EVTPART1))}

Gruß

Thomas