Hallo
ich habe am WE ein Update gemacht und festgestellt ( da ich nicht no regelmäßig die Ankündigungen lese ... ich will mich aber besser),
dass es danach nicht mehr ging.
Ok, hier im Forum die Erklärung und die Änderungen gefunden und meine classdef angepasst.
Jetzt bekomme ich zwar wieder meine Werte, aber 1. doppelt und 2. mit einer Leerzeile danach.
Jetzt habe ich keine Idee ob das an einer fehlerhaften classdef liegt oder was anderes.
Die classdef sieht so aus :
get value cmd {"1w get %channel\n"}
get value params channel
get value expect "\d+\n"
get value postproc { s/^(\d+)\n$/$1/;; $_ }
Wobei es auch ohne die postproc Zeile geht bzw. mit ihr keine Änderung brachten ( und ich die auch nicht 100% verstanden habe)
Ich lese einen 1W-Sensor aus.
Im Filelog steht sowas :
2014-05-12_20:14:30 S0_aussen value: 12.9
2014-05-12_20:14:30 S0_aussen value 12.9
Das S0-Gerät sieht so aus :
fhem> list S0
Internals:
DEF telnet 192.168.30.120:2701
DeviceName 192.168.30.120:2701
FD 26
NAME S0
NR 121
PARTIAL
Protocol telnet
STATE opened
TYPE ECMD
Fhem:
Classdefs:
S0_1w:
filename /etc/fhem/1w.classdef
Gets:
Value:
cmd {"1w get %channel\n"}
expect \d+\n
params channel
postproc { s/^(\d+)\n$/$1/;; $_ }
Sets:
Attributes:
classdefs S0_1W=/etc/fhem/1w.classdef
room Server
verbose 0
der Sensor :
fhem> list S0_aussen
Internals:
DEF S0_1W
IODev S0
NAME S0_aussen
NR 122
STATE value 12.9
TYPE ECMDDevice
Readings:
2014-05-12 20:09:30 state value 12.9
2014-05-12 20:09:30 value 12.9
Fhem:
classname S0_1W
Attributes:
IODev S0
room Heizung
verbose 0
Hier sieht man in der Readings auch den zusätzlichen Zeilenumbruch.
Es gibt dann einen at-Befehlt der regelmäßig die Daten abruft :
fhem> list read_s0_aussen
Internals:
DEF +*00:05:00 { fhem "set S0 reopen"; fhem "get S0_aussen value Aussen" }
NAME read_s0_aussen
NR 123
NTM 20:14:30
REP -1
STATE Next: 20:14:30
TRIGGERTIME 1399918470.34274
TRIGGERTIME_FMT 2014-05-12 20:14:30
TYPE at
Attributes:
verbose 0
Kann mir jemand einen Tip geben ?
Zusatzfrage : wie kann ich im Hauptlogfile diesen Eintrag abschalten ?
2014.05.12 20:09:30 3: get S0_aussen value Aussen : value 12.9
Die Temperatur soll nur in das entsprechende Filelog geschrieben werden.
Danke Ronald
Hallo,
Regel Nummer 1: loglevel auf 5 und logTraffic an, Log ansehen und verstehen.
Vermutung: das expect ist falsch, weil es den Dezimalpunkt nicht matcht.
Grüße
Boris
Hallo
Vielen Dank für die Hilfe.
Wenn ich das richtig verstehe heißt "loglevel" jetzt "verbose" ?
(In der Referenz kommt noch sehr oft "loglevel" vor.)
Wie vermutet war das "expect" falsch. Leider ist in der Referenz keine Beispiel für eine Zahl mit Dezimalstelle vorhanden.
Mit Googles Hilfe habe ich habe nun das in der classdef :
get value cmd {"1w get %channel\n"}
get value params channel
get value expect "[+-]?\d+(\.\d+)\n"
get value postproc { s/\n//;; $_ }
Das erwartet nun eine Zahl mit Dezimalstellen, optionalem Vorzeichen und /n, so das es auch im Winter klappt.
(das + könnte man sich schenken aber wenn es mal jemand braucht ...)
Kann man eigentlich Komentare in die classdef schreiben ?
Was die "postproc"-Regel in der Referenz tut ( der "$/$1/;; $_"-Teil) habe ich leider nicht ergründen können.
Sie passte jedenfalls auch nicht und deshalb habe ich sie auf das entfernen des /n reduziert, wobei das ";; $_" noch unklar ist.
Ev. wäre es möglich solche Sachen in der "Perl specials"-Rubrik der Referenz zu erklären ?
Das Filelog habe ich dadurch sauber bekommen, das ich den "Regexp parts" schärfer eingestellt habe.
Das geht dank des genialen Formulars seht schön.
Nun wird nur noch "value:" statt "value" gelogt und die 2. Zeile kommt deshalb nicht ins log.
Nur im fhem-xxxx.log habe ich immer noch die Zeile :
2014.05.13 20:30:19 3: get S0_aussen value Aussen : value 11.7
Die hat da nichts zu suchen und ich denke, dass ich bei allen Objekten die damit zu tun haben "verbose" auf 0 stehen habe.
Wenn ich die Zeile richtig deute wird da aber immer noch irgendwo ein "verbose=3" (der globale verbose-Level) gezogen ?
Nur wo/wie suchen ?
Gruß Ronald
Hi,
Zitat von: sky64 am 13 Mai 2014, 20:47:55
Kann man eigentlich Komentare in die classdef schreiben ?
The class definition for a logical ECMD device class is contained in a text file. The text file is made up of single lines. Empty lines and text beginning with # (hash) are ignored. Therefore make sure not to use hashes in commands.
Zitat
Sie passte jedenfalls auch nicht und deshalb habe ich sie auf das entfernen des /n reduziert, wobei das ";; $_" noch unklar ist.
Ev. wäre es möglich solche Sachen in der "Perl specials"-Rubrik der Referenz zu erklären ?
Ich empfehle das Buch von Rainer Krienke, Programmieren in Perl, oder eines der unzähligen Perl-Tutorials im Web. Perl ist unglaublich mächtig und unglaublich hirnerweichend und es ist nicht Sinn der CommandRef, Perl zu lehren.
Viele Grüße
Boris
Hallo an alle,
die auch das Problem mit den doppelten Einträgen hatten:
Einfach in der Definition des FileLog das regexp durch ein [:] ergänzen, also z.B.
define wzlog FileLog ./log/wz-%G-%V.log wz:(measured-temp).*
ersetzen durch
define wzlog FileLog ./log/wz-%G-%V.log wz:(measured-temp)[:].*
Eigentlich nicht kompliziert, aber blöd, weil man das in der alten ECMD-Version einfach nicht brauchte.
Gruß F.