[gelöst] DOIF: Einbinden einer Perl-Funktion mit 2 oder mehreren Parametern

Begonnen von flurin, 11 März 2015, 19:39:57

Vorheriges Thema - Nächstes Thema

flurin

Hallo Damian

Bei einer Perl-Funktion mit 2 oder mehreren Parametern geht es nicht:

define di_test DOIF ([+00:00:05]) (set test_dummy {(get_value_test(15,10))})

mit einem Parameter ist es OK:

define di_test DOIF ([+00:00:05]) (set test_dummy {(get_value_test(15))})

Gruss
flurin

Damian

Zitat von: flurin am 11 März 2015, 19:39:57
Hallo Damian

Bei einer Perl-Funktion mit 2 oder mehreren Parametern geht es nicht:

define di_test DOIF ([+00:00:05]) (set test_dummy {(get_value_test(15,10))})

mit einem Parameter ist es OK:

define di_test DOIF ([+00:00:05]) (set test_dummy {(get_value_test(15))})

Gruss
flurin

Aus Sicht des Moduls handelt es sich hier in erster Linie um einen FHEM-Befehl und daher muss man hier wegen Komma die Klammern doppeln, damit das Komma nicht als Trennzeichen gilt (aber das hatten wir schon mal), daher:

define di_test DOIF ([+00:00:05]) ((set test_dummy {(get_value_test(15,10))}))

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

Zitat von: Damian am 11 März 2015, 20:04:52
Aus Sicht des Moduls handelt es sich hier in erster Linie um einen FHEM-Befehl und daher muss man hier wegen Komma die Klammern doppeln, damit das Komma nicht als Trennzeichen gilt (aber das hatten wir schon mal), daher:

define di_test DOIF ([+00:00:05]) ((set test_dummy {(get_value_test(15,10))}))

Gruß

Damian

OK, Danke. Ich kenne die Regel:

ZitatFalls ein Komma nicht als Trennzeichen zwischen FHEM-Befehlen gelten soll, so muss der FHEM-Ausdruck zusätzlich in runde Klammern gesetzt werden:

define di_light DOIF ([08:00]) ((set lamp1,lamp2 on),set switch on)

Ich dachte nur innerhalb {...} gelte die Perl-Welt!

Es wird immer lustiger:

((set test_dummy {(...))}))

Irgendwann besteht eine Definition nur aus Klammern  :)

Gruss
flurin

Damian

Zitat von: flurin am 11 März 2015, 20:19:08
OK, Danke. Ich kenne die Regel:

Ich dachte nur innerhalb {...} gelte die Perl-Welt!

Es wird immer lustiger:

((set test_dummy {(...))}))

Irgendwann bestehen eine Definition nur aus Klammern  :)

Gruss
flurin

Was tut man nicht alles für die Kompatibilität. Im alten DOIF-Thread kannst du irgendwo nachlesen, was passierte als ich {(...)} auf {...} vereinfachen wollte ;)

Du musst bedenken, als ich DOIF vor ca. einem halben Jahr erschaffen hatte, existierte FHEM schon ein paar Jährchen mit diversen Eigenheiten, denen man sich anpassen musste (Stichwort Semikolon) ;)

Gruß

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

Zitat von: Damian am 11 März 2015, 20:24:20
Was tut man nicht alles für die Kompatibilität. Im alten DOIF-Thread kannst du irgendwo nachlesen, was passierte als ich {(...)} auf {...} vereinfachen wollte ;)

Du musst bedenken, als ich DOIF vor ca. einem halben Jahr erschaffen hatte, existierte FHEM schon ein paar Jährchen mit diversen Eigenheiten, denen man sich anpassen musste (Stichwort Semikolon) ;)

Gruß

Damian

Es ist schon Okey, ich kann gut leben damit! Die Anforderungen steigen auch immer.

Wer weiss vielleicht gibt es irgendwann FHEM 2.0 ohne Rückwärts-Kompatibilität-Anforderung.

Gruss
flurin

Damian

Zitat von: flurin am 11 März 2015, 20:19:08
Ich dachte nur innerhalb {...} gelte die Perl-Welt!

Nachtrag:

DOIF (...) ({...})

Das ist für DOIF Perl-Welt, hier brauchst du runde Klammern auch bei Komma nicht doppeln.

DOIF (...) (set ... {(... )

Das ist für DOIF dagegen FHEM-Welt mit Perl-"Unterwelt", hier musst du bei Komma doppeln.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

Zitat von: Damian am 11 März 2015, 20:34:16
Nachtrag:

DOIF (...) ({...})

Das ist für DOIF Perl-Welt, hier brauchst du runde Klammern auch bei Komma nicht doppeln.

DOIF (...) (set ... {(... )

Das ist für DOIF dagegen FHEM-Welt mit Perl-"Unterwelt", hier musst du bei Komma doppeln.

Gruß

Damian

Ja, das ist "der feine Unterscheid", den nur der Autor erklären kann.

Damian

Zitat von: flurin am 11 März 2015, 20:38:40
Ja, das ist "der feine Unterscheid", den nur der Autor erklären kann.

ja, da kann man philosophieren, ob es besser ist einfache Module zu erschaffen, die wenig können, bei denen man aber auch wenig falsch machen kann, oder Mächtigkeit einzubauen, die beliebig komplex werden kann und manchmal auch verwirrend sein kann. So etwas gibt es überall,  bestes Beispiel war der regulärer Ausdruck, der in DOIF steckt:

if ($timer =~ /^(\+)?((\{.*\})|(\[.*\])|([0-9][0-9](:[0-5][0-9]){1,2}))(\|[0-8]+$|-(\+)?(([0-9][0-9](:[0-5][0-9]){1,2})|({.*})|(\[.*\]))|$)(\|[0-8]+$|$)/) {...

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

Zitat von: Damian am 11 März 2015, 20:34:16
Nachtrag:

DOIF (...) ({...})

Das ist für DOIF Perl-Welt, hier brauchst du runde Klammern auch bei Komma nicht doppeln.

DOIF (...) (set ... {(... )

Das ist für DOIF dagegen FHEM-Welt mit Perl-"Unterwelt", hier musst du bei Komma doppeln.

Gruß

Damian

demzufolge ist diese Variante auch "unterhaltsam":

define di_test DOIF ([+00:00:05]) ({fhem("set test_dummy {(get_value_test(15,10))}")})

immerhin ohne Doppel (( ))  :)

Damian

Zitat von: flurin am 11 März 2015, 20:57:07
demzufolge ist diese Variante auch "unterhaltsam":

define di_test DOIF ([+00:00:05]) ({fhem("set test_dummy {(get_value_test(15,10))}")})

immerhin ohne Doppel (( ))  :)

ja, ob es besser ist als Doppelklammer, ist eine andere Frage. Aber alles funktioniert wie programmiert und beabsichtigt.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

flurin

Zitat von: Damian am 11 März 2015, 21:08:49
ja, ob es besser ist als Doppelklammer, ist eine andere Frage. Aber alles funktioniert wie programmiert und beabsichtigt.

Gruß

Damian

Schlussendlich gefällt mir diese Variante am besten (DEF-Editor):

define di_test DOIF ([+00:00:05]) ({my $var = get_value_test(15,10));; fhem("set test_dummy $var")})

Gruss
flurin

heikoh81

Hallo zusammen,

zwar ist der Beitrag schon älter, aber er hat mir ebenfalls geholfen.
Ziel: In einem DOIF-Befehl, der ein set-Befehl ist (und damit ein FHEM-Befehl) eine Zufallszahl in einen Dummy schreiben.

Nicht funktioniert hat:
   (set Dummy_Zufallsverzoegerung {int(rand(2000))})

Funktioniert hat:
   (set Dummy_Zufallsverzoegerung {(int(rand(2000)))})

Meine Frage:
Warum muss um den einzelnen Befehl "int" nochmal eine Klammer rum, damit es funktioniert?

Viele Grüße,
Heiko

Damian

Zitat von: heikoh81 am 01 Mai 2016, 22:30:11
Hallo zusammen,

zwar ist der Beitrag schon älter, aber er hat mir ebenfalls geholfen.
Ziel: In einem DOIF-Befehl, der ein set-Befehl ist (und damit ein FHEM-Befehl) eine Zufallszahl in einen Dummy schreiben.

Nicht funktioniert hat:
   (set Dummy_Zufallsverzoegerung {int(rand(2000))})

Funktioniert hat:
   (set Dummy_Zufallsverzoegerung {(int(rand(2000)))})

Meine Frage:
Warum muss um den einzelnen Befehl "int" nochmal eine Klammer rum, damit es funktioniert?

Viele Grüße,
Heiko

Weil es FHEM-Befehle gibt (z. B. at), die selbst geschweifte Klammern benutzen und die darf DOIF nicht auswerten, daher Unterscheidungsmerkmal {(...)}.

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF