FHEM Forum

FHEM - Hausautomations-Systeme => Sonstige Systeme => Thema gestartet von: Gernott am 06 Oktober 2015, 23:34:12

Titel: [ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Gernott am 06 Oktober 2015, 23:34:12
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.
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Dr. Boris Neubert am 06 Oktober 2015, 23:53:31
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
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Gernott am 07 Oktober 2015, 00:17:01
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.
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Dr. Boris Neubert am 07 Oktober 2015, 07:28:59
Hallo,

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

Viele Grüße
Boris
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Dr. Boris Neubert am 10 Oktober 2015, 12:22:28
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
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Gernott am 10 Oktober 2015, 20:33:14
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.
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: kpwg am 11 Oktober 2015, 09:55:21
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
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Gernott am 12 Oktober 2015, 21:33:20
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.
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Dr. Boris Neubert am 12 Oktober 2015, 21:52:24
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
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Gernott am 12 Oktober 2015, 22:26:58
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".
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Dr. Boris Neubert am 12 Oktober 2015, 22:32:42
Super.

AttrVal tut nicht, was ich erwarte.

Mehr dazu demnächst in diesem Theater.

Gute Nacht
Boris
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: kpwg am 15 Oktober 2015, 18:56:48
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
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Dr. Boris Neubert am 17 Oktober 2015, 15:46:50
Hallo,

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

Grüße
Boris
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: kpwg am 18 Oktober 2015, 11:05:18
Rückmeldung: Update funktioniert! Danke Boris.  ;)

Viele Grüße, Ricardo
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Gernott am 18 Oktober 2015, 14:11:36
Soweit ich sehe, geht es bei mir auch wieder. Vielen Dank für die Behebung.

Gruß
G.
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Tom_S am 28 Januar 2016, 17:32:00
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
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Dr. Boris Neubert am 28 Januar 2016, 19:53:46
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
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Tom_S am 28 Januar 2016, 21:07:02
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.
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Dr. Boris Neubert am 29 Januar 2016, 19:16:30
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.
Titel: Antw:[ECMDDevice] Fehlermeldung nach letztem Update
Beitrag von: Tom_S am 29 Januar 2016, 23:39:21
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