Hallo,
ich habe ein Beschattungs-DOIF mit 3 Bedingungen - grundsätzlich:
- cmd_1=Rollos runter (und hoch) bei Sonne, Sonnenwinkel etc.
- cmd_2=Alle Rollos hoch, wenn keine Sonne
- cmd_3=doelse()
Dabei möchte ich, dass do always nur bei Bedingung 1 immer wieder den Ausführungsteil durchgeht. Da sonst nachts alle 3 Min. unnötig Traffic stattfindet durch den Temperatursensor bei CMD_2.
Kann ich das konfigurieren?
Oder muss ich das aktuelle CMD im Ausführungsteil abfragen?
if ("[$SELF:cmd,0]" eq "2") {
return;
}
Ich vermute, es gibt eine elegantere Lösung?
cmd_2 in cmd_1 integrieren kann ich vermutlich schlecht, weil sonst der Temperatursensor nicht triggert bzw. nur mittels Abfragewert, der immer true ist?
Viele Grüße
Ronny
List vom DOIF
Internals:
DEF ([?isDay:state] eq "on" and [TempDiffSen.01:T2_T1] >= 2.5 and [Twilight:compasspointEx] =~ "north|east|south|west" and [?TempDiffSen.01:Aussentemperatur,0] > 10 and [?proplanta:fc0_tempMax,0] > 17 and [?proplanta:fc0_tempMin,0] > 10 and [?proplanta:fc0_sun,20] >= 20) (
{
my @DirUp = ("NORD","OST","SUED","WEST");
my @DirDown;
my $CompassPoint = "[Twilight:compasspointEx]";
my $waitUp =("[$SELF:cmd_event,0]" eq "TempDiffSen.01") ? AttrVal("$SELF", "waitUp", 0) : 0;
my $waitDown = (("[$SELF:cmd_event,0]" eq "TempDiffSen.01") || (ReadingsVal("TempDiffSen.01", "Aussentemperatur", 23) >= 23) || (ReadingsVal("Wandthermostat.3.Weather", "temperature", 23.5) >= 23.5) || (ReadingsVal("Wandthermostat.2.Weather", "temperature", 23.5) >= 23.5)) ? 90 : AttrVal("$SELF", "waitDown", 0);
if ($CompassPoint=~"north") {
push @DirDown, "NORD";
@DirUp = grep(!/NORD/, @DirUp);
}
if ($CompassPoint=~"east") {
push @DirDown, "OST";
@DirUp = grep(!/OST/, @DirUp);
}
if ($CompassPoint=~"south") {
push @DirDown, "SUED";
@DirUp = grep(!/SUED/, @DirUp);
}
if ($CompassPoint=~"west") {
push @DirDown, "WEST";
@DirUp = grep(!/WEST/, @DirUp);
}
my $RollosDirDown = join ("|",@DirDown);
my $RollosDirUp = join ("|",@DirUp);
my $FILTER1 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=1.*" : "";
my $FILTER0 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=0.*" : "";
fhem("setreading NAME=Rollos.($RollosDirDown)$FILTER1 Beschattung 1,$waitDown");
fhem("setreading NAME=Rollos.($RollosDirUp)$FILTER0 Beschattung 0,$waitUp");
fhem("setreading NAME=Rollo.(E|O)G.*:FILTER=Himmelsrichtung=($RollosDirDown)$FILTER1 Beschattung 1");
fhem("setreading NAME=Rollo.(E|O)G.*:FILTER=Himmelsrichtung=($RollosDirUp)$FILTER0 Beschattung 0");
$RollosDirDown = ($RollosDirDown) ? $RollosDirDown : "0";
fhem("setreading doif.Autobeschattung Beschattung $RollosDirDown");
}
) DOELSEIF ([?isDay:state] eq "off" or [TempDiffSen.01:T2_T1]<2.5) (
{
if ("[$SELF:cmd,0]" eq "2") {
return;
}
my $waitUp = ("[$SELF:cmd_event,0]" eq "TempDiffSen.01") ? AttrVal("$SELF", "waitUp", 0) : 0;
my $FILTER0 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=0.*" : "";
fhem("setreading NAME=Rollos.(NORD|OST|SUED|WEST)$FILTER0 Beschattung 0,$waitUp");
fhem("setreading NAME=Rollo.(E|O)G.*$FILTER0 Beschattung 0");
fhem("setreading doif.Autobeschattung Beschattung 0");
}
) DOELSE()
FUUID 5c5a08ea-f33f-6078-1036-bfb79dd58b81e9a4
MODEL FHEM
NAME doif.Autobeschattung
NOTIFYDEV global,TempDiffSen.01,Twilight
NR 538
NTFY_ORDER 50-doif.Autobeschattung
STATE 0 (enabled)
TYPE DOIF
VERSION 22764 2020-09-12 20:06:36
READINGS:
2020-10-27 23:30:19 Beschattung 0
2020-10-27 23:32:55 Device TempDiffSen.01
2020-10-27 23:32:55 cmd 2
2020-10-27 23:32:55 cmd_event TempDiffSen.01
2020-10-27 23:32:55 cmd_nr 2
2020-10-27 23:32:55 e_TempDiffSen.01_T2_T1 0.2
2020-10-27 23:27:48 e_Twilight_compasspointEx unknown
2020-10-27 23:09:57 mode enabled
2020-10-27 23:32:55 state cmd_2
Regex:
accu:
cond:
TempDiffSen.01:
0:
T2_T1 ^TempDiffSen.01$:^T2_T1:
1:
T2_T1 ^TempDiffSen.01$:^T2_T1:
Twilight:
0:
compasspointEx ^Twilight$:^compasspointEx:
1:
attr:
cmdState:
wait:
waitdel:
condition:
0 ::ReadingValDoIf($hash,'isDay','state') eq "on" and ::ReadingValDoIf($hash,'TempDiffSen.01','T2_T1') >= 2.5 and ::ReadingValDoIf($hash,'Twilight','compasspointEx') =~ "north|east|south|west" and ::ReadingValDoIf($hash,'TempDiffSen.01','Aussentemperatur','0') > 10 and ::ReadingValDoIf($hash,'proplanta','fc0_tempMax','0') > 17 and ::ReadingValDoIf($hash,'proplanta','fc0_tempMin','0') > 10 and ::ReadingValDoIf($hash,'proplanta','fc0_sun','20') >= 20
1 ::ReadingValDoIf($hash,'isDay','state') eq "off" or ::ReadingValDoIf($hash,'TempDiffSen.01','T2_T1')<2.5
do:
0:
0 { my @DirUp = ("NORD","OST","SUED","WEST"); my @DirDown; my $CompassPoint = "[Twilight:compasspointEx]"; my $waitUp =("[doif.Autobeschattung:cmd_event,0]" eq "TempDiffSen.01") ? AttrVal("doif.Autobeschattung", "waitUp", 0) : 0; my $waitDown = (("[doif.Autobeschattung:cmd_event,0]" eq "TempDiffSen.01") || (ReadingsVal("TempDiffSen.01", "Aussentemperatur", 23) >= 23) || (ReadingsVal("Wandthermostat.3.Weather", "temperature", 23.5) >= 23.5) || (ReadingsVal("Wandthermostat.2.Weather", "temperature", 23.5) >= 23.5)) ? 90 : AttrVal("doif.Autobeschattung", "waitDown", 0); if ($CompassPoint=~"north") { push @DirDown, "NORD"; @DirUp = grep(!/NORD/, @DirUp); } if ($CompassPoint=~"east") { push @DirDown, "OST"; @DirUp = grep(!/OST/, @DirUp); } if ($CompassPoint=~"south") { push @DirDown, "SUED"; @DirUp = grep(!/SUED/, @DirUp); } if ($CompassPoint=~"west") { push @DirDown, "WEST"; @DirUp = grep(!/WEST/, @DirUp); } my $RollosDirDown = join ("|",@DirDown); my $RollosDirUp = join ("|",@DirUp); my $FILTER1 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=1.*" : ""; my $FILTER0 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=0.*" : ""; fhem("setreading NAME=Rollos.($RollosDirDown)$FILTER1 Beschattung 1,$waitDown"); fhem("setreading NAME=Rollos.($RollosDirUp)$FILTER0 Beschattung 0,$waitUp"); fhem("setreading NAME=Rollo.(E|O)G.*:FILTER=Himmelsrichtung=($RollosDirDown)$FILTER1 Beschattung 1"); fhem("setreading NAME=Rollo.(E|O)G.*:FILTER=Himmelsrichtung=($RollosDirUp)$FILTER0 Beschattung 0"); $RollosDirDown = ($RollosDirDown) ? $RollosDirDown : "0"; fhem("setreading doif.Autobeschattung Beschattung $RollosDirDown"); }
1:
0 { if ("[doif.Autobeschattung:cmd,0]" eq "2") { return; } my $waitUp = ("[doif.Autobeschattung:cmd_event,0]" eq "TempDiffSen.01") ? AttrVal("doif.Autobeschattung", "waitUp", 0) : 0; my $FILTER0 = (Value("notify.Autobeschattung.Switch.Rollos") ne "active") ? ":FILTER=Beschattung!=0.*" : ""; fhem("setreading NAME=Rollos.(NORD|OST|SUED|WEST)$FILTER0 Beschattung 0,$waitUp"); fhem("setreading NAME=Rollo.(E|O)G.*$FILTER0 Beschattung 0"); fhem("setreading doif.Autobeschattung Beschattung 0"); }
2:
0
helper:
DEVFILTER ^global$|^Twilight$|^TempDiffSen.01$
NOTIFYDEV global|Twilight|TempDiffSen.01
event Aussentemperatur: 8.6,T2_T1: 0.2
globalinit 1
last_timer 0
sleeptimer -1
timerdev TempDiffSen.01
timerevent Aussentemperatur: 8.6,T2_T1: 0.2
triggerDev TempDiffSen.01
DOIF_eventa:
cmd_nr: 2
cmd: 2
cmd_event: TempDiffSen.01
cmd_2
DOIF_eventas:
cmd_nr: 2
cmd: 2
cmd_event: TempDiffSen.01
state: cmd_2
timerevents:
Aussentemperatur: 8.6
T2_T1: 0.2
timereventsState:
Aussentemperatur: 8.6
T2_T1: 0.2
triggerEvents:
Aussentemperatur: 8.6
T2_T1: 0.2
triggerEventsState:
Aussentemperatur: 8.6
T2_T1: 0.2
internals:
readings:
all TempDiffSen.01:T2_T1 Twilight:compasspointEx
trigger:
uiState:
uiTable:
Attributes:
alias Autobeschattung DOIF
do always
event-on-change-reading .*
group Rollos
room Klima,Rollos
stateFormat Beschattung (mode)
userattr waitUp waitDown
verbose 1
waitDown 600
waitUp 1800
Weil noch keiner geantwortet hat...
Zitat von: FHEMAN am 27 Oktober 2020, 23:49:51Kann ich das konfigurieren?
Oder muss ich das aktuelle CMD im Ausführungsteil abfragen?
if ("[$SELF:cmd,0]" eq "2") {
return;
}
Ich vermute, es gibt eine elegantere Lösung?
Ob eleganter weiss ich nicht, aber du kannst im Zweit 2 abfragen, ob es noch nicht Zweig 2 ist.
DOELSEIF ([$SELF.cmd]<>2 and...
Dann kannst du
do always lassen. Auf DOELSE musst du aber verzichten, sonst wechselt der Zustand zwischen 2 und 3. Oder du prüfst auf cmd < 2, da weiss ich nicht, ob deine Voraussetzungen das gergeben.
Bei deiner Menge Perl-Code kannst du aber bestimmt auch gleich in den Perl-Mode wechseln, das kennt kein eh
do always.