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
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
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.
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
Hmmm,
Danke Boris.
Das ">" hatte ich irgendwie überlesen bisher.
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.*>$/)
Bitte ^ und $ aus dem expect-Regex in der Klassendefinition fortlassen.
Grüße
Boris
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.....
Zu viele Änderungen auf einmal...
Das \r\n> am Ende bitte drinlassen.
Grüße
Boris
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)
Machs doch einfach richtig >:(
Bitte poste die classdef.
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.
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
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
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
Ok, kein Problem.
Werde sicher auch einen anderen Weg finden.
Danke trotzdem für die Hilfe