DOIF mit Templates / Variablen ??

Begonnen von Tueftler1983, 29 November 2022, 22:13:24

Vorheriges Thema - Nächstes Thema

Tueftler1983

Hallo zusammen um nicht 8 DOIF anlegen zu müssen Versuche ich eines mit Templates an zu legen.

Allerdings habe ich da irgendwo einen Fehler drin. In der Hilfe finde ich immer nur versiedene IF Bedingungen aber immer nur eine DO Bedingung.

Bei mir soll ein IF mehrere Befehle ausführen.

Hier Mal meine Definition

DEF TPL_SPL ({ if ([$1] eq "on"){fhem_set MQTT2_smartpusher:on"$2"}{fhem_set MQTT2_smartpusher:sendText"$3 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif ([$1] eq "off"){fhem_set MQTT2_smartpusher:on"$2"}{fhem_set MQTT2_smartpusher:sendText"$3 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif ([$1] eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade"$2"}{fhem_set MQTT2_smartpusher:sendText"$3 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}})

TPL_SPL
(Garten_Diamant1,1,Garten1)
TPL_SPL
(Garten_Diamant2,2,Garten2)
TPL_SPL
(Garten_Diamant3,,Garten3)
TPL_SPL
(Garten_Diamant4,4,Garten4)
TPL_SPL
(Garten_Diamant5,5,Garten5)
TPL_SPL
(Garten_Steckdose1,6,Garten6)
TPL_SPL
(Garten_Steckdose2,7,Garten7)
TPL_SPL
(Garten_Steckdose3,8,Garten8)


Und ein List vom DOIF

Internals:
   CFGFN     
   DEF        DEF TPL_SPL ({ if ([$1] eq "on"){fhem_set MQTT2_smartpusher:on"$2"}{fhem_set MQTT2_smartpusher:sendText"$3 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif ([$1] eq "off"){fhem_set MQTT2_smartpusher:on"$2"}{fhem_set MQTT2_smartpusher:sendText"$3 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif ([$1] eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade"$2"}{fhem_set MQTT2_smartpusher:sendText"$3 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}})

TPL_SPL
(Garten_Diamant1,1,Garten1)
TPL_SPL
(Garten_Diamant2,2,Garten2)
TPL_SPL
(Garten_Diamant3,,Garten3)
TPL_SPL
(Garten_Diamant4,4,Garten4)
TPL_SPL
(Garten_Diamant5,5,Garten5)
TPL_SPL
(Garten_Steckdose1,6,Garten6)
TPL_SPL
(Garten_Steckdose2,7,Garten7)
TPL_SPL
(Garten_Steckdose3,8,Garten8)
   FUUID      6381edc1-f33f-b458-3ef6-81fbb590b855a869
   MODEL      Perl
   NAME       di_SmartPusher_LED
   NOTIFYDEV  Garten_Diamant4,Garten_Diamant2,Garten_Diamant3,Garten_Steckdose1,Garten_Steckdose2,global,Garten_Steckdose3,Garten_Diamant1,Garten_Diamant5
   NR         51421
   NTFY_ORDER 50-di_SPL_1
   STATE      initialized
   TYPE       DOIF
   VERSION    26020 2022-05-03 16:28:02
   eventCount 22
   READINGS:
     2022-11-26 12:34:27   mode            enabled
     2022-11-26 12:34:27   state           initialized
   Regex:
     accu:
     collect:
     cond:
       Garten_Diamant1:
         0:
           &STATE     ^Garten_Diamant1$
       Garten_Diamant2:
         1:
           &STATE     ^Garten_Diamant2$
       Garten_Diamant3:
         2:
           &STATE     ^Garten_Diamant3$
       Garten_Diamant4:
         3:
           &STATE     ^Garten_Diamant4$
       Garten_Diamant5:
         4:
           &STATE     ^Garten_Diamant5$
       Garten_Steckdose1:
         5:
           &STATE     ^Garten_Steckdose1$
       Garten_Steckdose2:
         6:
           &STATE     ^Garten_Steckdose2$
       Garten_Steckdose3:
         7:
           &STATE     ^Garten_Steckdose3$
   condition:
     0           if (::InternalDoIf($hash,'Garten_Diamant1','STATE') eq "on"){fhem_set MQTT2_smartpusher:on"1"}{fhem_set MQTT2_smartpusher:sendText"Garten1 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif (::InternalDoIf($hash,'Garten_Diamant1','STATE') eq "off"){fhem_set MQTT2_smartpusher:on"1"}{fhem_set MQTT2_smartpusher:sendText"Garten1 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif (::InternalDoIf($hash,'Garten_Diamant1','STATE') eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade"1"}{fhem_set MQTT2_smartpusher:sendText"Garten1 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}
     1           if (::InternalDoIf($hash,'Garten_Diamant2','STATE') eq "on"){fhem_set MQTT2_smartpusher:on"2"}{fhem_set MQTT2_smartpusher:sendText"Garten2 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif (::InternalDoIf($hash,'Garten_Diamant2','STATE') eq "off"){fhem_set MQTT2_smartpusher:on"2"}{fhem_set MQTT2_smartpusher:sendText"Garten2 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif (::InternalDoIf($hash,'Garten_Diamant2','STATE') eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade"2"}{fhem_set MQTT2_smartpusher:sendText"Garten2 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}
     2           if (::InternalDoIf($hash,'Garten_Diamant3','STATE') eq "on"){fhem_set MQTT2_smartpusher:on""}{fhem_set MQTT2_smartpusher:sendText"Garten3 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif (::InternalDoIf($hash,'Garten_Diamant3','STATE') eq "off"){fhem_set MQTT2_smartpusher:on""}{fhem_set MQTT2_smartpusher:sendText"Garten3 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif (::InternalDoIf($hash,'Garten_Diamant3','STATE') eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade""}{fhem_set MQTT2_smartpusher:sendText"Garten3 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}
     3           if (::InternalDoIf($hash,'Garten_Diamant4','STATE') eq "on"){fhem_set MQTT2_smartpusher:on"4"}{fhem_set MQTT2_smartpusher:sendText"Garten4 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif (::InternalDoIf($hash,'Garten_Diamant4','STATE') eq "off"){fhem_set MQTT2_smartpusher:on"4"}{fhem_set MQTT2_smartpusher:sendText"Garten4 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif (::InternalDoIf($hash,'Garten_Diamant4','STATE') eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade"4"}{fhem_set MQTT2_smartpusher:sendText"Garten4 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}
     4           if (::InternalDoIf($hash,'Garten_Diamant5','STATE') eq "on"){fhem_set MQTT2_smartpusher:on"5"}{fhem_set MQTT2_smartpusher:sendText"Garten5 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif (::InternalDoIf($hash,'Garten_Diamant5','STATE') eq "off"){fhem_set MQTT2_smartpusher:on"5"}{fhem_set MQTT2_smartpusher:sendText"Garten5 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif (::InternalDoIf($hash,'Garten_Diamant5','STATE') eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade"5"}{fhem_set MQTT2_smartpusher:sendText"Garten5 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}
     5           if (::InternalDoIf($hash,'Garten_Steckdose1','STATE') eq "on"){fhem_set MQTT2_smartpusher:on"6"}{fhem_set MQTT2_smartpusher:sendText"Garten6 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif (::InternalDoIf($hash,'Garten_Steckdose1','STATE') eq "off"){fhem_set MQTT2_smartpusher:on"6"}{fhem_set MQTT2_smartpusher:sendText"Garten6 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif (::InternalDoIf($hash,'Garten_Steckdose1','STATE') eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade"6"}{fhem_set MQTT2_smartpusher:sendText"Garten6 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}
     6           if (::InternalDoIf($hash,'Garten_Steckdose2','STATE') eq "on"){fhem_set MQTT2_smartpusher:on"7"}{fhem_set MQTT2_smartpusher:sendText"Garten7 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif (::InternalDoIf($hash,'Garten_Steckdose2','STATE') eq "off"){fhem_set MQTT2_smartpusher:on"7"}{fhem_set MQTT2_smartpusher:sendText"Garten7 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif (::InternalDoIf($hash,'Garten_Steckdose2','STATE') eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade"7"}{fhem_set MQTT2_smartpusher:sendText"Garten7 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}
     7           if (::InternalDoIf($hash,'Garten_Steckdose3','STATE') eq "on"){fhem_set MQTT2_smartpusher:on"8"}{fhem_set MQTT2_smartpusher:sendText"Garten8 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif (::InternalDoIf($hash,'Garten_Steckdose3','STATE') eq "off"){fhem_set MQTT2_smartpusher:on"8"}{fhem_set MQTT2_smartpusher:sendText"Garten8 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif (::InternalDoIf($hash,'Garten_Steckdose3','STATE') eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade"8"}{fhem_set MQTT2_smartpusher:sendText"Garten8 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}
   defs:
     tpl:
       TPL_SPL    { if ([$1] eq "on"){fhem_set MQTT2_smartpusher:on"$2"}{fhem_set MQTT2_smartpusher:sendText"$3 Ein"}{fhem_set  MQTT2_smartpusher sendImage lighton.bin} elseif ([$1] eq "off"){fhem_set MQTT2_smartpusher:on"$2"}{fhem_set MQTT2_smartpusher:sendText"$3 Aus"}{fhem_set MQTT2_smartpusher sendImage lightoff.bin} elseif ([$1] eq "on-for-timer"){ fhem_set MQTT2_smartpusher:fade"$2"}{fhem_set MQTT2_smartpusher:sendText"$3 Timer"}{fhem_set MQTT2_smartpusher sendImage timer.bin"}}
   helper:
     NOTIFYDEV  Garten_Diamant4,Garten_Diamant2,Garten_Diamant3,Garten_Steckdose1,Garten_Steckdose2,global,Garten_Steckdose3,Garten_Diamant1,Garten_Diamant5
     globalinit 1
     last_timer 0
     sleeptimer -1
   internals:
     all         Garten_Diamant1:STATE Garten_Diamant2:STATE Garten_Diamant3:STATE Garten_Diamant4:STATE Garten_Diamant5:STATE Garten_Steckdose1:STATE Garten_Steckdose2:STATE Garten_Steckdose3:STATE
   perlblock:
     0          block_01
     1          block_02
     2          block_03
     3          block_04
     4          block_05
     5          block_06
     6          block_07
     7          block_08
   uiState:
   uiTable:
Attributes:


Hoffe ihr könnt mir helfen da ich, wenn ich zum Testen block_01 setzen möchte folgenden Fehler angezeigt bekomme,
block_01
condition c01: Can't find string terminator '"' anywhere before EOF, line 1.
2022-11-26 12:43:59
mode
enabled
2022-11-26 12:43:51
state
initialized
2022-11-26 12:43:51
warning
condition c01: (Missing semicolon on previous line?)


Ich hoffe ihr könnt mir helfen habe mittlerweile soviele Varianten und Schreibweisen probiert

Damian

Warum ist die zwei hier in Anführungszeichen?

fhem_set MQTT2_smartpusher:on"$2"

Du übergibst an der Stelle eine Zahl, dann sieht dann Befehl so aus:

fhem_set MQTT2_smartpusher:on"1"

Ich glaube nicht, dass du das willst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tueftler1983

Habe jetzt erstmal die "leichte" seite soweit hin bekommen.
wenn button_1 gedrückt wird, schalte Steckdose_1 ein
wenn button_1 doppelt gedrückt wird, schalte Steckdose_1 aus
Da seitere ich jetzt daran bei einem langen klick die Steckdose_1 für 60 sek ein zu schalten.

Da die steckdosen kein on-for-timer können.

DEF TPL_SP
({if
([$1] eq "click off") {fhem ("set $2 on")}
elsif ([$1] eq "double_click off") {fhem ("set $2 off")}
elsif ([$1] eq "long_click off") {fhem ("set $2 on")} {fhem ("at +00:00:05 set $2 off")}})
TPL_SP (MQTT2_smartpusher:button_1,Garten_Diamant1)
TPL_SP (MQTT2_smartpusher:button_2,Garten_Diamant2)
TPL_SP (MQTT2_smartpusher:button_3,Garten_Diamant3)
TPL_SP (MQTT2_smartpusher:button_4,Garten_Diamant4)
TPL_SP (MQTT2_smartpusher:button_5,Garten_Diamant5)
TPL_SP (MQTT2_smartpusher:button_6,Garten_Steckdose1)
TPL_SP (MQTT2_smartpusher:button_7,Garten_Steckdose2)
TPL_SP (MQTT2_smartpusher:button_8,Garten_Steckdose3)


Wenn das läuft kann ich sie Syntax ja problemlos übertragen.... hoffe ich

Aber danke schonmal

Tueftler1983

Zitat von: Damian am 29 November 2022, 22:17:06
Warum ist die zwei hier in Anführungszeichen?

fhem_set MQTT2_smartpusher:on"$2"

Du übergibst an der Stelle eine Zahl, dann sieht dann Befehl so aus:

fhem_set MQTT2_smartpusher:on"1"

Ich glaube nicht, dass du das willst.

das ich da die jeweilige Zahl übergebe ist richtig,
der Fhem befehl um die LED´s 1-8 zu schalten lautet
set MQTT2_smartpusher on 1 bis set MQTT2_smartpusher on 8
oder off
set MQTT2_smartpusher off 1 bis set MQTT2_smartpusher off 8
oder fade
set MQTT2_smartpusher fade 1 bis set MQTT2_smartpusher fade 8

Damian

#4
Zitat von: Tueftler1983 am 30 November 2022, 00:34:06
das ich da die jeweilige Zahl übergebe ist richtig,
der Fhem befehl um die LED´s 1-8 zu schalten lautet
set MQTT2_smartpusher on 1 bis set MQTT2_smartpusher on 8
oder off
set MQTT2_smartpusher off 1 bis set MQTT2_smartpusher off 8
oder fade
set MQTT2_smartpusher fade 1 bis set MQTT2_smartpusher fade 8

dann ist aber:

fhem_set MQTT2_smartpusher:on"1"

ganz was anderes als das, was du willst:

set MQTT2_smartpusher on 1

das entspricht vielmehr:

fhem_set("MQTT2_smartpusher on 1")

Ich denke, du sieht, was du an deinem Template ändern musst.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tueftler1983

hey
Zitat von: Damian am 30 November 2022, 09:35:01
dann ist aber:

fhem_set MQTT2_smartpusher:on"1"

ganz was anderes als das, was du willst:

set MQTT2_smartpusher on 1

das entspricht vielmehr:

fhem_set("MQTT2_smartpusher on 1")

Ich denke, du sieht, was du an deinem Template ändern musst.


So funktioniert dieser Abschnitt
{fhem ("set MQTT2_smartpusher on $2")}


Damian

Zitat von: Tueftler1983 am 30 November 2022, 13:58:47
hey
So funktioniert dieser Abschnitt
{fhem ("set MQTT2_smartpusher on $2")}

oder eben

{fhem_set ("MQTT2_smartpusher on $2")}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tueftler1983

#7
Hast du ne Ahnung wie ich ne Verzögerung in den Ausführungsteil bekomme wenn mehrere Befehle ausgeführt werden sollen?
In einem normalen DOIF mache ich das mit dem attr wait das gibt es in dieser Art DOIF nicht.
elsif ([$1] eq "off") {fhem ("set MQTT2_smartpusher off $2 ; set MQTT2_smartpusher sendText $3 ; sleep 2 ; set MQTT2_smartpusher sendImage lightoff.bin")}

Zwischen dem SmartPusher sendText und dem SmartPusher sendImage soll 1 bis 2 sek pause sein

Mein Versuch mit sleep 2 oder at +00:00:02 geht leider nicht

Damian

Zitat von: Tueftler1983 am 30 November 2022, 15:21:18
Hast du ne Ahnung wie ich ne Verzögerung in den Ausführungsteil bekomme wenn mehrere Befehle ausgeführt werden sollen?
In einem normalen DOIF mache ich das mit dem attr wait das gibt es in dieser Art DOIF nicht.
elsif ([$1] eq "off") {fhem ("set MQTT2_smartpusher off $2 ; set MQTT2_smartpusher sendText $3 ; sleep 2 ; set MQTT2_smartpusher sendImage lightoff.bin")}

Zwischen dem SmartPusher sendText und dem SmartPusher sendImage soll 1 bis 2 sek pause sein

Mein Versuch mit sleep 2 oder at +00:00:02 geht leider nicht
Dafür gibt es set_Exec: https://wiki.fhem.de/wiki/DOIF/Perl-Modus#Timer_setzen:_set_Exec.28.29
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tueftler1983

Hey

also habe es mal versucht, ich möchte in diesem Beispiel erst den Text an ein OLED senden und 3 sek danach ein Bild, leider bekomme ich die Fehlermeldung missing Strink Terminator

([$1] eq "on") {fhem ("set MQTT2_smartpusher on $2 ; set MQTT2_smartpusher sendText $3 ; set_Exec("off_timer",3,'fhem_set("MQTT2_smartpusher sendImage lightoff.bin")'))}
die Fehlermeldung
Device
Garten_Diamant1
2022-12-01 09:58:30
block_01
condition c01: Can't find string terminator '"' anywhere before EOF, line 2.
2022-12-01 10:00:44
e_Garten_Diamant1_STATE
off
2022-12-01 09:58:30
mode
enabled
2022-12-01 10:00:39
state
initialized
2022-12-01 09:58:24
warning
condition c01: (Missing semicolon on previous line?)
2022-12-01 10:00:44

Damian

Zitat von: Tueftler1983 am 01 Dezember 2022, 10:01:18
Hey

also habe es mal versucht, ich möchte in diesem Beispiel erst den Text an ein OLED senden und 3 sek danach ein Bild, leider bekomme ich die Fehlermeldung missing Strink Terminator

([$1] eq "on") {fhem ("set MQTT2_smartpusher on $2 ; set MQTT2_smartpusher sendText $3 ; set_Exec("off_timer",3,'fhem_set("MQTT2_smartpusher sendImage lightoff.bin")'))}
die Fehlermeldung
Device
Garten_Diamant1
2022-12-01 09:58:30
block_01
condition c01: Can't find string terminator '"' anywhere before EOF, line 2.
2022-12-01 10:00:44
e_Garten_Diamant1_STATE
off
2022-12-01 09:58:30
mode
enabled
2022-12-01 10:00:39
state
initialized
2022-12-01 09:58:24
warning
condition c01: (Missing semicolon on previous line?)
2022-12-01 10:00:44


set_Exec ist eine Perlfunktion und kein FHEM-Befehl. Du hast sie in die fhem-funktion gesteckt.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tueftler1983

Hmm okay, wie muss ich das dann aufbauen??
So bekomme ich beim Ausführen einen Syntax Error

DEF TPL_SPL
({if
([$1] eq "on") {fhem ("set MQTT2_smartpusher on $2 ; set MQTT2_smartpusher sendText $3")} ; set_Exec("off_timer",3,'fhem_set("MQTT2_smartpusher sendImage lightoff.bin")')
elsif ([$1] eq "off") {fhem ("set MQTT2_smartpusher off $2 ; set MQTT2_smartpusher sendText $3 ; set MQTT2_smartpusher sendImage lightoff.bin")}
elsif ([$1] eq "on-for-timer") {fhem ("set MQTT2_smartpusher fade $2 ; set MQTT2_smartpusher sendText $3  ; set MQTT2_smartpusher sendImage lighttimer.bin")}})
TPL_SPL (Garten_Diamant1,1,Garten1)
TPL_SPL (Garten_Diamant2,2,Garten2)
TPL_SPL (Garten_Diamant3,3,Garten3)
TPL_SPL (Garten_Diamant4,4,Garten4)
TPL_SPL (Garten_Diamant5,5,Garten5)
TPL_SPL (Garten_Steckdose1,6,Garten6)
TPL_SPL (Garten_Steckdose2,7,Garten7)
TPL_SPL (Garten_Steckdose3,8,Garten8)



Und die Readings mit dem Fehler

Readings
Device
Garten_Diamant1
2022-12-01 13:26:29
block_01
condition c01: syntax error, elsif"
2022-12-01 13:26:29
e_Garten_Diamant1_STATE
off
2022-12-01 13:26:29
mode
enabled
2022-12-01 13:28:00
state
initialized


Kannst du mir helfen

Damian

In der ersten Ausführung hast du die geschweifte Klammer von if zu früh zugemacht.

Zitat([$1] eq "on") {fhem ("set MQTT2_smartpusher on $2 ; set MQTT2_smartpusher sendText $3")} ; set_Exec("off_timer",3,'fhem_set("MQTT2_smartpusher sendImage lightoff.bin")')
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

Tueftler1983

Jo jetzt wo du es sagst, ein Krampf mit den ganzen Klammern.
Ich teste es gleich wenn ich Zuhause bin, bin noch unterwegs.

Danke dir schonmal

Damian

Zitat von: Tueftler1983 am 01 Dezember 2022, 13:48:23
Jo jetzt wo du es sagst, ein Krampf mit den ganzen Klammern.

Tja, das ist Perl, aber die meisten Programmiersprachen arbeiten mit Klammern.

Bei Perl kannst du auch welche weglassen, z. B. bei Funktonsaufrufen:

fhem "set MQTT2_smartpusher on $2 ; set MQTT2_smartpusher sendText $3"
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF