[ECMDDevice] Fehlermeldung nach letztem Update

Begonnen von Gernott, 06 Oktober 2015, 23:34:12

Vorheriges Thema - Nächstes Thema

Gernott

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.

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Gernott

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.

Dr. Boris Neubert

Hallo,

ich schaue es mir am Wochenende an. Gehe bitte solange auf die Vorversion zurück.

Viele Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Gernott

Hallo Boris

Ich hatte den Code ohne Änderung von 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.

kpwg

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

Gernott

#7
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.

Dr. Boris Neubert

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
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

Gernott

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".

Dr. Boris Neubert

Super.

AttrVal tut nicht, was ich erwarte.

Mehr dazu demnächst in diesem Theater.

Gute Nacht
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

kpwg

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

Dr. Boris Neubert

Hallo,

hab's gefixt und eingecheckt. Ab sofort im Repo oder morgen per Update erhältlich.

Grüße
Boris
Globaler Moderator, Developer, aktives Mitglied des FHEM e.V. (Marketing, Verwaltung)
Bitte keine unaufgeforderten privaten Nachrichten!

kpwg

Rückmeldung: Update funktioniert! Danke Boris.  ;)

Viele Grüße, Ricardo

Gernott

Soweit ich sehe, geht es bei mir auch wieder. Vielen Dank für die Behebung.

Gruß
G.