Hallo zusammen,
ich habe bei einem komplexeren DOIF das Problem, dass oft kein state event ausgelöst wird, wenn der DOIF Zustand wechselt. Mein DOIF:
([+30] &&
(ReadingsAge("hpkAussenWetterstation","humidity",0) >= [$SELF:maxAgeWetterstation] ||
ReadingsAge("dfAussenTerrasseUmweltSensor","isRaining",0) >= [$SELF:maxAgeUmweltsensor]))
(
{
fhem("set tgbTelegram send Wetter unbekannt: " . ReadingsAge("hpkAussenWetterstation","humidity",0) . "s/" . ReadingsAge("dfAussenTerrasseUmweltSensor","isRaining",0) . "s, [hpkAussenWetterstation:humidity]%, [hpkAussenWetterstation:wind_speed]/[hpkAussenWetterstation:wind_gust] km/h, [dfAussenTerrasseUmweltSensor:wind] m/s, Regen: [hpkAussenWetterstation:israining]/[dfAussenTerrasseUmweltSensor:isRaining]")
}
)
DOELSEIF
([hpkAussenWetterstation:humidity] >= [$SELF:maxHumidityWetterstation] ||
[hpkAussenWetterstation:wind_speed] >= [$SELF:maxWindWetterstation] ||
[hpkAussenWetterstation:wind_gust] >= [$SELF:maxWindGustWetterstation] ||
[hpkAussenWetterstation:israining] > 0 ||
[dfAussenTerrasseUmweltSensor:wind] >= [$SELF:maxWindUmweltsensor] ||
[dfAussenTerrasseUmweltSensor:isRaining] > 0)
(
{
fhem("set tgbTelegram send Wetter sehr schlecht: " . ReadingsAge("hpkAussenWetterstation","humidity",0) . "s/" . ReadingsAge("dfAussenTerrasseUmweltSensor","isRaining",0) . "s, [hpkAussenWetterstation:humidity]%, [hpkAussenWetterstation:wind_speed]/[hpkAussenWetterstation:wind_gust] km/h, [dfAussenTerrasseUmweltSensor:wind] m/s, Regen: [hpkAussenWetterstation:israining]/[dfAussenTerrasseUmweltSensor:isRaining]")
}
)
DOELSEIF
(([hpkAussenWetterstation:humidity] >= [$SELF:highHumidityWetterstation] ||
[hpkAussenWetterstation:wind_speed] >= [$SELF:highWindWetterstation] ||
[hpkAussenWetterstation:wind_gust] >= [$SELF:highWindGustWetterstation] ||
[dfAussenTerrasseUmweltSensor:wind] >= [$SELF:highWindUmweltsensor]) &&
[hpkAussenWetterstation:israining] == 0 &&
[dfAussenTerrasseUmweltSensor:isRaining] == 0)
(
{
fhem("set tgbTelegram send Wetter schlecht: " . ReadingsAge("hpkAussenWetterstation","humidity",0) . "s/" . ReadingsAge("dfAussenTerrasseUmweltSensor","isRaining",0) . "s, [hpkAussenWetterstation:humidity]%, [hpkAussenWetterstation:wind_speed]/[hpkAussenWetterstation:wind_gust] km/h, [dfAussenTerrasseUmweltSensor:wind] m/s, Regen: [hpkAussenWetterstation:israining]/[dfAussenTerrasseUmweltSensor:isRaining]")
}
)
DOELSEIF
([hpkAussenWetterstation:humidity] < [$SELF:highHumidityWetterstation] &&
[hpkAussenWetterstation:wind_speed] < [$SELF:highWindWetterstation] &&
[hpkAussenWetterstation:wind_gust] < [$SELF:highWindGustWetterstation] &&
[dfAussenTerrasseUmweltSensor:wind] < [$SELF:highWindUmweltsensor] &&
[hpkAussenWetterstation:israining] == 0 &&
[dfAussenTerrasseUmweltSensor:isRaining] == 0 &&
ReadingsAge("hpkAussenWetterstation","humidity",0) < [$SELF:maxAgeWetterstation] &&
ReadingsAge("dfAussenTerrasseUmweltSensor","isRaining",0) < [$SELF:maxAgeUmweltsensor])
(
{
fhem("set tgbTelegram send Wetter gut (wait): " . ReadingsAge("hpkAussenWetterstation","humidity",0) . "s/" . ReadingsAge("dfAussenTerrasseUmweltSensor","isRaining",0) . "s, [hpkAussenWetterstation:humidity]%, [hpkAussenWetterstation:wind_speed]/[hpkAussenWetterstation:wind_gust] km/h, [dfAussenTerrasseUmweltSensor:wind] m/s, Regen: [hpkAussenWetterstation:israining]/[dfAussenTerrasseUmweltSensor:isRaining]")
}
)
(
{
fhem("set tgbTelegram send Wetter gut: " . ReadingsAge("hpkAussenWetterstation","humidity",0) . "s/" . ReadingsAge("dfAussenTerrasseUmweltSensor","isRaining",0) . "s, [hpkAussenWetterstation:humidity]%, [hpkAussenWetterstation:wind_speed]/[hpkAussenWetterstation:wind_gust] km/h, [dfAussenTerrasseUmweltSensor:wind] m/s, Regen: [hpkAussenWetterstation:israining]/[dfAussenTerrasseUmweltSensor:isRaining]")
}
)
Attributes:
cmdState unknown|very_bad|bad|good_wait,good
icon helper_doif
wait 0:0:0:0,300
Ziel des DOIFs ist:
- Wenn die Sensoren nicht mehr senden in den Zustant 1 ("unknown") zu gehen
- Bei bestimmten Schwellen (als Readings im DOIF gesetzt) in bad/very_bad zu gehen
- Wenn alles gut ist, nach good_wait und nach Wartezeit dann in good (was meine Markisensteuerung wieder freigibt)
Es wird nun z.B. bei Regenbeginn (dfAussenTerrasseUmweltSensor:isRaining) zuverlässig in "very_bad" umgeschaltet, aber kein Event erzeugt. D.h. ein DOIF der Art:
([ifMarkiseWetter] eq "very_bad" ||
[ifMarkiseWetter] eq "bad" ||
[ifMarkiseWetter] eq "unknown")
(set tgbTelegram send MarkiseSued: weather retract)
(set zwvAussenMarkiseSued retract)
Attributes:
checkReadingEvent 1
do always
group Logic
icon helper_doif
room Aussen,_logic
wird nicht ausgeführt. Auch im Eventmonitor bzw. den DOIFTools Logging etc. sieht man, dass kein Event erzeugt wird.
Ich habe nun das Attribut
wait 0:0:0:0,300
in
wait 1:1:1:1,300
geändert und damit werden die Events dann erzeugt. Allerdings hat das einen anderen Nachteil. Es wird nun vor der Statusänderung das Event
2017-08-17_11:04:14.463 ifMarkiseWetter wait_timer: 17.08.2017 11:04:14 cmd_4_1 dfAussenTerrasseUmweltSensor
2017-08-17_11:04:14.463 ifMarkiseWetter wait_timer: no timer
erzeugt. Obwohl ich in meinem anderen DOIF, was die Markise einfährt, explizit mit checkReadingEvent 1 arbeite, führt dieses Event dazu, dass die Markise auch beim Umschalten nach "good_wait" einfährt, weil das Timer-Event dieses DOIF triggert und zu diesem Zeitpunkt der state noch auf "bad" steht.
Mache ich was falsch oder ist hier irgendwo ein Bug?
Ich konnte den Fehler mit den fehlenden state-Events mit einem ganz simplen DOIF bislang nicht reproduzieren.
Schreib mal ein ? vor die ganzen $SELF. Vllt. versucht sich das DOIF gg. Selbsttriggerung zu schützen.