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
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 ;)
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
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]);
}
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
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
and ["^$SELF$:fenster:^closed$"]
und
and ["^$SELF:fenster$:^closed$"]
haben mich auch nicht weiter gebracht.
Peter
Ohne list vom konkreten Vorfall kann man keine Aussagen treffen.
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
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 ;)
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
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(...}
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