FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: FunkOdyssey am 27 Mai 2017, 11:51:09

Titel: Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: FunkOdyssey am 27 Mai 2017, 11:51:09
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"
...
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: amenomade am 27 Mai 2017, 11:53:28
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"
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: amenomade am 27 Mai 2017, 11:58:15
Wobei... "." in Regexp = irgendwelches Buchstaben... inkl "." selbst. Er sollte das schon merken oder?
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: FunkOdyssey am 27 Mai 2017, 14:15:47
Jepp. Daran habe ich es bemerkt. Die Bedingungen waren irgendwie fast immer wahr. 
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: Per am 28 Mai 2017, 08:25:19
Versuch es doch mal als Zahl zu interpretieren, nicht als String.
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: FunkOdyssey am 28 Mai 2017, 08:48:55
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?
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: Damian am 28 Mai 2017, 08:59:51
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
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: Per am 29 Mai 2017, 10:23:45
Wenn wir schon sparen, ist
[?$SELF:cmd]
nicht identisch mit
$cmd
?
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: FunkOdyssey am 29 Mai 2017, 11:09:33
Jepp. Das war mir bekannt. Aber Danke dennoch.
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: Damian am 29 Mai 2017, 11:17:42
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.
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: FunkOdyssey am 03 Juni 2017, 21:31:27
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.
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: amenomade am 03 Juni 2017, 21:39:32
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.
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: FunkOdyssey am 04 Juni 2017, 14:45:49
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.
Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: Ellert am 04 Juni 2017, 19:39:54
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)\$"


Titel: Antw:Vergleich [?$SELF:cmd] !~ "1.3|2" funktioniert nicht
Beitrag von: FunkOdyssey am 04 Juni 2017, 20:57:27
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.  :)