Verbose Level auf die Device Ebene einschränken

Begonnen von marc2, 20 Juli 2013, 00:38:59

Vorheriges Thema - Nächstes Thema

marc2

Moin !

Ich habe einen Eltako Windsensor an einem AVR NetIO. Da ich FHEM die
Impulse (zumindest nicht unter Nutzung von ECMD) nicht mit watchasync
schicken kann, zähle ich ich die Impulse direkt mit einem C6 Skript
auf dem NetIO. Um Böen zeitnah mitzubekommen polle ich die gezählten
Werte recht häufig. Da hierzu der Scheduler die Kommandos mit "fhem"
aufruft, werden diese bei verbose 3 natürlich immer brav gelogged.
Dies möchte ich eigentlich nicht. Mit dem loglevel auf Device Ebene
habe ich bereits rumgespielt - leider ohne Erfolg. Derzeit habe ich
nun den global verbose Wert auf 2 runter gesetzt. Dadurch gehen mir aber
Informationen von anderen Devices verloren, die sehen möchte. Gibt es
einen Weg, die "set/get" Meldungen bei global verbose 3 gezielt für
einzelne Devices zu unterdrücken ?

Danke & Gruß, Marc

rudolfkoenig

> Mit dem loglevel auf Device Ebene habe ich bereits rumgespielt - leider ohne Erfolg.

loglevel ist eigentlich der richtige Weg, erfordert aber den expliciten Support durch den Modulentwickler.
Wenn es nicht funktioniert, bitte den Modulentwickler (siehe MAINTAINER.txt) nerven, evtl direkt mit einem Patch. :)

Ralph

Also bei mir funktioniert u. a.

attr Gerätename loglevel 6

Da kommt dann nix, im Eventlog sieht man es dann aber noch.
FHEM auf RaspberryPi3 mit Geekworm USV und SignalDUINO 433MHz und HM-MOD-RPI-PCB mit 3 HM-Sec-SD-2, 5 FHT, 2 RM 100-2 Uni S, 2 HMS100, 6 CUL_WS, 6 CUL_FHTTK, 11 FS20 und 7 FS20V Spannungsüberwachungen

rudolfkoenig


marc2

Loglevel 6 hatte ich probiert, bringt bei einem     
ECMDDevice aber scheinbar nichts, die "gets" landen
leider trotzdem jedes mal im log. Werde mal einen
Blick in 67_ECMDDevice.pm werfen.

Gruß, Marc

Puschel74

Hallo,

Zitat von Rudi:

ZitatWie geschrieben das haengt vom Modul ab.

Zitaterfordert aber den expliciten Support durch den Modulentwickler.

Zitat Ende

Sprich: Wenn der Modulautor diese Funktion in seinem Modul nicht implementiert hat klappt das auch nicht.

Grüße
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

marc2

Hi !

Hatte übrigens nichts mit dem Modul zu tun. Ich frage die Daten des Windsensors
aus einen Perl Routine in meinem 99_myUtils.pl ab und nutze daher entsprechend
die fhem Routine. Letztere schreibt grundsätzlich mit Level 3 ins Log, es sei denn
man übergibt einen zweiten Parameter $silent. War mir neu. Konnte den Hinweis in
der Doku auch nicht auf Anhieb finden. Anyway, jetzt funktioniert es wie
gewünscht.

Was ich hingegen nicht weg bekomme ist die "After sleep" Meldung im Log. Auch
hier ist der Loglevel in fhem.pl hart verdrahtet (Level 2). Leider sind an dieser
Stelle keine Informationen über das betroffene Device mehr verfügbar. GetLoglevel
geht also nicht. Vielleicht könnte man daher auch "sleep" einen zweiten Parameter
$silent übergeben, oder ein globales Attribut spendieren ?

Gruß, Marc

rudolfkoenig

> Was ich hingegen nicht weg bekomme ist die "After sleep" Meldung im Log

Kommt deswegen, weil die Befehle nach dem sleep diesen Text/Fehler zurueckliefern.
Kannst Du bitte konkret zeigen was schiefgeht?

marc2

Hallo Rudolf,

der Schedule sieht wie folgt aus:

+*00:05 set Windsensor 1w_measure;; sleep 2;; get Windsensor 1w_temp

Hier die Auszüge aus der zugehörigen ECMD Class:


get 1w_temp cmd {"1w get 1020e98c02080096"}

set 1w_measure cmd {"1w convert"}
set 1w_measure   postproc {s/^OK$/success/; "$_" eq "success" ? "ok" : "error";}



Das "1w get 1020e98c02080096" liefert gewollter Maßen einen Wert (Text) zurück, der
von WakeUpFn wie folgt protokolliert wird:

2013.07.24 23:28:17 2: After sleep: 1w_temp 23.7
2013.07.24 23:33:18 2: After sleep: 1w_temp 23.8    
2013.07.24 23:38:17 2: After sleep: 1w_temp 23.5        
2013.07.24 23:43:17 2: After sleep: 1w_temp 23.7  


Gruß, Marc

rudolfkoenig

sleep hat jetzt einen optionalen Parameter quiet bekommen.

Bin nicht ganz gluecklich damit, da es nicht intuitiv ist.

marc2

Ist aus meiner Sicht nicht mehr und auch nicht weniger intuitiv wie der Parameter silent
in der fhem Routine. Funktionieren tut es auf jeden Fall prima. Vielen Dank
hierfür !

Gruß, Marc

ntruchsess

Zitat von: rudolfkoenig schrieb am Sa, 20 Juli 2013 10:10loglevel ist eigentlich der richtige Weg, erfordert aber den expliciten Support durch den Modulentwickler.
Hallo Rudolf,

Ich habe das in meinen Modulen bisher so implementiert, dass der loglevel (sofern gesetzt) direkt im aufruf von 'Log' benutzt wird, was aber zur Folge hat, dass bei gesetztem loglevel modulweit mit dem gleichen Loglevel geloggt (oder je nach verbose-level eben auch nicht) geloggt wird. (Ähnlich habe ich das auch in fremden Modulen gesehen). Damit bin ich aber nicht so recht glücklich - sinnvoller wäre es, wenn der modulspezifische loglevel eigentlich die Funktion eines modulspezifischen 'verbose-levels' hätte.

gibt's eigentlich irgendwo eine Seite die beschreibt, welche Semantic der Modulspezifische loglevel haben soll? Sowas wie 'Best Practice' ist?

Gruß,

Norbert
while (!asleep()) {sheep++};

rudolfkoenig

Artige Module sollten sowas wie
 my $l3 = GetLogLevel($name,3);
  Log $l3, "Text"
verwenden, das gilt dann pro definierte Instanz, und nicht Modulweit.
Die beabsichtigten Werte sind hier: http://fhem.de/commandref.html#verbose dokumentiert.

ntruchsess

so habe ich das in meinen Modulen auch implementiert. Was mir daran nicht gefällt:

setzt man keinen loglevel, dann loggen alle Stellen im Modul mit dem Level, den man an der Stelle als Sinnvoll erachtet hat. Mit Verbose kann man dann einstellen, welchen Detailierungsgrad man sehen will.

setzt man den loglevel, dann loggen alle Stellen im Modul (für diese Instanz) mit dem gleichen Loglevel. Je nach Wert von 'verbose' sieht man dann alle Logausgaben der Modulinstanz oder gar keine, da ja zwischen den Logausgaben nicht mehr differenziert wird.

Irgendwie sollte sich das doch besser so verhalten, als ob man den Verbosity-level pro Modul-instanz einstellen würde. Also z.B. global verbose auf 3 und per loglevel 4 im Modul dafür sorgen, dass trotz verbose 3 auch die Stellen mit loglevel 4 gelogged werden.

Gruß
while (!asleep()) {sheep++};

rudolfkoenig

> Irgendwie sollte sich das doch besser so verhalten, als ob man den Verbosity-level pro Modul-instanz einstellen würde. Also z.B. global verbose auf 3 und per loglevel 4 im Modul dafür sorgen, dass trotz verbose 3 auch die Stellen mit loglevel 4 gelogged werden.

Entweder verstehe ich dich nicht, oder es ist schon so.

Es gibt mAn drei Einstellungen:
- loglevel nicht gesetzt: es wird so geloggt, wie der Modulautor das vorgesehen hat, idealerweise so, wie im commandref.html#verbose beschrieben ist.
- loglevel <= verbose: es werden alle Meldungen ausgegeben, die diese Instanz generieren kann. Gedacht fuer den Fall, dass ich ein bestimmtes Geraet debuggen will, der Rest soll leise weiterlaufen
- loglevel > verbose: diese Instanz soll keine Meldungen generieren. Gedacht fuer den Fall, dass ich mit den Entscheidungen des Modulautors nicht einverstanden bin, und ich nichts von dieser FHEM-Instanz hoeren will.