Der Peter mal wieder mit einem DOIF Thema 8)
Ich habe ein DOIF im Perl Mode mit 5 Abfrageblöcken:
Internals:
DEF subs {
## Definition der Perlfunktion DebugMessage
sub $SELF_DebugMessage {
my ($Message)=@_;
my $MODUL="$SELF";
my $senddebugmessages = AttrVal("$SELF","senddebugmessages","");
if ($senddebugmessages eq "1") {
fhem("msg push @[Messages.Type:mt_Jalousien] '$MODUL': Message: '$Message'");
Log 3, $MODUL.": "."Message: '$Message'";
}
}
}
## WebCmd
{ if (["^$SELF$:^Ein$"]) {
set_State("on"); ## Status
}
}
{ if (["^$SELF$:^Aus$"]) {
set_State("off"); ## Status
}
}
## ZU wenn offen und Sonnenstand
{ if (!([$SELF:state] eq "off") ## DOIF enabled
and [Jalousien.Automatik] ne "Off" ## Automatik nicht deaktiviert
and [?$SELF:markise] ne "on" ## Markise nicht geschlossen
and [$SELF:azimut] eq "1" ## Sonnenstand gegen 16:00
) {
$SELF_DebugMessage("Markise Wintergarten Schließen"); ## Debug
fhem_set"Markise.AUSSEN.Wintergarten on" ## Markise Schließen
}
}
## AUF wenn geschlossen, Sonnenstand und PV Leistung
{ if (!([$SELF:state] eq "off") ## DOIF enabled
and [Jalousien.Automatik] ne "Off" ## Automatik nicht deaktiviert
and [?$SELF:markise] ne "off" ## Markise nicht offen
and [$SELF:azimut_auto_onoff] eq "1" ## Sonnenstand gegen 07:00 - 16:00
and [Wechselrichter:total_pac] > 5.000) ## PV Leistung?
) {
$SELF_DebugMessage("Markise Wintergarten Öffnen"); ## Debug
fhem_set"Markise.AUSSEN.Wintergarten off" ## Markise Schließen
}
}
## ZU wenn offen, Sonnenstand und PV Leistung
{ if (!([$SELF:state] eq "off") ## DOIF enabled
and [Jalousien.Automatik] ne "Off" ## Automatik nicht deaktiviert
and [?$SELF:markise] ne "on" ## Markise nicht geschlossen
and [$SELF:azimut_auto_onoff] eq "1" ## Sonnenstand gegen 07:00 - 16:00
and [Wechselrichter:total_pac] < 3.000) ## PV Leistung?
) {
$SELF_DebugMessage("Markise Wintergarten Schließen"); ## Debug
fhem_set"Markise.AUSSEN.Wintergarten on" ## Markise Schließen
}
}
FUUID 5c72a5f0-f33f-739f-628b-28ec42a422c604ad
MODEL Perl
NAME di_p_Markise_AUSSEN_Wintergarten
NR 1350
NTFY_ORDER 50-di_p_Markise_AUSSEN_Wintergarten
STATE on
TYPE DOIF
VERSION 19303 2019-05-01 08:47:16
DOIF_Readings:
azimut (((::ReadingValDoIf($hash,'Twilight','azimuth') >= 230) and (::ReadingValDoIf($hash,'Twilight','azimuth') <= 300))?1:0)
azimut_auto_onoff (((::ReadingValDoIf($hash,'Twilight','azimuth') >= 70) and (::ReadingValDoIf($hash,'Twilight','azimuth') <= 230))?1:0)
markise (::ReadingValDoIf($hash,'Markise.AUSSEN.Wintergarten','state'))
READINGS:
2019-06-06 21:28:27 Device Wechselrichter
2019-06-06 20:37:42 azimut 0
2019-06-06 20:58:02 azimut_auto_onoff 0
2019-06-06 10:26:39 markise on
2019-06-06 21:02:19 mode enabled
2019-02-24 15:23:07 state on
Regex:
DOIF_Readings:
Markise.AUSSEN.Wintergarten:
markise:
state ^Markise.AUSSEN.Wintergarten$:^state:
Twilight:
azimut:
azimuth ^Twilight$:^azimuth:
azimut_auto_onoff:
azimuth ^Twilight$:^azimuth:
accu:
cond:
:
0:
"^di_p_Markise_AUSSEN_Wintergarten$:^Ein$" ^di_p_Markise_AUSSEN_Wintergarten$:^Ein$
1:
"^di_p_Markise_AUSSEN_Wintergarten$:^Aus$" ^di_p_Markise_AUSSEN_Wintergarten$:^Aus$
2:
3:
4:
condition:
0 if (::EventDoIf('^di_p_Markise_AUSSEN_Wintergarten$',$hash,'^Ein$',0)) {
set_State("on"); }
1 if (::EventDoIf('^di_p_Markise_AUSSEN_Wintergarten$',$hash,'^Aus$',0)) {
set_State("off"); }
2 if (!(::ReadingValDoIf($hash,'di_p_Markise_AUSSEN_Wintergarten','state') eq "off") and ::InternalDoIf($hash,'Jalousien.Automatik','STATE') ne "Off" and ::ReadingValDoIf($hash,'di_p_Markise_AUSSEN_Wintergarten','markise') ne "on"
and ::ReadingValDoIf($hash,'di_p_Markise_AUSSEN_Wintergarten','azimut') eq "1" ) {
di_p_Markise_AUSSEN_Wintergarten_DebugMessage("Markise Wintergarten Schließen"); fhem_set"Markise.AUSSEN.Wintergarten on" }
3 if (!(::ReadingValDoIf($hash,'di_p_Markise_AUSSEN_Wintergarten','state') eq "off") and ::InternalDoIf($hash,'Jalousien.Automatik','STATE') ne "Off" and ::ReadingValDoIf($hash,'di_p_Markise_AUSSEN_Wintergarten','markise') ne "off"
and ::ReadingValDoIf($hash,'di_p_Markise_AUSSEN_Wintergarten','azimut_auto_onoff') eq "1" and ::ReadingValDoIf($hash,'Wechselrichter','total_pac') > 5.000) ) {
di_p_Markise_AUSSEN_Wintergarten_DebugMessage("Markise Wintergarten Öffnen"); fhem_set"Markise.AUSSEN.Wintergarten off" }
4 if (!(::ReadingValDoIf($hash,'di_p_Markise_AUSSEN_Wintergarten','state') eq "off") and ::InternalDoIf($hash,'Jalousien.Automatik','STATE') ne "Off" and ::ReadingValDoIf($hash,'di_p_Markise_AUSSEN_Wintergarten','markise') ne "on"
and ::ReadingValDoIf($hash,'di_p_Markise_AUSSEN_Wintergarten','azimut_auto_onoff') eq "1" and ::ReadingValDoIf($hash,'Wechselrichter','total_pac') < 3.000) ) {
di_p_Markise_AUSSEN_Wintergarten_DebugMessage("Markise Wintergarten Schließen"); fhem_set"Markise.AUSSEN.Wintergarten on" }
devices:
2 di_p_Markise_AUSSEN_Wintergarten Jalousien.Automatik
3 di_p_Markise_AUSSEN_Wintergarten Jalousien.Automatik Wechselrichter
4 di_p_Markise_AUSSEN_Wintergarten Jalousien.Automatik Wechselrichter
all di_p_Markise_AUSSEN_Wintergarten Jalousien.Automatik Wechselrichter
helper:
event background_processing_time: 0.2668,inverter_processing_time: 0.1905
globalinit 1
last_timer 0
sleeptimer -1
triggerDev Wechselrichter
triggerEvents:
background_processing_time: 0.2668
inverter_processing_time: 0.1905
triggerEventsState:
background_processing_time: 0.2668
inverter_processing_time: 0.1905
internals:
2 Jalousien.Automatik:STATE
3 Jalousien.Automatik:STATE
4 Jalousien.Automatik:STATE
all Jalousien.Automatik:STATE
itimer:
perlblock:
0
1
2
3
4
readings:
2 di_p_Markise_AUSSEN_Wintergarten:state di_p_Markise_AUSSEN_Wintergarten:azimut
3 di_p_Markise_AUSSEN_Wintergarten:state di_p_Markise_AUSSEN_Wintergarten:azimut_auto_onoff Wechselrichter:total_pac
4 di_p_Markise_AUSSEN_Wintergarten:state di_p_Markise_AUSSEN_Wintergarten:azimut_auto_onoff Wechselrichter:total_pac
all di_p_Markise_AUSSEN_Wintergarten:state di_p_Markise_AUSSEN_Wintergarten:azimut di_p_Markise_AUSSEN_Wintergarten:azimut_auto_onoff Wechselrichter:total_pac
trigger:
uiState:
uiTable:
Attributes:
DOIF_Readings markise:([Markise.AUSSEN.Wintergarten:state]),
azimut:((([Twilight:azimuth] >= 230) and ([Twilight:azimuth] <= 300))?1:0),
azimut_auto_onoff:((([Twilight:azimuth] >= 70) and ([Twilight:azimuth] <= 230))?1:0)
alias Automatikschalter Markise Wintergarten
devStateIcon on:ios-on-blue:Aus : off:ios-off:Ein H.*:control_arrow_up R.*:control_arrow_down .*:noIcon
event-on-change-reading .*
group Automatikschalter
icon helper_doif
markise Markise.AUSSEN.Wintergarten
room Aussen->Wintergarten,Infrastruktur->Jalousien
senddebugmessages 1
userattr senddebugmessages markise
webCmd Ein:Aus
Jetzt möchte ich gern die Ausführung der letzten beiden Blöcke um 15 Minuten verzögern; die PV Leistung soll also 15 min. über bzw. unter dem Schwellwert liegen, bevor gefahren wird.
Im FHEM Mode wäre das ein wait mit 0:0:0:900:900 gewesen - im Perl Mode gibt es kein wait Attribut, wie ich eben mitbekommen habe.
Ich könnte jetzt das DOIF im FHEM Mode schreiben und damit das Problem umschiffen. Das gefällt mir aber nicht...
Könnt ihr mir einen Hinweis geben, wie ich das wait realisieren kann?
Danke Peter
Den Code, den du verzögern willst, musst du in eine eigene Sub-Routine auslagern und diese dann per set_Exec verzögert aufrufen.
Hi Damian!
OK; und im jeweils anderem Zweig prüfen ob der entgegengesetzte Timer existent ist und den dann ggf. löschen, sodass die Ausführung abgebrochen wird? Klingt nach einer Idee...
Danke Peter
Zitat von: PSI69 am 07 Juni 2019, 07:49:12
Hi Damian!
OK; und im jeweils anderem Zweig prüfen ob der entgegengesetzte Timer existent ist und den dann ggf. löschen, sodass die Ausführung abgebrochen wird? Klingt nach einer Idee...
Danke Peter
ja, Beispiel dazu findest du hier: https://fhem.de/commandref_DE.html#DOIF_Anwendungsbeispiele_im_Perlmodus (Fenster-offen-Meldung)
OK, danke noch einmal - klappt... :)
Peter