Kommando schützen

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

Vorheriges Thema - Nächstes Thema

NeuFehm

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 ;)
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

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?
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,

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

NeuFehm

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


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

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?
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

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

NeuFehm

Danke bis hierher, werde das Ergebnis wieder posten ;)
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

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

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

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

NeuFehm

#24
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?


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

Zitat von: NeuFehm am 03 November 2015, 22:31:53
Tütchen = "" ?

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

NeuFehm

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?
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

Ü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
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