DOIF im Perl Mode und wait Attribut

Begonnen von PSI69, 06 Juni 2019, 21:38:54

Vorheriges Thema - Nächstes Thema

PSI69

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
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Damian

Den Code, den du verzögern willst, musst du in eine eigene Sub-Routine auslagern und diese dann per set_Exec verzögert aufrufen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PSI69

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
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Damian

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)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PSI69

OK, danke noch einmal - klappt... :)
Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...