Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht

Begonnen von FunkOdyssey, 27 Mai 2017, 11:51:09

Vorheriges Thema - Nächstes Thema

FunkOdyssey

Ich wundere mich über verschiedene Probleme in meinen DOIFs und habe die Vermutung, dass ich etwas falsch mache.

Kann es sein, dass folgender Vergleich gar nicht auf den cmd-Teil 1.3 vergleicht, weil der Punkt evtl. als RegEx oder ähnliches interpretiert wird?


...
[?$SELF:cmd] !~ "1.3|2"
...

amenomade

Zitatweil der Punkt evtl. als RegEx
Ja klar. Mit =~ wird eine Regexp erwartet.

Versuch mal den Punkt zu "escapen" (wie sagt man das auf Deutsch???)

[?$SELF:cmd] !~ "1\.3|2"
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

amenomade

Wobei... "." in Regexp = irgendwelches Buchstaben... inkl "." selbst. Er sollte das schon merken oder?
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

FunkOdyssey

Jepp. Daran habe ich es bemerkt. Die Bedingungen waren irgendwie fast immer wahr. 

Per

Versuch es doch mal als Zahl zu interpretieren, nicht als String.

FunkOdyssey

Ja, das habe ich nun auch so gemacht.
Ich fand halt nur die Variante mit der Pipe | so praktisch, da ich mehrere Werte vergleichen kann. Das geht bei Zahlen dann nicht, oder?

Damian

#6
Das dürfte das sein, was du willst:

[?$SELF:cmd] !~ "(1\.3)|2"
für 1.3 oder 2

Edit: oder

[?$SELF:cmd] !~ "1\.(3|2)" für 1.3 oder 1.2
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Per

Wenn wir schon sparen, ist
[?$SELF:cmd]
nicht identisch mit
$cmd
?

FunkOdyssey

Jepp. Das war mir bekannt. Aber Danke dennoch.

Damian

Zitat von: Per am 29 Mai 2017, 10:23:45
Wenn wir schon sparen, ist
[?$SELF:cmd]
nicht identisch mit
$cmd
?

ja, $cmd ist eleganter, weil kürzer. Vom Parser übersetzt ist allerdings das Erste eine Funktion, das Zweite eine Variable.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Hmm. Irgendwie ist bei mir noch an einigen Stellen der Wurm drin.

Frage zwischendurch:

Warum funktioniert das hier nicht?

[$SELF:cmd_nr,0] != 3


Aber das hier wohl?

[$SELF:cmd_nr,"0"] !~ /3/


Sind cmd_seqnr, cmd_nr und cmd wirklich alles Dezimalzahlen?




Warum wird dieser Vergleich war, obwohl di_jalousien:cmd eigentlich bei 4.2 steht?


[di_jalousien:cmd] =~ "(1\.3)|2|0"


Danke.

amenomade

ZitatWarum wird dieser Vergleich war, obwohl di_jalousien:cmd eigentlich bei 4.2 steht?

Weil "4.2" "2" enthält.
Zitat(1\.3)|2|0"

ZitatSind cmd_seqnr, cmd_nr und cmd wirklich alles Dezimalzahlen?
Abhängig von den Zweigen deines DOIF.
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

FunkOdyssey

#12
Zitat von: amenomade am 03 Juni 2017, 21:39:32
Weil "4.2" "2" enthält.

Schade. Dann muss ich wirklich die längere Schreibweise nutzen. Ich hatte die Hoffnung, es mit RegExp ein wenig kürzer und hübscher zu lösen.

(
[di_jalousien:cmd] == 1.3 or
[di_jalousien:cmd] == 2 or
[di_jalousien:cmd] == 0
)


Zitat von: amenomade am 03 Juni 2017, 21:39:32
Abhängig von den Zweigen deines DOIF.

Ich frage nur, weil ich irgendwann auch mit dem Vergleich als Dezimalzahl Probleme hatte. Aber ich kann mich nicht mehr genua daran erinnern, wieso. Ich hatte den Code noch in den DEFs, aber halt auskommentiert. Damals bin ich scheinbar auf RegExp umgestiegen.



Hätte ich den String "cmd_1_3" irgendwo dauerhaft gespeichert, dann würde ich diese Zeichenketten nutzen.
Doch der Inhalt von "state" geht nach dem Durchlauf aller Sequenzen auf "cmd_1" und nicht auf "cmd_1_3".
Irgendwie finde ich die Speicherung der cmd's ein wenig merkwürdig. Man hat zwar nun jede Menge Dezimalzahlen, aber die Sequenzen bleiben nicht als String gespeichert.

Ellert

Zitat von: FunkOdyssey am 04 Juni 2017, 14:45:49
Schade. Dann muss ich wirklich die längere Schreibweise nutzen. Ich hatte die Hoffnung, es mit RegExp ein wenig kürzer und hübscher zu lösen.

(
[di_jalousien:cmd] == 1.3 or
[di_jalousien:cmd] == 2 or
[di_jalousien:cmd] == 0
)


Ich frage nur, weil ich irgendwann auch mit dem Vergleich als Dezimalzahl Probleme hatte. Aber ich kann mich nicht mehr genua daran erinnern, wieso. Ich hatte den Code noch in den DEFs, aber halt auskommentiert. Damals bin ich scheinbar auf RegExp umgestiegen.



Hätte ich den String "cmd_1_3" irgendwo dauerhaft gespeichert, dann würde ich diese Zeichenketten nutzen.
Doch der Inhalt von "state" geht nach dem Durchlauf aller Sequenzen auf "cmd_1" und nicht auf "cmd_1_3".
Irgendwie finde ich die Speicherung der cmd's ein wenig merkwürdig. Man hat zwar nun jede Menge Dezimalzahlen, aber die Sequenzen bleiben nicht als String gespeichert.
"=~" ist ein match-Operator und die Angabe rechts davon ein regulärer Ausdruck und keine einfache Zeichenkette, daher musst Du auch die dafür geltenden Regeln berücksichtigen, s. https://perldoc.perl.org/perlre.html

Es kann auch nicht die vereinfachte Syntax der Regexp des notify genutzt werden, wo ^ und $ automatisch zugefügt werden.

Also zu Deinem Beispiel müsste es so klappen.

$cmd =~ "^(1\.3|2|0)\$"



FunkOdyssey

Danke für eure Unterstützung.
Dann habe ich bisher bei vielen meiner DOIFs irgendwie immer Glück gehabt und bin froh, dass ich meine Falschnutzung nur bei unwichtigen Tischleuchte, Sonnenschutz & Co. bemerkt habe.  :)