Hallo,
mir ist gerade aufgefallen, dass man scheinbar nicht mehr als 9 Variablen nutzen.
Bei
if (($timestamp) and [$2:control:d] < $4 and !$VAR{$1} and ($10)) {
Wird die $10 durch den Inhalt von $1 ersetzt und hinten noch eine 0 angehängt.
Wenn das Absicht ist (also die Begrenzung auf 9), dann müsste ich mein DOIF umbauen und mehrere Werte in eine Variable packen, würde auch gehen.
Das sollte seit Juni funktionieren:
http://forum.fhem.de/index.php/topic,111266.msg1065493.html#msg1065493
Hmmm.
FVERSION 98_DOIF.pm:0.229130/2020-10-04
Müsste also eigentlich funktionieren. Tut es aber nicht in meinem Fall ;-)
Internals:
CFGFN
DEF DEF TPL_test (
{set_State("$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11");}
)
TPL_test (a,b,c,d,e,f,g,h,i,j,k);
FUUID 5fac04a2-f33f-30f6-90fc-9d1ee78ba111a998
MODEL Perl
NAME di_template
NOTIFYDEV global
NR 102407
NTFY_ORDER 50-di_template
STATE a b c d e f g h i j k
TYPE DOIF
VERSION 22913 2020-10-04 21:46:02
READINGS:
2020-11-11 16:38:27 block_01 executed
2020-11-11 16:38:26 mode enabled
2020-11-11 16:38:27 state a b c d e f g h i j k
Regex:
accu:
condition:
0 set_State("a b c d e f g h i j k");
defs:
tpl:
TPL_test
{set_State("$1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11");}
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 0
sleeptimer -1
perlblock:
0 block_01
uiTable:
Attributes:
funktioniert bei mir wie programmiert
Dubios.
Habe ich dann wieder einen Syntaxfehler?
DEF TPL_light ( ## Definition des Templates namens TPL_light
## Parameternummer $1 $2 $3 $4 $5 $6 $8 $9 $10
## Bedeutung Name der Szene Lichtsensor des Zimmers Lichtaktor Schwellwert ein Schwellwert aus Zeitspanne Befehl zum Einschalten Befehl zum Ausschalten Anwesenheit
light_$1 {
## DOIF Block
my $timestamp = $6;
if (($timestamp) and [$2:control:d] < $4 and !$VAR{$1} and ($10)) {
fhem_set("$3 $7");
set_State("Szene: $1 Lampe ein"); ## Status mit letztem Befehl belegen
set_Reading("1_$1.Status","on",1); ## Status für Szene im Reading ablegen
$VAR{$1}=1; ## Merker setzen
} elsif (([$2:control:d] > $5 and $VAR{$1}) or !($timestamp) ) {
fhem_set("$3 $8");
set_State("Szene: $1 Lampe aus"); ## Status mit letztem Befehl belegen
set_Reading("1_$1.Status","off",1); ## Status für Szene im Reading ablegen
$VAR{$1}=0; ## Merker zurücksetzen
}
}
) ## Ende der Templatedefinition
## $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
TPL_light (Abwesenheit_EG,Sensor_Aussen_HWR_Sonne,strct_Abwesenheit_Lampen,200,350,[([06:15]-int(rand(900)))-([21:50]+int(rand(900)))],on,off,([rg_alle:presence] eq "absent"]))
Du musst mit list schauen, was DOIF daraus gemacht hat.
Das sieht so aus:
Internals:
DEF DEF TPL_light ( ## Definition des Templates namens TPL_light
## Parameternummer $1 $2 $3 $4 $5 $6 $8 $9 $10
## Bedeutung Name der Szene Lichtsensor des Zimmers Lichtaktor Schwellwert ein Schwellwert aus Zeitspanne Befehl zum Einschalten Befehl zum Ausschalten Anwesenheit
light_$1 {
## DOIF Block
my $timestamp = $6;
if (($timestamp) and [$2:control:d] < $4 and !$VAR{$1} and ($10)) {
fhem_set("$3 $7"); ##
set_State("Szene: $1 Lampe ein"); ## Status mit letztem Befehl belegen
set_Reading("1_$1.Status","on",1); ## Status für Szene im Reading ablegen
$VAR{$1}=1; ## Merker setzen
} elsif (([$2:control:d] > $5 and $VAR{$1}) or !($timestamp) ) {
fhem_set("$3 $8"); ##
set_State("Szene: $1 Lampe aus"); ## Status mit letztem Befehl belegen
set_Reading("1_$1.Status","off",1); ## Status für Szene im Reading ablegen
$VAR{$1}=0; ## Merker zurücksetzen
}
}
) ## Ende der Templatedefinition
## Definition einzelner DOIF-Blöcke pro Fenstergruppe mit Hilfe des Templates
## $1 $2 $3 $4 $5 $6 $7 $8 $9 $10
TPL_light (Abwesenheit_EG,Sensor_Aussen_HWR_Sonne,strct_Abwesenheit_Lampen,200,350,[([06:15]-int(rand(900)))-([21:50]+int(rand(900)))],on,off,([rg_alle:presence] eq "absent"]))
FUUID 5fa26602-f33f-8030-d0ae-38b91a879bd7d25a
FVERSION 98_DOIF.pm:0.229130/2020-10-04
MODEL Perl
NAME di_Licht_all
NOTIFYDEV global,Sensor_Aussen_HWR_Sonne
NR 365
NTFY_ORDER 50-di_Licht_all
STATE initialized
TYPE DOIF
VERSION 22913 2020-10-04 21:46:02
READINGS:
2020-11-11 16:57:36 1_Abwesenheit_EG.Status on
2020-11-05 18:01:55 energy 0
2020-11-05 18:01:55 energy_begin 1604595715
2020-11-11 17:57:41 mode enabled
2020-11-05 18:01:55 power 0
2020-11-11 17:57:41 state initialized
2020-11-11 17:57:41 timer_01_c01 12.11.2020 00:01:00
2020-11-11 17:57:41 timer_02_c02 12.11.2020 06:10:57
2020-11-11 17:57:41 timer_03_c02 11.11.2020 21:59:32
Regex:
accu:
cond:
Sensor_Aussen_HWR_Sonne:
1:
control ^Sensor_Aussen_HWR_Sonne$:^control:
condition:
0 ::DOIF_time_once($hash,0,$wday);delete $hash->{var};
1
my $timestamp = ::DOIF_time($hash,1,2,$wday,$hms);
if (($timestamp) and ::ReadingValDoIf($hash,'Sensor_Aussen_HWR_Sonne','control','','d') < 200 and !$hash->{var}{Abwesenheit_EG} and (Abwesenheit_EG0)) { fhem_set("strct_Abwesenheit_Lampen on"); set_State("Szene: Abwesenheit_EG Lampe ein"); set_Reading("1_Abwesenheit_EG.Status","on",1); $hash->{var}{Abwesenheit_EG}=1; } elsif ((::ReadingValDoIf($hash,'Sensor_Aussen_HWR_Sonne','control','','d') > 350 and $hash->{var}{Abwesenheit_EG}) or !($timestamp) ) { fhem_set("strct_Abwesenheit_Lampen off"); set_State("Szene: Abwesenheit_EG Lampe aus"); set_Reading("1_Abwesenheit_EG.Status","off",1); $hash->{var}{Abwesenheit_EG}=0; }
days:
defs:
tpl:
TPL_light
light_$1 {
my $timestamp = $6;
if (($timestamp) and [$2:control:d] < $4 and !$hash->{var}{$1} and ($10)) { fhem_set("$3 $7"); set_State("Szene: $1 Lampe ein"); set_Reading("1_$1.Status","on",1); $hash->{var}{$1}=1; } elsif (([$2:control:d] > $5 and $hash->{var}{$1}) or !($timestamp) ) { fhem_set("$3 $8"); set_State("Szene: $1 Lampe aus"); set_Reading("1_$1.Status","off",1); $hash->{var}{$1}=0; }
}
helper:
DEVFILTER ^global$|^Sensor_Aussen_HWR_Sonne$
NOTIFYDEV global|Sensor_Aussen_HWR_Sonne
globalinit 1
last_timer 3
sleeptimer -1
interval:
1 -1
2 1
intervalfunc:
localtime:
0 1605135660
1 1605157857
2 1605128372
perlblock:
0 light_Abwesenheit_EG
1 light_Abwesenheit_EG
powerMap:
readings:
all Sensor_Aussen_HWR_Sonne:control
readingsDesc:
energy:
rtype whr
power:
rtype w
realtime:
0 00:01:00
1 06:10:57
2 21:59:32
time:
0 00:01:00
1 ([06:15]-int(rand(900)))
2 ([21:50]+int(rand(900)))
timeCond:
0 0
1 1
2 1
timer:
0 0
1 0
2 0
timers:
0 0
1 1 2
triggertime:
1605128372:
localtime 1605128372
hash:
1605135660:
localtime 1605135660
hash:
1605157857:
localtime 1605157857
hash:
uiTable:
Attributes:
group Logik
Aus $10 hat DOIF ein (Abwesenheit_EG0) gemacht.
Sollte aber sein: ([rg_alle:presence] eq "absent"])
Dann zähl bitte noch mal die Anzahl der übergebenen Parameter ;)
Oh man :-[ :-[ :-[
Ich geh dann mal ins Wasser ...
Danke fürs Zählen :-)