Hauptmenü

DOIF state events und wait?

Begonnen von Sheridan, 17 August 2017, 11:16:37

Vorheriges Thema - Nächstes Thema

Sheridan

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.
FHEM auf RasPi 4 mit CUL (MAX), CUL (IT), JeeLink (LaCrosse), JeeLink (EC3000), DuoFern, Razberry (ZWave) sowie Fritz!Box, Enigma2, Squeezebox, Google Assistant (inkl. Nest Hub 2)
FHEM auf RasPi 3 mit CUL (MAX), TUL (KNX), CUBe (MAX), EnOceanPi (EnOcean)

Per

Schreib mal ein ? vor die ganzen $SELF. Vllt. versucht sich das DOIF gg. Selbsttriggerung zu schützen.