DOIF im Perl Mode triggert nur auf erste Bedingung im Block

Begonnen von PSI69, 20 Februar 2019, 21:06:51

Vorheriges Thema - Nächstes Thema

PSI69

Ich mal wieder beim Ändern von 'alten' DOIFs in den Perl Mode...

Folgendes DOIF triggert im 3. Block derzeit nur auf die erste der 4 Bedingungen, also auf 'on':
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] $Message");
      Log 3, $MODUL.": "."Message: '$Message'";
    }
  }
}


## WebCmd
{ if (["^$SELF$:^Ein$"]) {
    set_State("on");                                                                                              ## Status
  }
}
{ if (["^$SELF$:^Aus$"]) {
    set_State("off");                                                                                             ## Status
  }
}

## Winterbetrieb HOCH
{ if (["^$SELF$:^on$"]                                                                                            ## DOIF enabled
  and [Jalousien.Automatik] eq "Winter"                                                                           ## Automatik im Wintermodus
  and [$SELF:frostfrei]                                                                                           ## kein Frost
  and [$SELF:fenster] eq "closed") {                                                                              ## Fenster geschlossen


    $SELF_DebugMessage ("Winterbetrieb HOCH");
     
  }
}

   FUUID      5c6d8a6b-f33f-739f-c471-57c532c65ab1574f
   MODEL      Perl
   NAME       di_Jalousie_OG_AZ
   NR         1449
   NTFY_ORDER 50-di_Jalousie.OG.AZ.NEU
   STATE      on
   TYPE       DOIF
   DOIF_Readings:
     fenster    (::ReadingValDoIf($hash,'Fensterkontakt.OG.AZ','state'))
     frostfrei  (::ReadingValDoIf($hash,'Sensor.Ext.Wetter','temperature') >= ::InternalDoIf($hash,'Jalousien.Temperatur.Frost','STATE'))
   OLDREADINGS:
   READINGS:
     2019-02-20 20:49:50   block_01        executed
     2019-02-20 20:49:49   block_02        executed
     2019-02-20 20:49:50   block_03        executed
     2019-02-20 20:43:41   fenster         closed
     2019-02-20 20:43:41   frostfrei       1
     2019-02-20 20:43:41   mode            enabled
     2019-02-20 20:49:50   state           on
   Regex:
     DOIF_Readings:
       Fensterkontakt.OG.AZ:
         fenster:
           state      ^Fensterkontakt.OG.AZ$:^state:
       Jalousien.Temperatur.Frost:
         frostfrei:
           &STATE     ^Jalousien.Temperatur.Frost$
       Sensor.Ext.Wetter:
         frostfrei:
           temperature ^Sensor.Ext.Wetter$:^temperature:
     accu:
     cond:
       :
         0:
           "^di_Jalousie_OG_AZ$:^Ein$" ^di_Jalousie_OG_AZ$:^Ein$
         1:
           "^di_Jalousie_OG_AZ$:^Aus$" ^di_Jalousie_OG_AZ$:^Aus$
         2:
           "^di_Jalousie_OG_AZ$:^on$" ^di_Jalousie_OG_AZ$:^on$
         3:
   attr:
     cmdState:
   condition:
     0           if (::EventDoIf('^di_Jalousie_OG_AZ$',$hash,'^Ein$',0)) {
    set_State("on");                                                                                                 }

     1           if (::EventDoIf('^di_Jalousie_OG_AZ$',$hash,'^Aus$',0)) {
    set_State("off");                                                                                                }

     2           if (::EventDoIf('^di_Jalousie_OG_AZ$',$hash,'^on$',0)                                                                                               and ::InternalDoIf($hash,'Jalousien.Automatik','STATE') eq "Winter"                                                                              and ::ReadingValDoIf($hash,'di_Jalousie_OG_AZ','frostfrei')                                                                                              and ::ReadingValDoIf($hash,'di_Jalousie_OG_AZ','fenster') eq "closed") {                                                                               

    di_Jalousie_OG_AZ_DebugMessage ("Winterbetrieb HOCH");
     
  }

     3         
   devices:
     2           Jalousien.Automatik di_Jalousie_OG_AZ
     all         Jalousien.Automatik di_Jalousie_OG_AZ
   helper:
     event      on
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev di_Jalousie_OG_AZ
     triggerEvents:
       Ein
       on
       block_01: executed
       block_03: executed
     triggerEventsState:
       Ein
       on
       block_01: executed
       block_03: executed
   internals:
     2           Jalousien.Automatik:STATE
     all         Jalousien.Automatik:STATE
   itimer:
   perlblock:
     0         
     1         
     2         
     3         
   readings:
     2           di_Jalousie_OG_AZ:frostfrei di_Jalousie_OG_AZ:fenster
     all         di_Jalousie_OG_AZ:frostfrei di_Jalousie_OG_AZ:fenster
   trigger:
   uiState:
   uiTable:
Attributes:
   DOIF_Readings frostfrei:([Sensor.Ext.Wetter:temperature] >= [Jalousien.Temperatur.Frost]),
fenster:([Fensterkontakt.OG.AZ:state])
   alias      Automatikschalter Jalousie OG AZ (NEU)
   devStateIcon on:ios-on-blue:Aus : off:ios-off:Ein .*:noIcon
   group      Automatikschalter
   icon       helper_doif
   room       Infrastruktur->Jalousien,Obergeschoss->Arbeitszimmer
   senddebugmessages 1
   userattr   senddebugmessages
   webCmd     Ein:Aus


Ich möchte erreichen, dass egal welche der 4 Bedingungen als letzte zutrifft, der Block getriggert wird. Ich bekomme derzeit allerdings nur bei der ersten Bedingung die Telegram Benachrichtigung und den Eintrag im Logfile. Komischerweise behauptet folgendes, dass der Block mit dem Schließen des Fensters ausgeführt worden ist:

2019-02-20 20:54:47   block_03        executed
2019-02-20 20:54:47   e_di_Jalousie_OG_AZ_fenster closed
2019-02-20 20:54:47   fenster         closed


... nur, eben keine Nachricht an mich?!? Hm, später sollen dann noch weitere Bedingungen hinzu kommen (Zeit, Helligkeit, etc.); nur das weiter zu verkomplizieren bringt mir derzeit mit diesem Stand nichts...
Ach ja, event_Readings haben auch nichts gebracht - hier sehe ich nur die Änderung der Readings gleich im Webinterface; hätte mich auch gewundert laut Beschreibung in der cmdref. FHEM ist aktuell; update noch einmal zur Sicherheit durchgeführt :-\

Wo habe ich den Hänger?

Danke Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Damian

Die Lösung ist ganz einfach.

Das hier ["^$SELF$:^on$"] ist ein Ereignistrigger, dieser ist nur dann wahr, wenn er triggert, sonst nicht - den Rest kannst du dir schon denken ;)

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

PSI69

Zitat von: Damian am 20 Februar 2019, 21:45:04
Das hier ["^$SELF$:^on$"] ist ein Ereignistrigger, dieser ist nur dann wahr, wenn er triggert, sonst nicht - den Rest kannst du dir schon denken ;)
OK, ich muss diesen also in das Format der anderen 3 bringen; schön - Danke!

Gibt es eigentlich einen Unterschied im Verhalten, wenn ich schreibe:
if ([Bedingung]
  and [Bedingung]
  and [Bedingung]
  and [Bedingung]) {
    code...;   
  }


oder:
if ([Bedingung]) {
  if ([Bedingung]) {
    if ([Bedingung]) {
      if ([Bedingung]) {
        code...;
      }
    }
  }   
}


... außer im Aussehen?

Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Damian

Zitat von: PSI69 am 21 Februar 2019, 07:42:35
OK, ich muss diesen also in das Format der anderen 3 bringen; schön - Danke!

Gibt es eigentlich einen Unterschied im Verhalten, wenn ich schreibe:
if ([Bedingung]
  and [Bedingung]
  and [Bedingung]
  and [Bedingung]) {
    code...;   
  }


oder:
if ([Bedingung]) {
  if ([Bedingung]) {
    if ([Bedingung]) {
      if ([Bedingung]) {
        code...;
      }
    }
  }   
}


... außer im Aussehen?

Peter

Im Perl-Modus ist es egal, denn egal wo die Trigger-Angabe in eckigen Klammern innerhalb eines Blocks steht, es wird immer der gesamte Block ausgewertet, der Rest ist Perl und hier gelten die Auswertungsmechanismen von Perl, wie in jeder anderen höheren Programmiersprache. Wie in der Doku schon geschrieben, in einfachen Fällen braucht man noch nicht mal if z. B.

{
set_State([bla]);
}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PSI69

Zitat von: Damian am 21 Februar 2019, 09:02:34
Im Perl-Modus ist es egal

Schön, hatte ich gehofft/vermutet; nun kann es also weiter gehen. Ich danke Dir noch einmal!
Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

PSI69

Hi Damian,

ich stehe noch immer auf dem Schlauch, und dabei hatte ich gadacht, es ist so einfach... Ich habe die Referenz zu DOIF hoch und runter gelesen, vor allem das hier:
Operanden in der Bedingung und im Perl-Modus

    Events [<Device>:"<Regex-Events>"] oder ["<Regex-Devices>:<Regex-Events>"] oder ["<Regex-Devices>"⟨:"<Regex-Filter>"⟩⟨:<Output>⟩,<Default>]
    für <Regex> gilt: ^<ist eindeutig>$, ^<beginnt mit>, <endet mit>$, "" entspricht ".*", Regex-Filter ist mit [^\:]*: (.*) vorbelegt siehe auch Reguläre Ausdrücke und Events des Gerätes global


Das hier ist jetzt meine Spielwiese:
## Winterbetrieb HOCH
{ if (!([$SELF:"off"])                                                                                            ## DOIF enabled
##  and [Jalousien.Automatik:"Winter"]                                                                                ## Automatik im Wintermodus
##  and [$SELF:frostfrei]                                                                                           ## kein Frost
  and [$SELF:fenster] eq "closed"                                                                                 ## Fenster geschlossen
  and !([$SELF:"H"])                                                                                              ## nicht schon ausgeführt
  ){

    set_State("H");                                                                                               ## Status

    $SELF_DebugMessage ("Winterbetrieb HOCH");
     
  }
}

Öffne ich jetzt das Fenster, geht das doif_reading 'fenster' auf 'open'. Jetzt das DOIF enablen ($SELF auf on), dann das Fenster wieder schließen und nichts passiert außer:
Zitatblock_03   executed   2019-02-22 16:58:36
e_di_p_Jalousie_OG_AZ_events   fenster: closed,e_di_p_Jalousie_OG_AZ_fenster: closed   2019-02-22 16:58:36
e_di_p_Jalousie_OG_AZ_fenster   closed   2019-02-22 16:58:36
Gleiches passiert, wenn ich die '[$SELF:fenster]' Bedingung auskommentiere und dafür den Kommentar bei '[$SELF:frostfrei]' entferne: Ich ändere die Bedingung für das Reading 'frostfrei' so, dass als Inhalt vom Reading nicht mehr '1', sondern '' herauskommt. Dann wieder das DOIF enablen ($SELF auf on), dann das doif_reading 'frostfrei' anpassen, dass wieder '1' darin als Wert steht - und der Block wird nicht ausgeführt. Dito mit der Winter Bedingung...
Nach 3 Jahren FHEM denke ich manchmal, jetzt hast Du es - jetzt allerdings gerade: Perl und ich werden wohl nie Freunde :(

Dein Hinweis war dann wohl nicht ausreichend.
Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

PSI69

and ["^$SELF$:fenster:^closed$"]
und
and ["^$SELF:fenster$:^closed$"]

haben mich auch nicht weiter gebracht.
Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Damian

Ohne list vom konkreten Vorfall kann man keine Aussagen treffen.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PSI69

Ein kleines Stück weiter:

Ich hatte das DOIF erst mit '.' im Namen statt der '_' angelegt, das hat aber Probleme gamacht wegen Perl & Sonderzeichen... Jedenfalls stand nach dem Umbenennen mit 'rename...' unter NTFY_ORDER nicht '50-di_p_Jalousie_OG_AZ', sondern irgend etwas mit dem alten Namen, also mit den Punkten. Ich habe mir also die RAW Definition kopiert, das Device gelöscht und RAW wieder hinzu gefügt. Nun klappen zumindest teilweise die Trigger.

Internals:
   CFGFN     
   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] $Message");
      Log 3, $MODUL.": "."Message: '$Message'";
    }
  }
}


## WebCmd
{ if (["^$SELF$:^Ein$"]) {
    set_State("on");                                                                                              ## Status
  }
}
{ if (["^$SELF$:^Aus$"]) {
    set_State("off");                                                                                             ## Status
  }
}

## Winterbetrieb HOCH
{ if (!([$SELF:"off"])                                                                                            ## DOIF enabled und nicht ausgeführt
  and [Jalousien.Automatik:"Winter"]                                                                              ## Automatik im Wintermodus
  and [$SELF:frostfrei] eq "1"                                                                                    ## kein Frost
  and [$SELF:fenster] eq "closed"                                                                                 ## Fenster geschlossen

  and !([$SELF:"H"])                                                                                              ## nicht schon ausgeführt
  ){

    set_State("H");                                                                                               ## Status

    $SELF_DebugMessage ("Winterbetrieb HOCH");
     
  }
}

   FUUID      5c702e98-f33f-739f-9ab8-44a58cf9f6aed08d
   MODEL      Perl
   NAME       di_p_Jalousie_OG_AZ
   NR         57972
   NTFY_ORDER 50-di_p_Jalousie_OG_AZ
   STATE      on
   TYPE       DOIF
   DOIF_Readings:
     azimut     ((::ReadingValDoIf($hash,'Twilight','azimuth') >= 140) and (::ReadingValDoIf($hash,'Twilight','azimuth') <= 150))
     fenster    (::ReadingValDoIf($hash,'Fensterkontakt.OG.AZ','state'))
     frostfrei  (::ReadingValDoIf($hash,'Sensor.Ext.Wetter','temperature') >= ::InternalDoIf($hash,'Jalousien.Temperatur.Frost','STATE'))
     twilight_sr_we (twilight("Twilight","sr_indoor", AttrVal("Jalousien.Zeiten","SunRiseMinTimeWeekend","7:30"), AttrVal("Jalousien.Zeiten","SunRiseMaxTime","9:00")))
     twilight_sr_wt (twilight("Twilight","sr_indoor", AttrVal("Jalousien.Zeiten","SunRiseMinTimeWeekend","6:30"), AttrVal("Jalousien.Zeiten","SunRiseMaxTime","9:00")))
     twilight_ss (h2hms_fmt(hms2h(twilight("Twilight","ss_indoor", AttrVal("Jalousien.Zeiten","SunSetMinTime","15:00"), AttrVal("Jalousien.Zeiten","SunSetMaxTime","22:30")))+hms2h(AttrVal("Jalousien.Zeiten","SunSetOffset","0:30"))))
     twilight_ss_br (h2hms_fmt(hms2h(twilight("Twilight","ss_indoor", AttrVal("Jalousien.Zeiten","SunSetMinTime","15:00"), AttrVal("Jalousien.Zeiten","SunSetMaxTime","22:30")))+hms2h(AttrVal("Jalousien.Zeiten","SunSetOffset","0:30"))-hms2h("01:00")))
   READINGS:
     2019-02-22 18:29:27   Device          Jalousien.Automatik
     2019-02-22 18:17:13   azimut         
     2019-02-22 18:29:41   block_01        executed
     2019-02-22 18:29:51   block_03        executed
     2019-02-22 18:29:27   e_Jalousien.Automatik_events Winter
     2019-02-22 18:29:51   e_di_p_Jalousie_OG_AZ_events fenster: closed,e_di_p_Jalousie_OG_AZ_fenster: closed
     2019-02-22 18:29:51   e_di_p_Jalousie_OG_AZ_fenster closed
     2019-02-22 18:29:51   fenster         closed
     2019-02-22 18:24:01   frostfrei       1
     2019-02-22 18:29:13   mode            enabled
     2019-02-22 18:29:41   state           on
     2019-02-22 18:17:13   twilight_sr_we  08:00:00
     2019-02-22 18:17:13   twilight_sr_wt  08:00:00
     2019-02-22 18:17:13   twilight_ss     18:05:20
     2019-02-22 18:17:13   twilight_ss_br  17:05:20
   Regex:
     DOIF_Readings:
       Fensterkontakt.OG.AZ:
         fenster:
           state      ^Fensterkontakt.OG.AZ$:^state:
       Jalousien.Temperatur.Frost:
         frostfrei:
           &STATE     ^Jalousien.Temperatur.Frost$
       Sensor.Ext.Wetter:
         frostfrei:
           temperature ^Sensor.Ext.Wetter$:^temperature:
       Twilight:
         azimut:
           azimuth    ^Twilight$:^azimuth:
     accu:
     cond:
       :
         0:
           "^di_p_Jalousie_OG_AZ$:^Ein$" ^di_p_Jalousie_OG_AZ$:^Ein$
         1:
           "^di_p_Jalousie_OG_AZ$:^Aus$" ^di_p_Jalousie_OG_AZ$:^Aus$
         2:
         3:
   attr:
     cmdState:
   condition:
     0           if (::EventDoIf('^di_p_Jalousie_OG_AZ$',$hash,'^Ein$',0)) {
    set_State("on");                                                                                                 }

     1           if (::EventDoIf('^di_p_Jalousie_OG_AZ$',$hash,'^Aus$',0)) {
    set_State("off");                                                                                                }

     2           if (!(::EventDoIf('di_p_Jalousie_OG_AZ',$hash,'off',1))                                                                                               and ::EventDoIf('Jalousien.Automatik',$hash,'Winter',1)                                                                                 and ::ReadingValDoIf($hash,'di_p_Jalousie_OG_AZ','frostfrei') eq "1"                                                                                       and ::ReadingValDoIf($hash,'di_p_Jalousie_OG_AZ','fenster') eq "closed"                                                                                 
  and !(::EventDoIf('di_p_Jalousie_OG_AZ',$hash,'H',1))                                                                                                 ){

    set_State("H");                                                                                               
    di_p_Jalousie_OG_AZ_DebugMessage ("Winterbetrieb HOCH");
     
  }

     3         
   devices:
     2           di_p_Jalousie_OG_AZ Jalousien.Automatik
     all         di_p_Jalousie_OG_AZ Jalousien.Automatik
   helper:
     DOIF_Readings_events
     event      fenster: closed
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev di_p_Jalousie_OG_AZ
     triggerEvents:
       fenster: closed
       e_di_p_Jalousie_OG_AZ_fenster: closed
     triggerEventsState:
       fenster: closed
   internals:
   itimer:
   perlblock:
     0         
     1         
     2         
     3         
   readings:
     2           di_p_Jalousie_OG_AZ:frostfrei di_p_Jalousie_OG_AZ:fenster
     all         di_p_Jalousie_OG_AZ:frostfrei di_p_Jalousie_OG_AZ:fenster
   trigger:
     all         di_p_Jalousie_OG_AZ Jalousien.Automatik
   uiState:
   uiTable:
Attributes:
   DOIF_Readings frostfrei:([Sensor.Ext.Wetter:temperature] >= [Jalousien.Temperatur.Frost]),
fenster:([Fensterkontakt.OG.AZ:state]),
azimut:(([Twilight:azimuth] >= 140) and ([Twilight:azimuth] <= 150)),
twilight_sr_we:(twilight("Twilight","sr_indoor", AttrVal("Jalousien.Zeiten","SunRiseMinTimeWeekend","7:30"), AttrVal("Jalousien.Zeiten","SunRiseMaxTime","9:00"))),
twilight_sr_wt:(twilight("Twilight","sr_indoor", AttrVal("Jalousien.Zeiten","SunRiseMinTimeWeekend","6:30"), AttrVal("Jalousien.Zeiten","SunRiseMaxTime","9:00"))),
twilight_ss:(h2hms_fmt(hms2h(twilight("Twilight","ss_indoor", AttrVal("Jalousien.Zeiten","SunSetMinTime","15:00"), AttrVal("Jalousien.Zeiten","SunSetMaxTime","22:30")))+hms2h(AttrVal("Jalousien.Zeiten","SunSetOffset","0:30")))),
twilight_ss_br:(h2hms_fmt(hms2h(twilight("Twilight","ss_indoor", AttrVal("Jalousien.Zeiten","SunSetMinTime","15:00"), AttrVal("Jalousien.Zeiten","SunSetMaxTime","22:30")))+hms2h(AttrVal("Jalousien.Zeiten","SunSetOffset","0:30"))-hms2h("01:00")))
   alias      Automatikschalter Jalousie OG AZ (NEU)
   devStateIcon on:ios-on-blue:Aus : off:ios-off:Ein H:control_arrow_up R:control_arrow_down .*:noIcon
   group      Automatikschalter
   icon       helper_doif
   room       Infrastruktur->Jalousien,Obergeschoss->Arbeitszimmer
   senddebugmessages 1
   userattr   senddebugmessages
   webCmd     Ein:Aus


Aktuell wird nur auf [Jalousien.Automatik:"Winter"] getriggert. Das obere list enthält das Ergebnis bei einem Versuch über den Fensterkontakt (DOIF Reading 'fenster'). Kommentiere ich die 'Winter' Bedingung aus, klappt das Triggern über 'fenster':
Internals:
   CFGFN     
   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] $Message");
      Log 3, $MODUL.": "."Message: '$Message'";
    }
  }
}


## WebCmd
{ if (["^$SELF$:^Ein$"]) {
    set_State("on");                                                                                              ## Status
  }
}
{ if (["^$SELF$:^Aus$"]) {
    set_State("off");                                                                                             ## Status
  }
}

## Winterbetrieb HOCH
{ if (!([$SELF:"off"])                                                                                            ## DOIF enabled und nicht ausgeführt
##  and [Jalousien.Automatik:"Winter"]                                                                              ## Automatik im Wintermodus
  and [$SELF:frostfrei] eq "1"                                                                                    ## kein Frost
  and [$SELF:fenster] eq "closed"                                                                                 ## Fenster geschlossen

  and !([$SELF:"H"])                                                                                              ## nicht schon ausgeführt
  ){

    set_State("H");                                                                                               ## Status

    $SELF_DebugMessage ("Winterbetrieb HOCH");
     
  }
}

   FUUID      5c702e98-f33f-739f-9ab8-44a58cf9f6aed08d
   MODEL      Perl
   NAME       di_p_Jalousie_OG_AZ
   NR         57972
   NTFY_ORDER 50-di_p_Jalousie_OG_AZ
   STATE      H
   TYPE       DOIF
   DOIF_Readings:
     azimut     ((::ReadingValDoIf($hash,'Twilight','azimuth') >= 140) and (::ReadingValDoIf($hash,'Twilight','azimuth') <= 150))
     fenster    (::ReadingValDoIf($hash,'Fensterkontakt.OG.AZ','state'))
     frostfrei  (::ReadingValDoIf($hash,'Sensor.Ext.Wetter','temperature') >= ::InternalDoIf($hash,'Jalousien.Temperatur.Frost','STATE'))
     twilight_sr_we (twilight("Twilight","sr_indoor", AttrVal("Jalousien.Zeiten","SunRiseMinTimeWeekend","7:30"), AttrVal("Jalousien.Zeiten","SunRiseMaxTime","9:00")))
     twilight_sr_wt (twilight("Twilight","sr_indoor", AttrVal("Jalousien.Zeiten","SunRiseMinTimeWeekend","6:30"), AttrVal("Jalousien.Zeiten","SunRiseMaxTime","9:00")))
     twilight_ss (h2hms_fmt(hms2h(twilight("Twilight","ss_indoor", AttrVal("Jalousien.Zeiten","SunSetMinTime","15:00"), AttrVal("Jalousien.Zeiten","SunSetMaxTime","22:30")))+hms2h(AttrVal("Jalousien.Zeiten","SunSetOffset","0:30"))))
     twilight_ss_br (h2hms_fmt(hms2h(twilight("Twilight","ss_indoor", AttrVal("Jalousien.Zeiten","SunSetMinTime","15:00"), AttrVal("Jalousien.Zeiten","SunSetMaxTime","22:30")))+hms2h(AttrVal("Jalousien.Zeiten","SunSetOffset","0:30"))-hms2h("01:00")))
   READINGS:
     2019-02-22 18:17:13   azimut         
     2019-02-22 18:40:55   block_01        executed
     2019-02-22 18:41:13   block_03        executed
     2019-02-22 18:41:13   e_di_p_Jalousie_OG_AZ_events H
     2019-02-22 18:41:13   e_di_p_Jalousie_OG_AZ_fenster closed
     2019-02-22 18:41:13   fenster         closed
     2019-02-22 18:24:01   frostfrei       1
     2019-02-22 18:40:26   mode            enabled
     2019-02-22 18:41:13   state           H
     2019-02-22 18:17:13   twilight_sr_we  08:00:00
     2019-02-22 18:17:13   twilight_sr_wt  08:00:00
     2019-02-22 18:17:13   twilight_ss     18:05:20
     2019-02-22 18:17:13   twilight_ss_br  17:05:20
   Regex:
     DOIF_Readings:
       Fensterkontakt.OG.AZ:
         fenster:
           state      ^Fensterkontakt.OG.AZ$:^state:
       Jalousien.Temperatur.Frost:
         frostfrei:
           &STATE     ^Jalousien.Temperatur.Frost$
       Sensor.Ext.Wetter:
         frostfrei:
           temperature ^Sensor.Ext.Wetter$:^temperature:
       Twilight:
         azimut:
           azimuth    ^Twilight$:^azimuth:
     accu:
     cond:
       :
         0:
           "^di_p_Jalousie_OG_AZ$:^Ein$" ^di_p_Jalousie_OG_AZ$:^Ein$
         1:
           "^di_p_Jalousie_OG_AZ$:^Aus$" ^di_p_Jalousie_OG_AZ$:^Aus$
         2:
         3:
   attr:
     cmdState:
   condition:
     0           if (::EventDoIf('^di_p_Jalousie_OG_AZ$',$hash,'^Ein$',0)) {
    set_State("on");                                                                                                 }

     1           if (::EventDoIf('^di_p_Jalousie_OG_AZ$',$hash,'^Aus$',0)) {
    set_State("off");                                                                                                }

     2           if (!(::EventDoIf('di_p_Jalousie_OG_AZ',$hash,'off',1))                                                                                                and ::ReadingValDoIf($hash,'di_p_Jalousie_OG_AZ','frostfrei') eq "1"                                                                                       and ::ReadingValDoIf($hash,'di_p_Jalousie_OG_AZ','fenster') eq "closed"                                                                                 
  and !(::EventDoIf('di_p_Jalousie_OG_AZ',$hash,'H',1))                                                                                                 ){

    set_State("H");                                                                                               
    di_p_Jalousie_OG_AZ_DebugMessage ("Winterbetrieb HOCH");
     
  }

     3         
   devices:
     2           di_p_Jalousie_OG_AZ
     all         di_p_Jalousie_OG_AZ
   helper:
     DOIF_Readings_events
     event      H
     globalinit 1
     last_timer 0
     sleeptimer -1
     triggerDev di_p_Jalousie_OG_AZ
     triggerEvents:
       H
       e_di_p_Jalousie_OG_AZ_events: H
     triggerEventsState:
       state: H
   internals:
   itimer:
   perlblock:
     0         
     1         
     2         
     3         
   readings:
     2           di_p_Jalousie_OG_AZ:frostfrei di_p_Jalousie_OG_AZ:fenster
     all         di_p_Jalousie_OG_AZ:frostfrei di_p_Jalousie_OG_AZ:fenster
   trigger:
     all         di_p_Jalousie_OG_AZ
   uiState:
   uiTable:
Attributes:
   DOIF_Readings frostfrei:([Sensor.Ext.Wetter:temperature] >= [Jalousien.Temperatur.Frost]),
fenster:([Fensterkontakt.OG.AZ:state]),
azimut:(([Twilight:azimuth] >= 140) and ([Twilight:azimuth] <= 150)),
twilight_sr_we:(twilight("Twilight","sr_indoor", AttrVal("Jalousien.Zeiten","SunRiseMinTimeWeekend","7:30"), AttrVal("Jalousien.Zeiten","SunRiseMaxTime","9:00"))),
twilight_sr_wt:(twilight("Twilight","sr_indoor", AttrVal("Jalousien.Zeiten","SunRiseMinTimeWeekend","6:30"), AttrVal("Jalousien.Zeiten","SunRiseMaxTime","9:00"))),
twilight_ss:(h2hms_fmt(hms2h(twilight("Twilight","ss_indoor", AttrVal("Jalousien.Zeiten","SunSetMinTime","15:00"), AttrVal("Jalousien.Zeiten","SunSetMaxTime","22:30")))+hms2h(AttrVal("Jalousien.Zeiten","SunSetOffset","0:30")))),
twilight_ss_br:(h2hms_fmt(hms2h(twilight("Twilight","ss_indoor", AttrVal("Jalousien.Zeiten","SunSetMinTime","15:00"), AttrVal("Jalousien.Zeiten","SunSetMaxTime","22:30")))+hms2h(AttrVal("Jalousien.Zeiten","SunSetOffset","0:30"))-hms2h("01:00")))
   alias      Automatikschalter Jalousie OG AZ (NEU)
   devStateIcon on:ios-on-blue:Aus : off:ios-off:Ein H:control_arrow_up R:control_arrow_down .*:noIcon
   group      Automatikschalter
   icon       helper_doif
   room       Infrastruktur->Jalousien,Obergeschoss->Arbeitszimmer
   senddebugmessages 1
   userattr   senddebugmessages
   webCmd     Ein:Aus


Ich werde noch irre ::)
Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Damian

Das hatten wir doch schon mal:

[Jalousien.Automatik:"Winter"]  ist eine Triggerabfrage, die nur wahr ist, wenn Jalousien.Automatik triggert, sonst nicht

Wenn Fenster triggert ist die obige Abfrage nicht wahr und damit deine and-Verknüpfungen auch nicht.

Du musst es auf Zustandsabfrage ändern

[Jalousien.Automatik]  eq "Winter"

kommt mir alles sehr bekannt vor ;)
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PSI69

Zitat von: Damian am 22 Februar 2019, 18:57:00
kommt mir alles sehr bekannt vor ;)
Da hast Du wohl Recht! Im List vom ersten Post stand es schon korrekt - ich hatte gefühlt 100* alles durcheinander gewürfelt und die Zeile übersehen. Jetzt klappt alles; vielen Dank für Deine 'Engelsgeduld' ;)

Noch etwas anderes: Ich habe da noch so ein paar doif_Readings angelegt, an deren Sinnhaftigkeit ich inzwischen zweifle:
twilight_sr_we:(twilight("Twilight","sr_indoor", AttrVal("Jalousien.Zeiten","SunRiseMinTimeWeekend","7:30"), AttrVal("Jalousien.Zeiten","SunRiseMaxTime","9:00"))),
twilight_sr_wt:(twilight("Twilight","sr_indoor", AttrVal("Jalousien.Zeiten","SunRiseMinTimeWeekend","6:30"), AttrVal("Jalousien.Zeiten","SunRiseMaxTime","9:00"))),
twilight_ss:(h2hms_fmt(hms2h(twilight("Twilight","ss_indoor", AttrVal("Jalousien.Zeiten","SunSetMinTime","15:00"), AttrVal("Jalousien.Zeiten","SunSetMaxTime","22:30")))+hms2h(AttrVal("Jalousien.Zeiten","SunSetOffset","0:30")))),
twilight_ss_br:(h2hms_fmt(hms2h(twilight("Twilight","ss_indoor", AttrVal("Jalousien.Zeiten","SunSetMinTime","15:00"), AttrVal("Jalousien.Zeiten","SunSetMaxTime","22:30")))+hms2h(AttrVal("Jalousien.Zeiten","SunSetOffset","0:30"))-hms2h("01:00")))


Die werden doch nie aktualisiert, da hier kein Triggern stattfindet, oder?

Mein Ziel ist, die einzelnen Blöcke im DOIF knapp und übersichtlich zu bekommen, da wollte ich den Code in den Readings 'verstecken'.

Was hältst Du von dieser Alternative: Da ich die selben Berechnungen/Twilight Werte bei 14 Jalousien-DOIFs benötige - die 4 Werte als Reading ein einem weiterem DOIF für alle anderen zur Verfügung stellen und dort einmal am Tag per Zeitangabe befüllen? Ich hoffe, das war verständlich ausgedrückt?!?

Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...

Damian

Zitat von: PSI69 am 22 Februar 2019, 20:21:07
Die werden doch nie aktualisiert, da hier kein Triggern stattfindet, oder?

Mein Ziel ist, die einzelnen Blöcke im DOIF knapp und übersichtlich zu bekommen, da wollte ich den Code in den Readings 'verstecken'.

Was hältst Du von dieser Alternative: Da ich die selben Berechnungen/Twilight Werte bei 14 Jalousien-DOIFs benötige - die 4 Werte als Reading ein einem weiterem DOIF für alle anderen zur Verfügung stellen und dort einmal am Tag per Zeitangabe befüllen? Ich hoffe, das war verständlich ausgedrückt?!?

Das kannst du machen, wie du es für sinnvoll hältst.

DOIF_Reading bzw. neuerdings event_Readings brauchen immer mindestens eine Angabe in eckigen Klammern, sonst ist keiner zum Triggern da

Mit set_Reading kannst du natürlich auch selber Readings setzen. Den Trigger musst du selbst angeben, das kann hierbei auch ein Zeittrigger sein.

{[00:00];set_Reading(...}
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

PSI69

Zitat von: Damian am 22 Februar 2019, 20:41:26
{[00:00];set_Reading(...}

Danke, genau so war die Überlegung - nur hatte ich nicht an das DOIF set_Reading gedacht und war schon dabei SetReading zu benutzen :D
Peter
FHEM auf RPi 5 unter Bookworm mit inzwischen einem ganzen Zoo von Geräten...