[gelöst] DOIF Template Problem mit Platzhaltern

Begonnen von chrisse111179, 18 August 2025, 12:05:07

Vorheriges Thema - Nächstes Thema

chrisse111179

Hallo,
ich habe ein Template gebaut mit dem ich meine Steckdosen in verschiedenen Modi betreiben kann. Als Steckdose, mit Timerfunktion, einen Modus für Weihnachten und so weiter. Ich versuche gerade dieses Template um den Modus Intervall zu erweitern. Also beispielsweise Steckdose 60 Minuten aus, 5 Minuten an.

Hier meine RAW Definition:
defmod Steckdosen_Modus DOIF DEF TPL_Steckdosen(\
{\
if ([$1:$2] eq "steckdose") {\
fhem_set ("$1 on");;;;\
} elsif ([$1:$2] eq "timer" and [[$1:$3]]) {\
fhem_set ("$1 on");;;;\
} elsif ([$1:$2] eq "timer" and [[$1:$4]]) {\
fhem_set ("$1 off");;;;\
} elsif ([$1:$2] eq "weihnachten" and [Advent_DOIF:advent] eq "on")\
    {\
    if ([{sunset(1800,"17:30","18:00")}]) {\
    fhem_set ("$1 on");;;;\
    } elsif ([00:00]) {\
    fhem_set ("$1 off");;;;\
    } elsif ([07:30]) {\
    fhem_set ("$1 on");;;;\
    } elsif ([09:00]) {\
    fhem_set ("$1 off");;;;\
    }\
} elsif ([$1:$2] eq "intervall" and [$1:state] eq "off") {\
fhem("sleep [$1:$5];; set $1 on-for-timer [$1:$6]");;;;\
}\
}\
)\
\
## Definition mehrer Zeitschaltuhren mit Hilfe des obigen Templates\
##              $1                                  $2      $3  $4\
TPL_Steckdosen (Steckdose_Kinderzimmer_Bett,mode,schaltzeit_an,schaltzeit_aus,intervall_aus_parsed,intervall_dauer_parsed)\
TPL_Steckdosen (Steckdose_Esszimmer_links,mode,schaltzeit_an,schaltzeit_aus),intervall_aus_parsed,intervall_dauer_parsed\
TPL_Steckdosen (Steckdose_Esszimmer_rechts,mode,schaltzeit_an,schaltzeit_aus,intervall_aus_parsed,intervall_dauer_parsed)\
TPL_Steckdosen (Steckdose_Kueche_Apothekerschrank,mode,schaltzeit_an,schaltzeit_aus,intervall_aus_parsed,intervall_dauer_parsed)\
TPL_Steckdosen (Steckdose_Wohnzimmer_Fenster_rechts,mode,schaltzeit_an,schaltzeit_aus,intervall_aus_parsed,intervall_dauer_parsed)\
TPL_Steckdosen (Steckdose_Wohnzimmer_links,mode,schaltzeit_an,schaltzeit_aus,intervall_aus_parsed,intervall_dauer_parsed)\
TPL_Steckdosen (Steckdose_Wohnzimmer_rechts,mode,schaltzeit_an,schaltzeit_aus,intervall_aus_parsed,intervall_dauer_parsed)\
TPL_Steckdosen (Steckdosen_Rasen,mode,schaltzeit_an,schaltzeit_aus,intervall_aus_parsed,intervall_dauer_parsed)\
TPL_Steckdosen (Steckdose_Bad_unten,mode,schaltzeit_an,schaltzeit_aus,intervall_aus_parsed,intervall_dauer_parsed)\
TPL_Steckdosen (Wohnzimmer_Steckdose_TV,mode,schaltzeit_an,schaltzeit_aus,intervall_aus_parsed,intervall_dauer_parsed)\
TPL_Steckdosen (Shelly_Terrasse_1,mode,schaltzeit_an,schaltzeit_aus,intervall_aus_parsed,intervall_dauer_parsed)\

attr Steckdosen_Modus DbLogExclude .*
attr Steckdosen_Modus alias Steckdosen Modus Logik
attr Steckdosen_Modus group Steckdosen
attr Steckdosen_Modus icon helper_doif
attr Steckdosen_Modus room System->Automationen

setstate Steckdosen_Modus initialized
setstate Steckdosen_Modus 2023-12-03 19:34:17 .eM off
setstate Steckdosen_Modus 2025-08-18 09:00:00 block_01 executed
setstate Steckdosen_Modus 2025-08-18 09:00:00 block_02 executed
setstate Steckdosen_Modus 2025-08-18 09:00:00 block_03 executed
setstate Steckdosen_Modus 2025-08-18 09:00:00 block_04 executed
setstate Steckdosen_Modus 2025-08-18 09:00:00 block_05 executed
setstate Steckdosen_Modus 2025-08-18 09:00:00 block_06 executed
setstate Steckdosen_Modus 2025-08-18 09:00:01 block_07 executed
setstate Steckdosen_Modus 2025-08-18 09:00:01 block_08 executed
setstate Steckdosen_Modus 2025-08-18 09:00:01 block_09 executed
setstate Steckdosen_Modus 2025-08-18 09:00:01 block_10 executed
setstate Steckdosen_Modus 2025-08-18 09:00:01 block_11 executed
setstate Steckdosen_Modus 2025-08-17 12:03:13 mode enabled
setstate Steckdosen_Modus 2025-08-17 12:03:13 state initialized
setstate Steckdosen_Modus 2025-08-18 08:18:49 timer_01_c01 18.08.2025 12:30:00
setstate Steckdosen_Modus 2025-08-18 08:18:49 timer_02_c01 18.08.2025 12:31:00
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_03_c01 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_04_c01 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_05_c01 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_06_c01 19.08.2025 09:00:00
setstate Steckdosen_Modus 2025-08-18 12:00:50 timer_07_c02 18.08.2025 20:42:23
setstate Steckdosen_Modus 2025-08-18 12:00:50 timer_08_c02 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_09_c02 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_10_c02 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_11_c02 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_12_c02 19.08.2025 09:00:00
setstate Steckdosen_Modus 2025-08-18 09:00:00 timer_13_c03 18.08.2025 20:42:23
setstate Steckdosen_Modus 2025-08-18 09:00:00 timer_14_c03 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_15_c03 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_16_c03 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_17_c03 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_18_c03 19.08.2025 09:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_19_c04 18.08.2025 20:42:23
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_20_c04 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_21_c04 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_22_c04 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_23_c04 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_24_c04 19.08.2025 09:00:00
setstate Steckdosen_Modus 2025-08-18 12:00:51 timer_25_c05 18.08.2025 16:27:00
setstate Steckdosen_Modus 2025-08-18 12:00:51 timer_26_c05 18.08.2025 21:12:23
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_27_c05 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_28_c05 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_29_c05 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_30_c05 19.08.2025 09:00:00
setstate Steckdosen_Modus 2025-08-18 09:00:00 timer_31_c06 19.08.2025 04:00:00
setstate Steckdosen_Modus 2025-08-18 09:00:00 timer_32_c06 19.08.2025 06:00:00
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_33_c06 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_34_c06 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_35_c06 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_36_c06 19.08.2025 09:00:00
setstate Steckdosen_Modus 2025-08-18 09:00:00 timer_37_c07 18.08.2025 21:12:23
setstate Steckdosen_Modus 2025-08-18 09:00:00 timer_38_c07 19.08.2025 05:46:08
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_39_c07 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_40_c07 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_41_c07 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_42_c07 19.08.2025 09:00:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_43_c08 18.08.2025 19:57:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_44_c08 18.08.2025 19:58:00
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_45_c08 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_46_c08 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_47_c08 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_48_c08 19.08.2025 09:00:00
setstate Steckdosen_Modus 2025-08-18 12:00:11 timer_49_c09 18.08.2025 20:42:23
setstate Steckdosen_Modus 2025-08-18 12:00:11 timer_50_c09 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_51_c09 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_52_c09 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_53_c09 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_54_c09 19.08.2025 09:00:00
setstate Steckdosen_Modus 2025-08-18 12:00:29 timer_55_c10 18.08.2025 13:00:00
setstate Steckdosen_Modus 2025-08-18 12:00:29 timer_56_c10 18.08.2025 14:00:00
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_57_c10 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_58_c10 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_59_c10 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_60_c10 19.08.2025 09:00:00
setstate Steckdosen_Modus 2025-08-17 20:44:27 timer_61_c11 18.08.2025 20:44:24
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_62_c11 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-17 18:00:01 timer_63_c11 18.08.2025 18:00:00
setstate Steckdosen_Modus 2025-08-18 00:00:01 timer_64_c11 19.08.2025 00:00:00
setstate Steckdosen_Modus 2025-08-18 07:30:01 timer_65_c11 19.08.2025 07:30:00
setstate Steckdosen_Modus 2025-08-18 09:00:01 timer_66_c11 19.08.2025 09:00:00

Das Problem sind diese Zeile hier:
} elsif ([$1:$2] eq "intervall" and [$1:state] eq "off") {\
fhem("sleep [$1:$5];; set $1 on-for-timer [$1:$6]");;;;\

Schreibe ich die Werte direkt rein, also so
} elsif ([$1:$2] eq "intervall" and [$1:state] eq "off") {\
fhem("sleep 30;; set $1 on-for-timer 30");;;;\
funktioniert es prima, nur wenn ich die Platzhalter verwende nicht, obwohl ich aus den Readings entnehmen kann, dass sie korrekt ausgelesen werden.

Wäre schön wenn mir jemand einen Tipp geben könnte.

Viele Grüße,
Christian

Damian

#1
Im Perl-Modus werden Angaben in eckigen Klammern in Perl-Funktionen übersetzt und nicht durch Inhalte (hier: Zahlen), wie im FHEM-Modus, ersetzt.

Daher musst du an dieser Stelle die Perl-Syntax beachten:

fhem("sleep ".ReadingsVal("$1","$5",0).";;...
das entspricht:

fhem("sleep ".[?$1:$5].";;..
Mit Fragezeichen solltest du den Trigger rausnehmen.

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

chrisse111179

Danke Damian, es funktioniert!

Leider stolpere ich echt häufig einfach über die Syntax und komme meist nur mit Glück, oder eben Hilfe auf die richtige Schreibweise.

So sieht die Zeile jetzt aus:
fhem("sleep ".[$1:$5]."; set $1 on-for-timer ".[$1:$6]."")
Danke dir!

Grüße, Christian

Damian

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

chrisse111179

Hey Damian,
danke für deinen Support, das ist echt klasse!

Ja, ich habe gerade gemerkt, dass mir FHEM nach einer gewissen Zeit einfriert wenn ich das mit sleep löse.

Das sähe dann so aus?
} elsif ([$1:$2] eq "intervall" and [$1:state] eq "off") {
set_Exec("intervall_on",".[?$1:$5].",'$1("on-for-timer ".[$1:$6]."")');;

Beste Grüße

Damian

Zitat von: chrisse111179 am 19 August 2025, 11:27:29Hey Damian,
danke für deinen Support, das ist echt klasse!

Ja, ich habe gerade gemerkt, dass mir FHEM nach einer gewissen Zeit einfriert wenn ich das mit sleep löse.

Das sähe dann so aus?
} elsif ([$1:$2] eq "intervall" and [$1:state] eq "off") {
set_Exec("intervall_on",".[?$1:$5].",'$1("on-for-timer ".[$1:$6]."")');;

Beste Grüße

Den Timernamen solltest du eindeutig machen, dann eher so:

set_Exec("$1_intervall_on",[?$1:$5],'set $1 on-for-timer '.[?$1:$6]);
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chrisse111179

Hm, das spuckt mir folgenden Fehler aus:

in set Steckdose_Kinderzimmer_Bett on-for-timer 60: syntax error at (eval 727211) line 1, near "-for"

Damian

Zitat von: chrisse111179 am 19 August 2025, 11:54:44Hm, das spuckt mir folgenden Fehler aus:

in set Steckdose_Kinderzimmer_Bett on-for-timer 60: syntax error at (eval 727211) line 1, near "-for"

ja, das ist ja ein FHEM-Befehl, daher muss man davor fhem setzen:
set_Exec("$1_intervall_on",[?$1:$5],'fhem "set $1 on-for-timer '.[?$1:$6].'"');
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

chrisse111179

Hey Damian,
tausend Dank, so funktionierts!
Ja, ich habe mir das gedacht und damit herumexperimentiert, bin aber auch da über die ganzen " und ' gestolpert.  ;D
Auf jeden Fall eröffnet mir set_Exec ganz neue Welten! Wenn du wüsstest, über welche Umwege ich manchmal Verzögerungen und Timer gebastelt habe...  :D

Wie auch immer, danke für deine Mühe und Geduld!

Viele Grüße,
Christian