Kommando schützen

Begonnen von NeuFehm, 25 Dezember 2014, 01:33:50

Vorheriges Thema - Nächstes Thema

NeuFehm

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!

Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Christian.

FHEM reference:
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.
Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee

NeuFehm

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!
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Dr. Boris Neubert

Hallo, mach mal bitte Tüdelchen um die Escape - Sequenzen.

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

Dr. Boris Neubert

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

NeuFehm

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. :(





Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Dr. Boris Neubert

Bitte den angehefteten Beitrag beachten.

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

NeuFehm

#7
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"
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Christian.

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.
Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee

NeuFehm

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!
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Dr. Boris Neubert

Bitte den angehefteten Beitrag beachten.

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

Christian.

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.
Raspberry Pi 3 mit FHEM; Arduino Nano mit ConfigurableFirmata (S0-Stromzähler); nanoCUL (MAX!); SIGNALduino (RXB6, 433 MHz); eBus; RS485 & D0 (SolarView); DVB-T (Thermo-/Hygrometer); Z-Wave; ZigBee

NeuFehm

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


Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

NeuFehm

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~
Raspberry Pi B+
RS 485 Schnittstellen: DIGITUS DA-70157, LINKSPTITE RS485/GPIO Shield for Raspberry Pi
RS485 Geräte: Ultraschallsensor für Zisternenfüllstand (Eigenbau), 4x8 Relais-M-Mastermodule (Eigenbau), 6 T-Module (Schalter und 3 analoge Eingänge) (Eigenbau)
sonstige Hardware: 2 Relay Modul

Dr. Boris Neubert

Hallo,

einfach die aktuelle Version nehmen und

deleteattr requestSeparator

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