Hallo
Ich lese Temperatur-/Feuchtesensoren DHT22 über einen AVR_NET-IO aus. Nach dem heutigen Update kommen folgende Fehlermeldungen:
2015.10.06 23:15:59.950 5: ECMDDevice: Analyze command >{"dht temp 1\n\000dht humid 1\n"}<
2015.10.06 23:15:59.973 5: Postprocessing "20.3\n" with perl command { s/(.*)\n(.*)\n/T: $1 H: $2/; my $hash = $defs{KL_HumTemp2}; my $temperature = $1; my $humidity = $2; my $state = "T: $temperature H: $humidity"; readingsSingleUpdate($hash, "temperature", $temperature, 1); readingsSingleUpdate($hash, "humidity", $humidity, 1); readingsSingleUpdate($hash, "state", $state, 1); }.
2015.10.06 23:15:59.987 1: PERL WARNING: Use of uninitialized value $temperature in concatenation (.) or string at (eval 1372) line 1.
2015.10.06 23:15:59.989 1: PERL WARNING: Use of uninitialized value $humidity in concatenation (.) or string at (eval 1372) line 1.
2015.10.06 23:16:00.003 5: Postprocessed value is "state: T: H: ".
Die dazugehörige classdef sieht so aus:
# Uebergabeparameter DHT22 ID 0...n
params devID
# Umsetzung in ECMD Befehle fuer DHT22
get DHT cmd {"dht temp %devID\n\000dht humid %devID\n"}
get DHT expect "\d+.\d\n"
get DHT postproc {\
s/(.*)\n(.*)\n/T: $1 H: $2/;\
my $hash = $defs{%NAME};\
my $temperature = $1;\
my $humidity = $2;\
my $state = "T: $temperature H: $humidity";\
\
readingsSingleUpdate($hash, "temperature", $temperature, 1);\
readingsSingleUpdate($hash, "humidity", $humidity, 1);\
readingsSingleUpdate($hash, "state", $state, 1);\
\
}
Weiß jemand, was sich im Code geändert hat, bzw. was ich umstellen muß, damit es wieder geht?
Danke und Gruß
G.
Hallo,
ich habe den requestSeparator einstellbar/abschaltbar gemacht. Dachte, dass es abwärtskompatibel sei.
Schicke bitte mal das Ergebnis von list DeinECMD und list DeinECMDDevice.
Danach bitte mal Attribut requestSeparator explizit auf \000 setzen.
Grüße
Boris
Hallo Boris
Hier die Informationen.
Internals:
DEF telnet 192.168.1.90:2701
DeviceName 192.168.1.90:2701
FD 22
NAME AVRNETIO
NR 135
PARTIAL
Protocol telnet
STATE opened
TYPE ECMD
Readings:
2015-10-06 22:35:36 state opened
Fhem:
Classdefs:
Dht22m:
filename /home/pi/fhem/dht22m.classdef
params devID
Gets:
Dht:
cmd {"dht temp %devID\n\000dht humid %devID\n"}
expect \d+.\d\n
postproc { s/(.*)\n(.*)\n/T: $1 H: $2/; my $hash = $defs{%NAME}; my $temperature = $1; my $humidity = $2; my $state = "T: $temperature H: $humidity"; readingsSingleUpdate($hash, "temperature", $temperature, 1); readingsSingleUpdate($hash, "humidity", $humidity, 1); readingsSingleUpdate($hash, "state", $state, 1); }
Sets:
Onewire:
filename /home/pi/fhem/onewire.classdef
params devID
Gets:
Temperature:
cmd {"1w get %devID\n"}
expect \d+.\d+\n
postproc { s/\n//g; $_ }
Sets:
Attributes:
classdefs ONEWIRE=/home/pi/fhem/onewire.classdef:DHT22M=/home/pi/fhem/dht22m.classdef
requestSeparator \000
room System
verbose 0
und
Internals:
DEF DHT22M 1
IODev AVRNETIO
NAME KL_HumTemp2
NR 172
STATE T: 20.4 H: 58.8 D: 0
TYPE ECMDDevice
Readings:
2015-10-07 00:11:51 DHT state: T: H:
2015-10-06 22:38:37 dew 0
2015-10-06 22:34:57 humidity 58.8
2015-10-07 00:11:51 state DHT state: T: H:
2015-10-06 22:34:57 temperature 20.4
Fhem:
classname DHT22M
Cache:
Specials:
%NAME KL_HumTemp2
%TYPE ECMDDevice
%devID 1
Params:
devID 1
Attributes:
IODev AVRNETIO
alias KL_DHT_Keller
event-on-change-reading DHT
room Keller
stateFormat {sprintf("T: %s H: %s D: %s", ReadingsVal("KL_HumTemp2", "temperature", 0), ReadingsVal("KL_HumTemp2", "humidity", 0), ReadingsVal("KL_HumTemp2", "dew", 0))}
userReadings dew:DHT { my $dp; my @dhtsplit = split (/ /, ReadingsVal($name,"DHT","")); my $A = 17.2694; my $B = ($dhtsplit[2] > 0) ? 237.3 : 265.5; my $es = 610.78 * exp( $A * $dhtsplit[2] / ($dhtsplit[2] + $B) ); my $e = $dhtsplit[4]/ 100 * $es; if ($e == 0) { Log 1, "Error: dewpoint() e==0: temp=$dhtsplit[2], hum=$dhtsplit[4]"; return 0; } my $e1 = $e / 610.78; my $f = log( $e1 ) / $A; my $f1 = 1 - $f; if ($f1 == 0) { Log 1, "Error: dewpoint() (1-f)==0: temp=$dhtsplit[2], hum=$dhtsplit[4]"; return 0; } $dp = $B * $f / $f1 ; $dp = sprintf("%.1f", $dp) ;}
verbose 5
Das Attribut habe ich auf den von Dir genannten Wert gesetzt, ohne Effekt.
Gruß
G.
Hallo,
ich schaue es mir am Wochenende an. Gehe bitte solange auf die Vorversion zurück.
Viele Grüße
Boris
Hallo,
ich nehme an, dass Dein DHT22M folgendes antwortet:
22.1\n45.1\n
Das Expect verarbeitet den ersten Teil davon und reicht es dann an Postproc weiter. Ich meine, dass Du Dein Expect auf
get DHT expect "\d+\.\d\n\d+\.\d\n"
ändern musst. Keine Ahnung, warum das früher bei Dir ging.
Viele Grüße
Boris
Hallo Boris
Ich hatte den Code ohne Änderung von http://www.ethersex.de/index.php/Nutzung_in_FHEM_%28Deutsch%29 (http://www.ethersex.de/index.php/Nutzung_in_FHEM_%28Deutsch%29) übernommen. Das ging ohne Probleme, nur das in der Rückmeldung noch ein "DHT" mitgeliefert wurde, war etwas nervig.
Ich werde Deine Änderung mal probieren.
Viele Grüße
G.
Ich habe auch das Update gemacht, leider mit dem selben Ergebnis:
2015.10.11 09:52:24 1: PERL WARNING: Use of uninitialized value $humidity in concatenation (.) or string at (eval 1144) line 1.
2015.10.11 09:52:24 3: eval: { s/(.*)\n(.*)\n/T: $1 H: $2/; my $hash = $defs{Keller_aussen}; my $temperature = $1; my $humidity = $2; my $state = "T: $temperature H: $humidity"; readingsSingleUpdate($hash, "temperature", $temperature, 1); readingsSingleUpdate($hash, "humidity", $humidity, 1); readingsSingleUpdate($hash, "state", $state, 1); }
Melde mich nachher nochmal (Besuch) :P
Viele Grüße, Ricardo
Hallo Boris
Dein vorgeschlagenes classdef-Statement geht auch nur mit der alten Version.
Alte Version:
2015.10.12 21:11:14.206 5: ECMDDevice: Analyze command >{"dht temp 1\n\000dht humid 1\n"}<
2015.10.12 21:11:14.241 5: Postprocessing "20.1\n51.5\n" with perl command { s/(.*)\n(.*)\n/T: $1 H: $2/; my $hash = $defs{KL_HumTemp2}; my $temperature = $1; my $humidity = $2; my $state = "T: $temperature H: $humidity"; readingsSingleUpdate($hash, "temperature", $temperature, 1); readingsSingleUpdate($hash, "humidity", $humidity, 1); readingsSingleUpdate($hash, "state", $state, 1); }.
2015.10.12 21:11:14.270 5: Postprocessed value is "state: T: 20.1 H: 51.5".
Mit ECMD-log:
2015.10.12 21:50:13.500 5: ECMDDevice: Analyze command >{"dht temp 1\n\000dht humid 1\n"}<
2015.10.12 21:50:13.512 5: AVRNETIO: command split into 2 parts.
2015.10.12 21:50:13.515 5: AVRNETIO: sending command "dht temp 1\n"
2015.10.12 21:50:13.517 5: SW: 6468742074656d7020310a
2015.10.12 21:50:13.525 1: AVRNETIO: unexpected answer "20.4\n" received (wrote "dht temp 1\n", expected \d+\.\d\n\d+\.\d\n)
2015.10.12 21:50:13.526 5: AVRNETIO: received answer "20.4\n"
2015.10.12 21:50:13.529 5: AVRNETIO: sending command "dht humid 1\n"
2015.10.12 21:50:13.531 5: SW: 6468742068756d696420310a
2015.10.12 21:50:13.538 1: AVRNETIO: unexpected answer "51.0\n" received (wrote "dht humid 1\n", expected \d+\.\d\n\d+\.\d\n)
2015.10.12 21:50:13.540 5: AVRNETIO: received answer "51.0\n"
2015.10.12 21:50:13.544 5: Postprocessing "20.4\n51.0\n" with perl command { s/(.*)\n(.*)\n/T: $1 H: $2/; my $hash = $defs{KL_HumTemp2}; my $temperature = $1; my $humidity = $2; my $state = "T: $temperature H: $humidity"; readingsSingleUpdate($hash, "temperature", $temperature, 1); readingsSingleUpdate($hash, "humidity", $humidity, 1); readingsSingleUpdate($hash, "state", $state, 1); }.
2015.10.12 21:50:13.573 5: Postprocessed value is "state: T: 20.4 H: 51.0".
Neue Version:
2015.10.12 21:23:33.136 5: ECMDDevice: Analyze command >{"dht temp 1\n\000dht humid 1\n"}<
2015.10.12 21:23:33.161 5: Postprocessing "20.4\n" with perl command { s/(.*)\n(.*)\n/T: $1 H: $2/; my $hash = $defs{KL_HumTemp2}; my $temperature = $1; my $humidity = $2; my $state = "T: $temperature H: $humidity"; readingsSingleUpdate($hash, "temperature", $temperature, 1); readingsSingleUpdate($hash, "humidity", $humidity, 1); readingsSingleUpdate($hash, "state", $state, 1); }.
2015.10.12 21:23:33.176 1: PERL WARNING: Use of uninitialized value $temperature in concatenation (.) or string at (eval 211) line 1.
2015.10.12 21:23:33.177 1: PERL WARNING: Use of uninitialized value $humidity in concatenation (.) or string at (eval 211) line 1.
2015.10.12 21:23:33.191 5: Postprocessed value is "state: T: H: ".
Hier auch nochmal mit dem ECMD-log:
2015.10.12 21:29:11.665 5: ECMDDevice: Analyze command >{"dht temp 1\n\000dht humid 1\n"}<
2015.10.12 21:29:11.678 5: AVRNETIO: sending command "dht temp 1\n\000dht humid 1\n"
2015.10.12 21:29:11.681 5: SW: 6468742074656d7020310a006468742068756d696420310a
2015.10.12 21:29:11.689 1: AVRNETIO: unexpected answer "20.2\n" received (wrote "dht temp 1\n\000dht humid 1\n", expected \d+\.\d\n\d+\.\d\n)
2015.10.12 21:29:11.691 5: AVRNETIO: received answer "20.2\n"
2015.10.12 21:29:11.694 5: Postprocessing "20.2\n" with perl command { s/(.*)\n(.*)\n/T: $1 H: $2/; my $hash = $defs{KL_HumTemp2}; my $temperature = $1; my $humidity = $2; my $state = "T: $temperature H: $humidity"; readingsSingleUpdate($hash, "temperature", $temperature, 1); readingsSingleUpdate($hash, "humidity", $humidity, 1); readingsSingleUpdate($hash, "state", $state, 1); }.
2015.10.12 21:29:11.709 1: PERL WARNING: Use of uninitialized value $temperature in concatenation (.) or string at (eval 379) line 1.
2015.10.12 21:29:11.710 1: PERL WARNING: Use of uninitialized value $humidity in concatenation (.) or string at (eval 379) line 1.
2015.10.12 21:29:11.725 5: Postprocessed value is "state: T: H: ".
Viele Grüße
G.
OK, Danke für die präzisen Log-Angaben. Ich sehe das Problem. Anscheinend ignoriert die neue Version den Request-Separator. Er wird nämlich an das Device geschickt, anstelle zwei separate Kommandos zu senden.
Ich kann das heute Abend nicht mehr testen und reparieren, komme erst am Wochenende dazu.
Kannst Du mir bitte einen Gefallen tun und folgenden Hack testen: in 66_ECMD.pm die Zeile 555, welche
my $requestSeparator= AttrVal($hash, "requestSeparator", undef);
lautet, durch
my $requestSeparator= "\000";
ersetzen. Dann das Modul mit
reload 66_ECMD.pm
von der FHEM-Konsole oder im FHEMWEB-Eingabeschlitz neu laden.
Wenn das immer noch nicht geht, würde ich wieder das volle ECMD-Log benötigen, wie in Deinem letzten Post.
Viele Grüße
Boris
Gerade gemacht, und geht. Hier das Log dazu:
2015.10.12 22:25:50.429 5: ECMDDevice: Analyze command >{"dht temp 1\n\000dht humid 1\n"}<
2015.10.12 22:25:50.442 5: AVRNETIO: command split into 2 parts.
2015.10.12 22:25:50.444 5: AVRNETIO: sending command "dht temp 1\n"
2015.10.12 22:25:50.447 5: SW: 6468742074656d7020310a
2015.10.12 22:25:50.454 1: AVRNETIO: unexpected answer "20.3\n" received (wrote "dht temp 1\n", expected \d+\.\d\n\d+\.\d\n)
2015.10.12 22:25:50.456 5: AVRNETIO: received answer "20.3\n"
2015.10.12 22:25:50.458 5: AVRNETIO: sending command "dht humid 1\n"
2015.10.12 22:25:50.460 5: SW: 6468742068756d696420310a
2015.10.12 22:25:50.467 1: AVRNETIO: unexpected answer "51.1\n" received (wrote "dht humid 1\n", expected \d+\.\d\n\d+\.\d\n)
2015.10.12 22:25:50.469 5: AVRNETIO: received answer "51.1\n"
2015.10.12 22:25:50.472 5: Postprocessing "20.3\n51.1\n" with perl command { s/(.*)\n(.*)\n/T: $1 H: $2/; my $hash = $defs{KL_HumTemp2}; my $temperature = $1; my $humidity = $2; my $state = "T: $temperature H: $humidity"; readingsSingleUpdate($hash, "temperature", $temperature, 1); readingsSingleUpdate($hash, "humidity", $humidity, 1); readingsSingleUpdate($hash, "state", $state, 1); }.
2015.10.12 22:25:50.502 5: Postprocessed value is "state: T: 20.3 H: 51.1".
Super.
AttrVal tut nicht, was ich erwarte.
Mehr dazu demnächst in diesem Theater.
Gute Nacht
Boris
Zitat von: Gernott am 12 Oktober 2015, 22:26:58
Gerade gemacht, und geht.
Hallo Boris und Gernot,
hier ist das genauso. Die neue 66_ECMD.pm funktioniert mit dem Patch wieder bzw. anders herum: die wohl nicht ganz korrekte classdef wird wieder "zurecht gebogen". ::)
Viele Grüße, Ricardo
Hallo,
hab's gefixt und eingecheckt. Ab sofort im Repo oder morgen per Update erhältlich.
Grüße
Boris
Rückmeldung: Update funktioniert! Danke Boris. ;)
Viele Grüße, Ricardo
Soweit ich sehe, geht es bei mir auch wieder. Vielen Dank für die Behebung.
Gruß
G.
hole dieses alte Thema noch mal hoch, da es mir doch noch nicht so gefällt.
@Boris
Der Request Seperator ist nicht einstellbar (warum man das braucht, weis ich nicht). Es gibt ja das Attribut, und das sieht wenn man ein Device neu anlegt so aus
(http://forum.fhem.de/index.php?action=dlattach;topic=41887.0;attach=45222;image)
das liegt wohl an Zeile 87
$attr{$name}{"requestSeparator"}= "\000";
da fehlt ein Backslash
$attr{$name}{"requestSeparator"}= "\\000";
funktioniert.
Ich würde das Attribut aber nicht festlegen sondern als Default in Zeile 555 angeben
my $requestSeparator= AttrVal($name, "requestSeparator", "\\000");
somit kann man den request Seperator beliebig festlegen, und das Problem, das es nach einem löschen oder festlegen des Request Seperators nicht mehr läuft, ist erst mal gelöst.
LG
Tom_S
Hallo Tom_S,
das Attribut ist per Default nicht mit einem literalen "\000" vorbelegt sondern mit \000, der oktalen Darstellung des Zeichens mit dem Ordinalwert 0, also NUL im ASCII-Kode. Es fehlt also kein Backslash.
Das Attribut ist auch absichtlich per Default gesetzt. Wenn der Wert als Default am Attribut vorgegeben wäre, könnte man niemals ohne Request-Separator arbeiten.
Viele Grüße
Boris
hallo Boris,
ZitatWenn der Wert als Default am Attribut vorgegeben wäre, könnte man niemals ohne Request-Separator arbeiten.
leuchted mir ein. Was aber in
$attr{$name}{"requestSeparator"}= "WERT"
steht, ist doch das, was der User beim Attribut eingibt oder?
Was soll ich denn eingeben, wenn ich \000 erhalten möchte. ASCII 0 kann ich nicht eingeben.
LG
Tom_S
PS:
und ohne Request Seperator kann man so auch nicht arbeiten.
Man kann das Attribut zwar löschen, wie in der Commandref beschrieben, es ist aber nach einem Neustart wieder auf default. Also ganz o.K. ist es irgendwie noch nicht.
Was funktioniert an
attr <name> requestSeparator \000
und
deleteattr <name> requestSeparator
in der Konfigurationsdatei nicht?
Du willst aber doch nur eines von beiden, und das erste ist auch der Default. Ich weiß also nicht, worauf Du hinaus willst.
hallo Boris,
der Requestseperator wird doch in der classdef verwendet, um die Befehle zu trennen und einzeln zu senden.
Den lege ich dort doch selber mit "\000" fest. Ich habe ehrlich gesagt nicht verstanden, warum man ihn ändern oder abschalten können sollte. Wenn ich in der classdef keinen Eintrag "\000" habe, wird doch sowieso alles als ein Befehl verschickt.
Aber da es das Attribut einmal gibt, erwarte ich eigentlich, das in der Deteilansicht auch der richtige Wert angezeigt wird und das es so auch in der fhem.conf abgespeichert wird, und nicht ein Zeichen, das ich hier nicht einfügen kann. (siehe Post weiter oben).
Das eigendliche Problem ist wohl, das dieses offensichtlich leere Attribut gerne mal gelöscht wird, oder es zu Fehlern beim sichern der fhem.conf kommt und danach keine doppelten Befehle mehr gehen. In der config wird das Attribut auch mit [NUL] gespeichert.
LG
Tom_S