[Gelöst] DOIF Bedingung wird immer als falsch evaluiert

Begonnen von SCKWorld2012, 21 Dezember 2021, 10:33:31

Vorheriges Thema - Nächstes Thema

SCKWorld2012

Hi zusammen,

ich denke ich antworte lieber in einer Nachricht auf mehrere Dinge:

Danke für deine Antwort Joachim - ich habe mich wohl zu schwammig ausgedrückt  :) Dass Fhem auf Ereignissen basiert ist mir klar. Was ich meinte war, dass ich ja in der Bedingung keine Werte nutze, die nicht über ein einzelnes Event hinaus persistiert wären.

Hey Beta-User, ja, die Änderungen dieser Readings sind die Trigger. Das sollte doch aber an sich kein Problem verursachen, oder?
Genau, ich bin ein Student, der eine Aufgabe bekommen hat, vollkommen richtig. Und als solcher sitze ich jetzt den dritten Tag vor einer ansonsten vollständig gelösten Aufgabe, habe unzählige Seiten der Referenz und massenweise Forenbeiträge gelesen, bin aber leider immer noch nicht schlauer. Deswegen habe ich mich entschlossen hier diejenigen zu fragen, von denen ich gerne Lernen würde.

Hi Otto, mit Logiktabellen bin ich bestens vertraut :) In meinem Fall ist das genau so gedacht: Die "dominierende" Bedingung ist die Prüfung, ob heute noch keine Warnung versendet wurde. Ist dies der Fall, dann soll geprüft werden, ob entweder der Wert für die Windgeschwindigkeit, der Wert für die Windböhengeschwindigkeit oder beide höher sind als die definierten Schwellenwerte. Sind beide Teile der Bedingung erfüllt, soll eine Warnung gesendet werden. Zum Testen habe ich sowohl eingestellt, dass heute noch keine Warnung versendet wurde und dass die Werte der Sensoren beide über den Schwellenwerten lagen.

Und zum Abschluss hier einfach mal der ganze Code den ich habe, abgesehen vom Windsensor und der PushNotifier Anbindung:

define WindMonitoring DOIF (([MyWindSensor:windSpeed] ge [$SELF:thresholdWindSpeed] or [MyWindSensor:windGust] ge [$SELF:thresholdWindGust]) and [$SELF:alreadyNotified] eq "NEIN") (set StormWarningPushMessage message [$SELF:notifyText])
attr WindMonitoring room StormWarning
attr WindMonitoring readingList thresholdWindSpeed thresholdWindGust resetTime notifyText alreadyNotified
attr WindMonitoring setList thresholdWindSpeed:selectnumbers,0,0.1,350,1,lin thresholdWindGust:selectnumbers,0,0.1,350,1,lin resetTime:time notifyText:textField alreadyNotified:uzsuToggle,NEIN,JA
attr WindMonitoring webCmdLabel Schwellenwert Windgeschwindigkeit :Schwellenwert Windboee :Benachrichtigung wieder scharf schalten um :Benachrichtigungstext :Benachrichtigung heute schon erfolgt


set WindMonitoring thresholdWindSpeed 15
set WindMonitoring thresholdWindGust 15
set WindMonitoring resetTime 06:00
set WindMonitoring notifyText Achtung, es herrscht starker Wind!
set WindMonitoring alreadyNotified NEIN
attr WindMonitoring webCmd thresholdWindSpeed:thresholdWindGust:resetTime:notifyText:alreadyNotified

define WindMonitoringAlarmReset at *{ReadingsVal("WindMonitoring","resetTime","")} set WindMonitoring alreadyNotified NEIN
define WindMonitringAlarmResetTimeChange notify WindMonitoring:resetTime.* modify WindMonitoringAlarmReset *{ReadingsVal("WindMonitoring","resetTime","")} set WindMonitoring alreadyNotified NEIN
attr WindMonitoringAlarmReset room StormWarning
attr WindMonitringAlarmResetTimeChange room StormWarning

Otto123

#16
Hallo Joachim,

ja ich hätte eine komplette Tabelle machen können 2³ aber ich habe quasi zwei getrennet gemacht. Weil ja aus den Klammern von der Sache her wieder nur eins wird. Also so wie es da steht 2² für or und 2² für and.

@SCKWorld2012 wenn Du Dir das list des DOIF im Fall des richtigen und falschen Schaltens anschaust siehst Du ev. etwas mehr: Zusammenhang Zeiten und Events.

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

SCKWorld2012

#17
Ich habe jetzt aufgegeben und das Problem stattdessen dadurch gelöst, dass ich eine zweite DOIF erstellt und die Bedingung über die beiden verteilt habe.

Danke an alle, die versucht haben mir zu helfen.

Warum die kombinierte Bedinung nicht funktioniert hat würde mich trotzdem immer noch interessieren.

Otto123

#18
Vielleicht noch bedenken: DOIF ist so konstruiert, dass es genau einmal auslöst wenn die Bedingung erfüllt ist. Der Zustand muss sich erst wieder in die andere Richtung ändern, damit die Auswertung neu beginnen kann. Dafür das es anders ist - gibt es so allgemein etwas unverständliche Konstruktionen.

Also ich denke nicht, dass falsch evaluiert wird, ich denke, dass nicht evaluiert wird ;)

Wenn Du einfach ein notify auf MyWindSensor:windSpeed:.* machst und deine Bedingungen genauso dahinter schreibst, wird das wohl funktionieren. ReadingsNum() und Co kennst Du ja :)

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Damian

Ich denke, mit der Ausgabe von "list WindMonitoring" im vermeintlich nicht funktionierenden Zustand hätte man dir hier helfen können. Es mag jetzt funktionieren, aber beim nächsten mal wirst du dir wieder die Zähne ausbeißen, da die Ursache des Problems nicht erkannt wurde.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

SCKWorld2012

Tatsächlich habe ich die Lösung jetzt doch noch gefunden - es hat mich einfach nicht locker gelassen.
Wenn ich beide Bedingungen kombiniert habe, hat der veroderte Teil solange nicht mehr funktioniert, bis ich die Dezimalstellen der Eingabefelder auf 0 gesetzt habe. Dann ging es wieder.
Sehr merkwürdige Geschichte.

Jedenfalls nochmal danke für die Antworten :)

P.S.: Du hast Recht Damian, mit einer Workaround-Lösung gebe ich mich eigentlich auch nie zufrieden ;)

Beta-User

"le" ist halt nicht wirklich gut geeignet für Zahlenvergleiche...
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

Damian

Zitat von: Beta-User am 21 Dezember 2021, 16:27:25
"le" ist halt nicht wirklich gut geeignet für Zahlenvergleiche...

ja, daher mit < > arbeiten, da (10 le 2) wahr ist. Und daran denken: DOIF arbeitet standardmäßig im FHEM Modus zustandsorientiert, ein cmd_1 wird erst dann wieder ausgeführt, wenn zuvor cmd_2 dran war.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF