Probleme mit ECDM - expected

Begonnen von Icinger, 28 Juli 2014, 14:02:30

Vorheriges Thema - Nächstes Thema

Icinger

Hi Leute,

Das ECMD-Modul bietet ja seit einiger Zeit an, die Antwort eines Geräts mit expected zu empfangen.

Jetzt wollte ich meine Chromoflex-Classdef umstellen, um auch die Antworten auswerten zu können.

Allerdings bekomme ich immer, egal was ich als expected angebe, folgenden Fehler im Log:
2014.07.28 13:50:14 1: Chromoflex: unexpected answer "=1008fffffea711613cff00f3b2272deab1\r\n>" received (wrote "!x00100e0811613ca7fffffe80010000d187\r\r", expected .*)

Der Anfang der Antwort ist immer gleich: =1008fffffe, danach kommen weitere Daten wie RSSI etc, und zum Schluss ein \r\n

Der relevante Teil in der Classdef:
set cmd params comnd
set cmd cmd {ChromoCommand("%NAME","%comnd")}
set cmd expect ".*"
set cmd postproc {my $d=shift;;chr2hex($d);;}


Was ich schon probiert habe:
set cmd expect ".*"
set cmd expect ".*\r\n"
set cmd expect "=1008fffffe.*\r\n"


Irgendwie versteh ich grade die Welt nicht  :o Woran scheitere ich da?

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Dr. Boris Neubert

Das ist merkwürdig.

Bitte poste mal die volle Kommunikation mit Gesprächigkeit auf oberem Anschlag (attr global verbose 5 und attr Chromoflex  logTraffic 5).

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

Icinger

Log mit attr global verbose 5 und attr Chromoflex  logTraffic 5:

2014.07.28 15:56:30 4: HTTP FHEMWEB:193.83.131.245:1028 GET /fhem&room=Unsorted&cmd=set+RGB1+cmd+Aus
2014.07.28 15:56:30 5: Cmd: >set RGB1 cmd Aus<
2014.07.28 15:56:30 5: ECMDDevice: Analyze command >{ChromoCommand("RGB1","Aus")}<

---Diese Zeilen stammen von meiner 99_MyUtils
2014.07.28 15:56:30 3: CromoCommand called
2014.07.28 15:56:30 3: Original Command: Aus - Translated Command: 0 an Adresse: RGB1(11613C)
2014.07.28 15:56:30 3: Seq: 40 Frame: !x00100e0811613ca8fffffe8001000091c7
------------------------------------------------------

2014.07.28 15:56:30 5: Chromoflex: sending command "!x00100e0811613ca8fffffe8001000091c7\r\r"
2014.07.28 15:56:30 5: Chromoflex: write "!x00100e0811613ca8fffffe8001000091c7\r\r", expect .*
2014.07.28 15:56:30 5: SW: 2178303031303065303831313631336361386666666666653830303130303030393163370d0d
2014.07.28 15:56:30 5: Chromoflex: read "=1008fffffea811613cff00f4b2576febad\r\n>"
2014.07.28 15:56:30 1: Chromoflex: unexpected answer "=1008fffffea811613cff00f4b2576febad\r\n>" received (wrote "!x00100e0811613ca8fffffe8001000091c7\r\r", expected .*)
2014.07.28 15:56:30 5: Chromoflex: received answer "=1008fffffea811613cff00f4b2576febad\r\n>"
2014.07.28 15:56:30 5: Postprocessing "=1008fffffea811613cff00f4b2576febad\r\n>" with perl command {my $d=shift;;chr2hex($d);;}.
2014.07.28 15:56:30 5: Postprocessed value is "".
2014.07.28 15:56:30 5: Triggering RGB1 (1 changes)
2014.07.28 15:56:30 5: Notify loop for RGB1 cmd
2014.07.28 15:56:30 5: Stat_Rain: Notification of 'RGB1' received. Device not monitored.
2014.07.28 15:56:30 5: Stat_Strom: Notification of 'RGB1' received. Device not monitored.
2014.07.28 15:56:30 5: Stat_Wind: Notification of 'RGB1' received. Device not monitored.
2014.07.28 15:56:30 4: eventTypes: ECMDDevice RGB1 cmd -> cmd
2014.07.28 15:56:30 4: eventTypes: ECMDDevice RGB1 state: cmd -> state: cmd
2014.07.28 15:56:30 4: ECMDDevice RGB1 cmd



PS: Habe extra heute früh nochmal nechgeguggt, ob ich eh die aktuellste Version habe.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Dr. Boris Neubert

Interessant. Offenbar verhält sich der //-Operator in 66_ECMD.pm

    if($answer !~ m/^$expect$/) {

so, als ob er eine m-Option (Input ist mehrzeilig) mitbekommen hätte. Hat er aber nicht. Merkwürdig.

Dein Pattern kannst Du mit diesem Befehl auf der Unix-Kommandozeile testen:

perl -e 'print("=1008fffffea811613cff00f4b2576febad\r\n>" =~ m/^.*\r\n>$/ ? "match\n" : "no match\n");'


Bei Deinen Versuchen hat lediglich das abschließende > im Pattern gefehlt.

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

Icinger

Hmmm,

Danke Boris.

Das ">" hatte ich irgendwie überlesen bisher.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Icinger

#5
Hmmm, klappt aber immer noch nicht.

perl -e 'print("=1008fffffea811613cff00f4b2576febad\r\n>" =~ m/^=10([[:xdigit:]]{2})([[:xdigit:]]{6})([[:xdigit:]]{2})([[:xdigit:]]{6})([[:xdigit:]]{2}).*([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{4})\r\n>$/ ? "match\n" : "no match\n");print ("$7\n")'
match
6f


Aber im Log habe ich immer noch:
2014.07.28 18:21:23 1: Chromoflex: unexpected answer "=1008fffffea311613cff00eeb28425e2cd\r\n>" received (wrote "!x00100e0811613ca3fffffe800100002286\r\r", expected /^=10([[:xdigit:]]{2})([[:xdigit:]]{6})([[:xdigit:]]{2})([[:xdigit:]]{6})([[:xdigit:]]{2}).*([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{4})\r\n>$/)


Scheint nicht an dem ">" gelegen zu haben.

PS: Auch wenn ich nur auf "=10.*\r\n>" maskiere, das selbe Problem:

2014.07.28 18:23:31 1: Chromoflex: unexpected answer "=1008fffffea411613cff00f1b2526ce6bf\r\n>" received (wrote "!x00100e0811613ca4fffffe80010200a4c6\r\r", expected /^=10.*>$/)
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Dr. Boris Neubert

Bitte ^ und $ aus dem expect-Regex in der Klassendefinition fortlassen.

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

Icinger

Auch das führt leider nicht zum Erfolg.
2014.07.28 22:33:56 1: Chromoflex: unexpected answer "=1008fffffeab11613cff00f4b083aee9b7\r\n>" received (wrote "!x00100e0811613cabfffffe800100008487\r\r", expected /=10.*>/

Schön langsam verzweifel ich echt schon.....
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Dr. Boris Neubert

Zu viele Änderungen auf einmal...

Das \r\n> am Ende bitte drinlassen.

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

Icinger

2014.07.29 07:41:41 1: Chromoflex: unexpected answer "=1008fffffeab11613cff00f4b382eeeab3\r\n>" received (wrote "!x00100e0811613cabfffffe800100008487\r\r", expected /=10.*\r\n>/)
2014.07.29 07:33:48 1: Chromoflex: unexpected answer "=1008fffffea611613cff00f4b2dbeee9b9\r\n>" received (wrote "!x00100e0811613ca6fffffe800100001d46\r\r", expected /=.*\r\n>/)


Ich glaub, mein Cubie mag da einfach ned Regexen gg

Nachdem das Postproc ja trotzdem aufgerufen wird, wird ich halt mit den Log-einträgen leben (müssen)

Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Dr. Boris Neubert

Machs doch einfach richtig  >:(


Bitte poste die classdef.

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

Icinger

#11
Oje, nicht bös schaun bitte :)

So, hier erstmal die komplette classdef:
Brauchst du nochmal die Kommunikation mit verbose 5 auch?


set init cmd {ChromoInit()}

# SET
set rgb cmd {ChromoColor("%NAME",AttrVal("%NAME","Chromo_R",""),AttrVal("%NAME","Chromo_G",""),AttrVal("%NAME","Chromo_B",""),AttrVal("%NAME","Chromo_D",""))}
set rgb postproc {my $d=shift;;chr2hex($d);;}

# SET
set rgbArgs params ChromoR ChromoG ChromoB ChromoD
set rgbArgs cmd {ChromoColor("%NAME",%ChromoR,%ChromoG,%ChromoB,%ChromoD)}
set rgbArgs postproc {my $d=shift;;chr2hex($d);;}

# Chromo-Antwort:
# "=1008fffffea811613cff00f4b2576febad
# RegEx:
# /^=10([[:xdigit:]]{2})([[:xdigit:]]{6})([[:xdigit:]]{2})([[:xdigit:]]{6})([[:xdigit:]]{2}).*([[:xdigit:]]{2})([[:xdigit:]]{2})([[:xdigit:]]{4})\r\n>$/
#       ^1:Netz          ^2:dest          ^3:Sequenz       ^4:Sender-Addr   ^5: com (kA)     ^Daten   ^6:RSSI   ^7:lqi
#                                        (Bit 8=Antwortbit)
# SET
set cmd params comnd
set cmd cmd {ChromoCommand("%NAME","%comnd")}
set cmd expect "/=10.*\r\n>/"
set cmd postproc {my $d=shift;;CheckFrame("%NAME",$d)}


PS: Stimmt es, dass im postproc das %<arg> nicht ausgewertet wird? Ein Log 3,%comnd liefert nur einen Logeintrag mit
2014.07.29 07:35:59 3: %comnd
Ich hätte die commandref eigentlich so gelesen, dass das überall ersetzt wird, bevor der Perlstring ausgewertet wird.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Dr. Boris Neubert

Zitat von: Icinger am 29 Juli 2014, 08:10:46

set cmd expect "/=10.*\r\n>/"


Was bitte machen die Slashes im Regex?


set cmd expect "=10.*\r\n>"



Zitat
PS: Stimmt es, dass im postproc das %<arg> nicht ausgewertet wird? Ein Log 3,%comnd liefert nur einen Logeintrag mit
2014.07.29 07:35:59 3: %comnd
Ich hätte die commandref eigentlich so gelesen, dass das überall ersetzt wird, bevor der Perlstring ausgewertet wird.

Beantworte ich nur, wenn ich die zugehörige classdef zu sehen bekomme.

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

Icinger

ZitatWas bitte machen die Slashes im Regex?

Ok, danke, ich bin nun runtergestiegen vom Schlauch :)

Beantworte ich nur, wenn ich die zugehörige classdef zu sehen bekomme.

Habe die Classdef jetzt noch auf das richtige Expected geändert und eben testweise das Log eingefügt:

set cmd params comnd
set cmd cmd {ChromoCommand("%NAME","%comnd")}
set cmd expect "=10.*\r\n>"
set cmd postproc {my $d=shift;;CheckFrame("%NAME",$d);;Log 3,"Device: %NAME - Uebergebenes Argument: %comnd"}


bringt nun:
2014.07.29 12:10:40 3: Device: RGB1 - Uebergebenes Argument: %comnd
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Dr. Boris Neubert

Hallo,

es werden nur die Device-Parameter aber nicht die Kommando-Parameter im Postprozessor ausgewertet.

Ich habe mir das jetzt eine Weile im Code angesehen und möchte das nicht ohne guten Grund ändern, weil es viel Arbeit ist.

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