FHEM Forum

FHEM - Hausautomations-Systeme => Sonstige Systeme => Thema gestartet von: NeuFehm am 25 Dezember 2014, 01:33:50

Titel: Kommando schützen
Beitrag von: NeuFehm am 25 Dezember 2014, 01:33:50
Wenn ich mein "alle Relais aus"-Kommando per classdef absetze,
wird selbiges an den Stellen "chr(0)" automatisch aufgeteilt und somit nicht ausgeführt. :(

Inhalt classdef:
set off cmd {chr(35).chr(77).chr(36).chr(80).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(13).chr(10)}

Wie kann ich das Kommando "schützen"? Klammern? Escapen?
Danke!

Titel: Antw:Kommando schützen
Beitrag von: Christian. am 25 Dezember 2014, 08:15:58
FHEM reference (http://fhem.de/commandref.html#ECMDClassdef):
ZitatA \000 (octal representation of control char with code zero) can be used to split the command into chunks. This is required for sending multiple Ethersex commands for one command in the class definition. The result string for the command is the concatenation of all responses received from the physical device. Use \x00 for literal zero bytes.
Vielleicht hat das etwas mit Deinem Problem zu tun. Probier doch mal eine Zeichenkette , z.B. "\x23\x4D ... ", statt der vielen chr()-Aufrufe.
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 25 Dezember 2014, 13:19:08
Hallo Christian,

habe in meiner classdef geändert von:
set off cmd {chr(35).chr(77).chr(35).chr(80).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(13).chr(10)}
auf
set off cmd {\x23\x4Dx\x24\x50\x3B\x00\x3B\x00\x3B\x00\x3B\x00\x3B\x0D\x0A}

Dies funktioniert nicht. Im log:
leider nicht.
Das log gibt aus:
2014.12.25 12:39:11 1: PERL WARNING: Backslash found where operator expected at (eval 81) line 1, near "x0D\"
2014.12.25 12:39:11 3: eval: {\x23\x4Dx\x24\x50\x3B\x00\x3B\x00\x3B\x00\x3B\x00\x3B\x0D\x0A}

Hier nochmal das komplette Thema
-------------------------------------------
Das Ziel
1. Relaismodul per ECMD an FHEM anbinden.
2. Schaltvorgänge testen (alle Relais an/alle Relais aus)

Die fhem.cfg
#Relais definieren
define myrelais ECMD serial /dev/ttyAMA0@9600
attr myrelais classdefs myrelaisdevice=/opt/fhem/relais.classdef

define AlleRelais ECMDDevice myrelaisdevice
attr AlleRelais IODev myrelais
attr AlleRelais room Garten

Die relais.classdef
set on cmd {chr(35).chr(77).chr(35).chr(80).chr(59).chr(255).chr(59).chr(255).chr(59).chr(255).chr(59).chr(255).chr(59).chr(13).chr(10)}
set off cmd {chr(35).chr(77).chr(35).chr(80).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(13).chr(10)}

Im Webfrontend erscheint im Raum "Garten" ein Lampe mit der Beschriftung "AlleRelais" und ein on-Link und off-Link.
Soweit so gut.
Beim klick auf das on, wow, alle Relais ziehen, die Lampe im Frontent leuchtet. Ja, genau so wollte ich es.

Klick ich jedoh auf das off, so passiert nichts, da ich keine Rückfrage eingebaut habe, geht natürlcih die Lampe nicht aus.
Das wäre dann mal eine nächste Aufgabe. Möchte mich mit Eurer Hilfe aber nun dem Thema des off-commands zuwenden.

Im Log erscheint nämlich:
2014.12.25 00:37:14 5: Cmd: >set AlleRelais off<
2014.12.25 00:37:14 5: ECMDDevice: Analyze command >{chr(35).chr(77).chr(36).chr(80).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(13).chr(10)}<
2014.12.25 00:37:14 5: myrelais: command split into 5 parts.
2014.12.25 00:37:14 5: myrelais: sending command "#M$P;"
2014.12.25 00:37:14 5: SW: 234d24503b
2014.12.25 00:37:14 5: myrelais: sending command ";"
2014.12.25 00:37:14 5: SW: 3b
2014.12.25 00:37:14 5: myrelais: sending command ";"
2014.12.25 00:37:14 5: SW: 3b
2014.12.25 00:37:14 5: myrelais: sending command ";"
2014.12.25 00:37:14 5: SW: 3b
2014.12.25 00:37:14 5: myrelais: sending command ";\r\n"
2014.12.25 00:37:14 5: SW: 3b0d0a

Also wird hier der Befehlsstring bei den ASCII-0-Werten gesplittet. Dadurch funktioniert natrürlich das off-Schalten nciht.
Christians Ansatz scheint die richtige Richtung zu sein, aber funktioniert nicht, oder ich habe was falsch gemacht, wie so immer als "Anfänger" ;).

Aber vlt. liegt der Hund noch wo ganz anders begraben?
Wer hat eine Idee, oder liegt es evtl. sogar am ECMD oder ECMD-Device-Modul selbst?

Vielen lieben Dank!
Titel: Antw:Kommando schützen
Beitrag von: Dr. Boris Neubert am 25 Dezember 2014, 15:19:41
Hallo, mach mal bitte Tüdelchen um die Escape - Sequenzen.

Grüße
Boris
Titel: Antw:Kommando schützen
Beitrag von: Dr. Boris Neubert am 25 Dezember 2014, 17:53:39
Hallo,

nachdem ich mir den Code angesehen habe, dürfte keine der Varianten eine Null erlauben. Ich habe daher eine Funktion aktiviert, die bereits eingebaut aber noch stummgeschaltet war: die Attribute requestSeparator und responseSeparator. Aktualisiertes Modul anbei.

Bitte einmal das Gerät mit
attr yourECMDDevice requestSeparator Trenner
ergänzen und Trenner statt \000 im Kommando verwenden.

Viele Grüße
Boris
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 26 Dezember 2014, 21:35:44
Ich glaube ich habe es nicht verstanden:
1. ich habe meine fhem.cfg per letzte Zeile angepasst
und einen Seperator definiert, der garantiert nicht vorkommt in meinen Befehlen: °
siehe letzte Zeile

#Relais definieren
define myrelais ECMD serial /dev/ttyAMA0@9600
attr myrelais classdefs myrelaisdevice=/opt/fhem/relais.classdef
attr myrelais requestSeparator °

Dann habe ich wie gewohnt den Befehl gesendet:
set on cmd {chr(35).chr(77).chr(35).chr(80).chr(59).chr(255).chr(59).chr(255).chr(59).chr(255).chr(59).chr(255).chr(59).chr(13).chr(10)}
# geht

set off cmd {chr(35).chr(77).chr(35).chr(80).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(0).chr(59).chr(13).chr(10)}
# geht nicht

Ich glaube ich habe das falsch verstanden:
Die Definition eines Seperators sagt dem Modul, dass es nun nicht mehr bei chr(0) trennen soll, sondern beim Seperator.
Wenn man also einen Seperator definiert, der ohnehin nicht vorkommt, dann wird in meinem Fall der Befehl nie getrennt und
quasi 1:1 zur Schnittstelle geschickt.

PS.: habe natürlich auch probiert alles in hex zu schreiben:
set off cmd {"\x23\x4Dx\x24\x50\x3B\x00\x3B\x00\x3B\x00\x3B\x00\x3B\x0D\x0A"}
und habe " um den ganzen Befehl hinzugefügt, oder habe ich auch "Tütchen" falsch interprediert?

Habe gar nicht erst gegoogelt, weil ich dachte, da kommen eh falsche Ergebnisse, wenn man nach "Tütchen Hexcode" sucht ;)
Daher brauch ich nochmal Hilfe. :(





Titel: Antw:Kommando schützen
Beitrag von: Dr. Boris Neubert am 26 Dezember 2014, 21:48:35
Bitte den angehefteten Beitrag beachten.

Viele Grüße
Boris
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 26 Dezember 2014, 21:50:37
Die ECMD hatte ich heruntergeladen, überspielt und Fhem mit /etc/init.d/fhem stop und /etc/init.d/fhem start "integriert".

Doch immer noch:

2014.12.26 21:58:05 5: myrelais: command split into 5 parts.
2014.12.26 21:58:05 5: myrelais: sending command "#M$P;"
2014.12.26 21:58:05 5: SW: 234d24503b
2014.12.26 21:58:05 5: myrelais: sending command ";"
2014.12.26 21:58:05 5: SW: 3b
2014.12.26 21:58:05 5: myrelais: sending command ";"
2014.12.26 21:58:05 5: SW: 3b
2014.12.26 21:58:05 5: myrelais: sending command ";"
2014.12.26 21:58:05 5: SW: 3b
2014.12.26 21:58:05 5: myrelais: sending command ";\r\n"
2014.12.26 21:58:05 5: SW: 3b0d0a

Leider passiert das auch bei Test:
set off cmd {chr(35).chr(77).chr(36).chr(80).chr(59)."\x00".chr(59)."\x00".chr(59)."\x00".chr(59)."\x00".chr(59).chr(13).chr(10)}

Ich habe nur Erfolg, wenn ich die ECMD umschreibe, also nach \000 suche und die 2 Fundstellen in (Octal) \040 oder einem anderen Wert umschreibe, der nicht im Code vorkommt.
Aber das fühlt sich für mich "falsch" an....

Aber dann erhalte ich ein schönes Log: 2014.12.27 00:45:01 5: myrelais: sending command "#M$P;\000;\000;\000;\000;\r\n"
und alle Relais schalten "off"
Titel: Antw:Kommando schützen
Beitrag von: Christian. am 27 Dezember 2014, 07:26:29
Füge zum Debuggen mal in ECMD_Write vor der Zeile
ECMD_Log $hash, 5, "command split into " . ($#ecmds+1) . " parts." if($#ecmds>0);
(Zeile 553 in Boris' neuer Version) folgende Zeile ein
ECMD_Log $hash, 5, "$requestSeparator: >$requestSeparator<";
und lade das Modul mittels reload 66_ECMD neu. Setz dann nochmal Deinen Befehl ab und prüf das Log. Vor
myrelais: command split into 5 parts.
müsste jetzt der Separator ausgegeben werden. Deine Fehlerbeschreibung hört sich so an, als ob es das Zirkumflex-Zeichen ° nicht bis hierher schafft.
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 27 Dezember 2014, 23:30:56
Hallo Christian,

ich möchte ja gar nicht dass mein Befehl getrennt wird.
Im Gegenteil, ich möchte verhindern, dass fhem irgendwo einen "Seperator" entdeckt.
Insofern such ich eine Möglichkeit, wie ich fhem sagen kann, dass er mit der Trennerei aufhören soll.
Hab ja auch eine gefunden, glaube nur, dass das nciht die richtige Lösung sein kann.
Das Thema wird also dann wieder interessant, wenn ich mal mehrere Befehle senden muss.

Trotzdem vielen Dank für Deine Hilfe!
Titel: Antw:Kommando schützen
Beitrag von: Dr. Boris Neubert am 28 Dezember 2014, 08:09:09
Bitte den angehefteten Beitrag beachten.

Viele Grüße
Boris
Titel: Antw:Kommando schützen
Beitrag von: Christian. am 28 Dezember 2014, 08:52:49
Zitat von: NeuFehm am 27 Dezember 2014, 23:30:56ich möchte ja gar nicht dass mein Befehl getrennt wird.

Ich hatte das schon verstanden. Offenbar wird der Befehl bei Dir getrennt, obwohl Du das nicht möchtest. Das Trennzeichen scheint folglich immer noch das Nullbyte zu sein. Um diese Vermutung zu bestätigen, solltest Du für die Fehlersuche mal das Trennzeichen ausgeben lassen. Dann siehst Du, ob das von Dir gesetzte Trennzeichen überhaupt verwendet wird, und kannst der Sache weiter auf die Spur gehen.
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 20 Oktober 2015, 20:16:24
So habe das Thema nochmal aufgegriffen, da ich jetzt ein Testsystem aufgebaut und etwas mehr Ahnung mit FHEM habe ;)

Ich bin also soweit, dass ich Borische 666 heruntergeladen habe,
die fhem.cfg sieht dann wie folgt aus:

define mylampe ECMD serial /dev/ttyUSB0@9600
attr mylampe classdefs mylampedevice=/opt/fhem/lampe.classdef
attr mylampe verbose 5
attr mylampe partial 2
attr mylampe requestSeparator ~

define Testlicht ECMDDevice mylampedevice 40 1 #die 40 ist die Relaikartenadresse und die 1 das 1. Relais
attr Testlicht IODev mylampe
attr Testlicht room Test

------------lampe.classdef------------
params M_Adresse M_Relais
set off cmd {chr(35).chr(77).chr(%M_Adresse).chr(69).chr(1).chr(%M_Relais).chr(0).chr(13).chr(10)}  #die chr(0) sorgt für das splitproblem
set on cmd {chr(35).chr(77).chr(%M_Adresse).chr(69).chr(1).chr(%M_Relais).chr(1).chr(13).chr(10)}
-----------------

und von Christian seine Zeile eingefügt habe:
ECMD_Log $hash, 5, "$requestSeparator: >$requestSeparator<";

Das logfile gibt nun aus:

2015.10.20 19:57:16 5: mylampe: : ><
2015.10.20 19:57:16 5: mylampe: command split into 2 parts.
2015.10.20 19:57:16 5: mylampe: sending command "#M(E\001\001"
2015.10.20 19:57:16 5: SW: 234d28450101
2015.10.20 19:57:16 5: mylampe: sending command "\r\n"
2015.10.20 19:57:16 5: SW: 0d0a


Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 20 Oktober 2015, 20:35:45
Dann habe ich Boris Post befolgt und den vorher definierten Seperator ~ ein meinen Befehl (lampe.classdef) eingebaut:
set off cmd {chr(35).chr(77).chr(%M_Adresse).chr(69).chr(1).chr(%M_Relais).chr(126).chr(13).chr(10)} # chr(126) entspricht der "~"
ja, er schaltet die Lampe AUS! Und weil die 0 nicht mehr drin ist, wird auch nicht separiert.

2015.10.20 20:26:04 5: mylampe: : ><
2015.10.20 20:26:04 5: mylampe: sending command "#M(E\001\001~\r\n"
2015.10.20 20:26:04 5: SW: 234d284501017e0d0a
2015.10.20 20:26:04 5: mylampe: Spontaneously received "!M("
2015.10.20 20:26:04 5: mylampe dispatch !M(
2015.10.20 20:26:04 5: mylampe: Spontaneously received "E\001\001~\r\n"
2015.10.20 20:26:04 5: mylampe dispatch E~
Titel: Antw:Kommando schützen
Beitrag von: Dr. Boris Neubert am 20 Oktober 2015, 20:40:39
Hallo,

einfach die aktuelle Version nehmen und

deleteattr requestSeparator

Grüße
Boris
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 20 Oktober 2015, 20:56:09
in die fhem.cfg eingefügt:

deleteattr mylampe requestSeparator

Lampe geht aus!!! :)

2015.10.20 20:53:52 5: mylampe: sending command "#M(E\001\001\000\r\n"
2015.10.20 20:53:52 5: SW: 234d28450101000d0a
2015.10.20 20:53:52 5: mylampe: Spontaneously received "!"
2015.10.20 20:53:52 5: mylampe dispatch !
2015.10.20 20:53:52 5: mylampe: Spontaneously received "M(E\001\001\000\r\n"
2015.10.20 20:53:52 5: mylampe dispatch M(E

cool, alles so, wie es sein muss/kann DANKE!!!

Jetzt muss ich nur noch ein read hinbekommen, also die Antwort auswerten ;)
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 28 Oktober 2015, 15:52:43
Als nächsten Schritt muss ich ein READ realisieren.

-----------fhem.cfg---------------
# Lampe definieren
define mylampe ECMD serial /dev/ttyUSB0@9600
attr mylampe classdefs mylampedevice=/opt/fhem/lampe.classdef
attr mylampe verbose 5 # damit ich was sehe
attr mylampe partial 3 # erster Versuch ein "ganzes" read zu bekommen

-------------lampe.classdef-------------
# testweise mal den ganzen Antwortstring gematched
reading antwort match "!M\(E\\005\\001\\001\\r\\n"

------------- log ---------------------
2015.10.27 21:40:13 5: mylampe: Spontaneously received "#"
2015.10.27 21:40:13 5: mylampe dispatch #
2015.10.27 21:40:13 5: mylampe: Spontaneously received "M(E\005\001\001\r\n"
2015.10.27 21:40:13 5: mylampe dispatch M(E

2015.10.27 21:40:13 5: mylampe: Spontaneously received "!"
2015.10.27 21:40:13 5: mylampe dispatch !
2015.10.27 21:40:13 5: mylampe: Spontaneously received "M(E\005\001\000\r\n"
2015.10.27 21:40:13 5: mylampe dispatch M(E

------- Problem-----------
Wenn ich nun eine Lampe schalte, dann sendet die Lampe eine Antwort: !M(E\005\001\000\r\n
Ich habe nun das Problem, dass er irgendwie immer den Antwortstring aufteilt (siehe log).
Irgendwas mache ich also noch grundsätzlich falsch. :(
Habt ihr ne Idee?
Titel: Antw:Kommando schützen
Beitrag von: Dr. Boris Neubert am 28 Oktober 2015, 16:26:49
Hallo,

nimm bitte mal

!M\(E\005\001\000\r\n

als Match. Gesendet wird Ausrufezeichen, M, Klammer auf, E, das Zeichen mit Code 5, das Zeichen mit Code 1, ..., CR, LF.

Bitte nächstes Mal die volle classdef anhängen oder einkopieren - mich irritiert, dass Dein Kommando antwort heissen soll.

Viele Grüße
Boris
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 28 Oktober 2015, 16:56:22
Oh... sieht aus, als würde das jetzt funktionieren?
jetzt muss ich nur noch ..... ;) überlegen?
also ich will ja im Prinzip, dass fhem erkennt, dass die lampe wirklich aus ist,
und dann den Status auf Grund des reads auf "off" setzt...

Aber sehe ich richtig, dass Dein Tipp schon mal gut war?

--------log---------------
2015.10.28 16:52:54 5: mylampe: sending command "#M(E\001\001\000\r\n"
2015.10.28 16:52:54 5: SW: 234d28450101000d0a
2015.10.28 16:52:54 5: mylampe: Spontaneously received "!M"
2015.10.28 16:52:54 5: mylampe dispatch !M
2015.10.28 16:52:54 5: mylampe: Spontaneously received "(E\001\001\000\r\n"
2015.10.28 16:52:54 5: mylampe dispatch (E

2015.10.28 16:52:54 5: mylampe: match regex !M\(E\001\001\000\r\n for reading antwort of device Testlicht with class mylampedevice

----------classdef------------
params M_Adresse M_Relais
set off cmd {chr(35).chr(77).chr(%M_Adresse).chr(69).chr(1).chr(%M_Relais).chr(0).chr(13).chr(10)}
set on cmd {chr(35).chr(77).chr(%M_Adresse).chr(69).chr(1).chr(%M_Relais).chr(1).chr(13).chr(10)}
reading antwort match "!M\(E\005\001\000\r\n"

---------fhem.cfg-----------
# TEST
# Lampe definieren
define mylampe ECMD serial /dev/ttyUSB0@9600
attr mylampe classdefs mylampedevice=/opt/fhem/lampe.classdef
attr mylampe verbose 5
attr mylampe partial 3
#deleteattr mylampe requestSeparator

define Testlicht ECMDDevice mylampedevice 40 1
attr Testlicht IODev mylampe
attr Testlicht room Test


Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 28 Oktober 2015, 17:04:30
Wäre der nächste Schritt nun in der classdef einen postproc zu definieren, der nun die "antwort" auswertet und dann die jeweiligen Stati setzt?
Titel: Antw:Kommando schützen
Beitrag von: Dr. Boris Neubert am 28 Oktober 2015, 17:09:51
ja
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 28 Oktober 2015, 17:18:37
Danke bis hierher, werde das Ergebnis wieder posten ;)
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 29 Oktober 2015, 08:25:36
Leider komm ich schon wieder nicht voran.
Muss mich mal noch mehr outen:

Wenn ich Änderungen mache in der classdef dann gehe ich auf "Edit config" in FHEM,
ändere nichts und speichere die fhem.cfg, weil ich das Gefühl habe, dass FHEM
sonst nicht meine Änderungen in der classdef annimmt.

Dann habe ich mein "reading Antwort match "!M\(E\001\001\000\r\n"  mit einem einfachen
postproc ohne Funktion ergänzt:
reading Antwort postproc {my $status = "off"}
Das hat soweit funktioniert, denn in den Readings vom Device stand:
antwort      off   2015-10-28 23:23:13
Dann habe ich etwas mit "Antwort" experimentiert und geändert:
in reading "status" und reading "state", "mylampe" und nie hat es den Status "aktualisiert"
Irgendwann habe ich "Testlicht" genommen und hatte das Gefühl, dass alles funktionierte.

Was wäre denn richtig? Welchen Namen müsste das Reading eingentlich bekommen.
Boris hatte sich schon mal gewundert warum ich das "Antwort" nenne. Wie wäre es "logischer"?

Außerdem die Frage, ist das richtig, dass ich immer die fhem.cfg scheinbar editiere und dann speichere,
nur um die Änderung der classdef zu "registrieren"?

Irre irgenwie viel zu lang umher ohne ein Stück festen Boden.
Kann mich jemand aufhalten? ;)

Derzeit wird auch nicht gematched, evtl. habe ich wieder die regex falsch?
Ich wollte dass er sowohl bei ...E\001... als auch bei ...E\005.... matched:
"!M\(E\00[1-5]\001\000\r\n"

Aktuelle Daten:

-----------fhem.cfg-------------
# TEST
# Lampe definieren
define mylampe ECMD serial /dev/ttyUSB0@9600
attr mylampe classdefs mylampedevice=/opt/fhem/lampe.classdef
attr mylampe partial 3
attr mylampe verbose 5
deleteattr mylampe requestSeparator

define Testlicht ECMDDevice mylampedevice 40 1
attr Testlicht IODev mylampe
attr Testlicht room Test

--------lampe.classdef----------

params M_Adresse M_Relais
set off cmd {chr(35).chr(77).chr(%M_Adresse).chr(69).chr(1).chr(%M_Relais).chr(0).chr(13).chr(10)}
set on cmd {chr(35).chr(77).chr(%M_Adresse).chr(69).chr(1).chr(%M_Relais).chr(1).chr(13).chr(10)}
reading Testlicht match "!M\(E\00[1-5]\001\000\r\n"
reading Testlicht postproc {my $status = "off"}

------------log------------------------
2015.10.29 08:22:25 5: mylampe: sending command "#M(E\001\001\001\r\n"
2015.10.29 08:22:25 5: SW: 234d28450101010d0a
2015.10.29 08:22:25 5: mylampe: Spontaneously received "!M"
2015.10.29 08:22:25 5: mylampe dispatch !M
2015.10.29 08:22:25 5: mylampe: Spontaneously received "(E\001\001\001\r\n"
2015.10.29 08:22:25 5: mylampe dispatch (E

2015.10.29 08:22:29 5: mylampe: sending command "#M(E\001\001\000\r\n"
2015.10.29 08:22:29 5: SW: 234d28450101000d0a
2015.10.29 08:22:29 5: mylampe: Spontaneously received "!"
2015.10.29 08:22:29 5: mylampe dispatch !
2015.10.29 08:22:29 5: mylampe: Spontaneously received "M(E\001\001\000\r\n"
2015.10.29 08:22:29 5: mylampe dispatch M(E

Titel: Antw:Kommando schützen
Beitrag von: Dr. Boris Neubert am 29 Oktober 2015, 08:34:26
Die Tüdelchen im regulären Ausdruck sind überschüssig und müssen weg.

Bitte lies nochmal die Commandref. Dort steht, wie Du die Classdef neu einliest.

Außerdem gibt es dort auch ein Beispiel, wie postproc funktioniert. Der Rückgabewert des Perl-Codes wird übernommen - der Perl-Code operiert auf $_. Ohne Perl-Kenntnisse kommst Du an dieser Stelle nicht weiter.

Grüße
Boris
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 03 November 2015, 22:31:53
Tütchen = "" ?

das in der Commandref aufgeführte "set mylampe reopen" macht zwar was, aber liest die classdef nicht neu ein.
Dann habe ich die Commandref nochmal nach "classdef" oder "einlesen" durchsucht und hatte keine Treffer.
Ich glaube ich kann nur Deine Zeichen nicht richtig deuten... :(

Die postproc und perl ist weniger mein Problem... das glaube kann ich und mein:
reading Testlicht postproc {fhem "set Testlicht off"} war nur ein Test, weil ich dachte, dass wenn das MATCH stimmt,
dann der postprozessor abgearbeitet wird und dann der zumindest "stur" den Stauts setzt...


Achja, mein Regextester sagt, ich soll: !M\(E\\00[1,5]\\001\\000\\r\\n nehmen um !M(E\005\001\000\r\n oder !M(E\001\001\000\r\n zu matchen.
Warum soll ich die \\ doch als \ nehmen? Ist das FHEM-typisch?


Und inzwischen wieder eine Erkenntnis:
Test funktioniert mit: reading Testlicht match "!M\(E.*\r\n"
funktioniert nicht mit: reading Testlicht match "!M\(E.*\000\r\n"
funktioniert nicht mit: reading Testlicht match "!M\(E.*\\000\r\n"

Im Log: !M(E\005\001\000\r\n

Daher denke ich, dass er was anderes empfängt, als das Log ausgibt.
Aber zur Not könnte ich ja jetzt wenigstens das Reading mit einem postprozessor auswerten... ?
Weil "!M" ist immer ne Antwort eines Relais, welches mit \r\n endet.
Also "!M.*\r\n" wäre wahrscheinlich sogar die richtige Variante und den Rest mit Perl und postproc?


Titel: Antw:Kommando schützen
Beitrag von: Dr. Boris Neubert am 05 November 2015, 19:26:41
Zitat von: NeuFehm am 03 November 2015, 22:31:53
Tütchen = "" ?

Tüdelchen! https://de.wikipedia.org/wiki/Anf%C3%BChrungszeichen (https://de.wikipedia.org/wiki/Anf%C3%BChrungszeichen)

Zitat
Achja, mein Regextester sagt, ich soll: !M\(E\\00[1,5]\\001\\000\\r\\n nehmen um !M(E\005\001\000\r\n oder !M(E\001\001\000\r\n zu matchen.
Warum soll ich die \\ doch als \ nehmen? Ist das FHEM-typisch?

Weil \000 in der Ausgabe kein Literal ist sondern für eine binäre Null steht. Das macht eine spezielle Funktion zur Darstellung: alle nichtdruckbaren Zeichen werden durch die Oktaldarstellung ersetzt. Deswegen geht auch \00[0-5] im regulären Ausdruck nicht, vermutlich aber [\000-\005].


Grüße
Boris
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 14 Dezember 2015, 22:31:04
ich komme immer noch nicht mit dem MATCHING weiter :(

Meine classdef:
reading Testlicht match "\!M\(E\001\001\001\r\n"

auch probiert in den Varianten:
reading Testlicht match "!M\(E\001\001\001\r\n"
reading Testlicht match !M\(E\001\001\001\r\n
reading Testlicht match \!M\(E\001\001\001\r\n

Wenn ich die Lampe schalte erscheint im Log trotzdem:
2015.12.14 22:14:48 5: mylampe: sending command "#M(E\001\001\001\r\n"
2015.12.14 22:14:48 5: SW: 234d28450101010d0a
2015.12.14 22:14:48 5: mylampe: Spontaneously received "!"
2015.12.14 22:14:48 5: mylampe dispatch !
2015.12.14 22:14:48 5: mylampe: Spontaneously received "M(E\001\001\001\r\n"
2015.12.14 22:14:48 5: mylampe dispatch M(E

Warum trennt der den beim "!"???
Warum ist die letzte und vorletzte Logzeile nicht identisch, liegt hier vlt. das "nichterkennen"-Problem?
Hat jemand eine Idee?
Titel: Antw:Kommando schützen
Beitrag von: NeuFehm am 15 Dezember 2015, 21:52:51
Übrigens ist das hier ein Auzug aus dem Logfile
Warum schreibt er ein anderes received als ein dispatch?
Vlt. ist hier der Hund begraben?

2015.12.15 21:24:33 5: mylampe: Spontaneously received "M(E\001\001\000\r\n"
2015.12.15 21:24:33 5: mylampe dispatch M(E^A^A^@^M