[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 wende mich mit einem vermutlich trivialen Problem an euch. Hier der Kontext:
Für ein Uni-Projekt muss ich eine Sturmwarnung mit FHEM umsetzen. Dazu nutze ich ein DOIF. Es soll ausgelöst werden, wenn die Werte meines Windsensors gewisse Schwellenwerte überschreiten. Die Schwellenwerte sind als selectNumbers-Eingabeflächen über webCmd realisiert und werden zu Testzwecken auf 0 gesetzt.
Zudem braucht meine Bedingung noch einen weiteren Teil: das DOIF soll nur einmal pro Tag ausgelöst werden, wobei der Zeitpunkt des "wieder scharf schaltens" auch angepasst werden können soll. Daher habe ich ein weiteres Eingabefeld, dieses mal einen uzsu-Toggle definiert. Das Feld fungiert als Flag, ob an diesem Tag schon einmal eine Warnung gesendet wurde. Den Wert setze ich mit einem at zum Wunschzeitpunkt zurück. Auch diesen Wert stelle ich zu Testzwecken natürlich händisch richtig ein.
Diese beiden Bedingungen verbinde ich mit einem "and".

Mein eigentliches Problem besteht nun darin, dass die Bedingung meines DOIFs immer als falsch evaluiert zu werden scheint, da das DOIF als state immer "CMD_2" hat. Besonders seltsam daran ist, dass beide Teile der Bedingung für sich genommen funktionieren, zusammen jedoch nicht mehr.

Kann mir evtl. jemand von euch sagen, was ich falsch mache?
Hier die Definition meines DOIFs:

define WindMonitoring DOIF (([MyWindSensor:windSpeed] ge [$SELF:thresholdWindSpeed] or [MyWindSensor:windGust] ge [$SELF:thresholdWindGust]) and [$SELF:alreadyNotified] eq "NEIN") (set StormWarningPushMessage message [$SELF:notifyText],set WindMonitoring alreadyNotified JA)

Hermann123

Hallo SCKWorld2012,

schick doch mal das ganze define...möglichst per Code einfügen Button....
RPi 4 mit HM-CFG-LAN und 30+  HM Komponenten.

SCKWorld2012

hi Hermann123,

das war das ganze define für das DOIF. Die restlichen Definitionen sollten hier ja nicht relevant sein, oder? Wie gesagt, für sich genommen funktionieren die Teile der Bedingung ja. Hier nochmal der Code "richtig" formatiert

define WindMonitoring DOIF (([MyWindSensor:windSpeed] ge [$SELF:thresholdWindSpeed] or [MyWindSensor:windGust] ge [$SELF:thresholdWindGust]) and [$SELF:alreadyNotified] eq "NEIN") (set StormWarningPushMessage message [$SELF:notifyText],set WindMonitoring alreadyNotified JA)

MadMax-FHEM

#3
Ich kenne ja DOIF zu wenig aber:

müsste das
Zitat
set WindMonitoring alreadyNotified JA

nicht mittels setreading gemacht werden?

Also:

setreading WindMonitoring alreadyNotified JA


Weil es soll doch das reading alreadyNotified des DOIF (WindMonitoring) auf JA gesetzt werden?

(wer setzt es denn dann zurück?)
EDIT: und wer setzt es denn überhaupt mal auf NEIN? Weil sonst stimmt ja die Abfrage eq "NEIN" schon nicht...

Und: besser ein list statt nur dem define, also list Devicename (in deinem Fall list WindMonitoring)...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

SCKWorld2012

Hi Joachim,

ich kenne mich auch nicht aus, aber das Ausprobieren des "Do" Teils für sich hat funktioniert, dementsprechend habe ich darüber nicht weiter nachgedacht. Vielleicht kann da ja einer der alteingesessenen Fhem-Experten etwas Klarheit schaffen.
Das eigentliche Problem löst das aber leider noch nicht :/

Gruß
Simon

Hermann123

Ich denke das Problem wird dann sein, das Du die Reading oder EventReadings
   
   [$SELF:thresholdWindSpeed]
   [$SELF:notifyText]

nicht definierst hast.

Schau mal in der Refenz unter "Erzeugen berechneter Readings ohne Events" oder "Erzeugen berechneter Readings mit Events".
Vielleicht ist das ja die Lösung....
RPi 4 mit HM-CFG-LAN und 30+  HM Komponenten.

Beta-User

...kenne DOIF auch nicht, würde aber annehmen, dass es die "Doppelbedingung" ist: Es können praktisch nie zwei Ereignisse gleichzeitig eintreffen. Steht irgendwo in dieser überbordenden commandref zu DOIF...
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

SCKWorld2012

Hi Hermann,

danke für deine Antwort. Die Readings definiere ich unmittelbar im Anschluss zum DOIF. Ich habe hier nur den Code dazu nicht eingestellt. Wie gesagt, die einzelnen Teile der Bedingung funktionieren, auch die Readings werden anstandslos ausgelesen und der "notifyText" Text in meine Nachricht eingefügt.

SCKWorld2012

Hi Beta-User,

ich nutze in dem DOIF doch gar kein Event? Oder habe ich da das Konzept falsch verstanden? Beim Aufbau der Bedingungen und deren Kombination habe ich mich am Fhem-Wiki orientiert, da sah das ganz ähnlich aus.

Otto123

Hi,

der do Teil funktioniert für sich alleine, aber eben nicht in dem DOIF das hier:
set WindMonitoring alreadyNotified JA
heisst ja eigentlich
set $SELF alreadyNotified JA

Das triggert sich selbst!
[$SELF:alreadyNotified] eq "NEIN"
Das wird entweder verhindert oder nicht ausgeführt.
Eventuell hilft [?$SELF:alreadyNotified] eq "NEIN" und sleep 1;set $SELF alreadyNotified JA

Aber da bin ich nicht sicher.

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

Hi Otto,

habe jetzt den fraglichen Teil jetzt mal aus dem "Do" Block herausgenommen, sodass es sich nicht mehr selbst Triggern dürfte.
Vorher habe ich mal versucht nur den den [$SELF:alreadyNotified] eq "NEIN" Teil in der Bedingung stehen zu lassen - so hat es funktioniert.

Die zusammegesetzte Bedingung funktioniert aber immer noch nicht  :-[

Immerhin scheint es kein allzu offensichtlicher Fehler zu sein - dann habe ich ja immerhin meine Hausaufgaben in Sachen Recherche gemacht.

Gruß
Simon

MadMax-FHEM

Zitat von: SCKWorld2012 am 21 Dezember 2021, 11:30:42
ich nutze in dem DOIF doch gar kein Event? Oder habe ich da das Konzept falsch verstanden?

Wenn ich aber das hier lese: JA, falsch verstanden und besser mal nachlesen/nachholen :)

fhem ist (eigentlich) Event-Gesteuert.

Also es passiert etwas (auch ein "Timer" "passiert") und dann wird reagiert: notify/DOIF/FileLog/...

Kein Event, keine Reaktion...

Und: fhem ist single-Threaded, d.h. es gibt immer nur EINEN Event zur Zeit (wichtig bei DOIF, wo man schon mal mehrere Events "abfragen" will)...

Und: poste doch (trotzdem) mal das gesamte DOIF (also list WindMonitoring und evtl. auch von weiteren beteiligten Devices)...

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)

Beta-User

Zitat von: SCKWorld2012 am 21 Dezember 2021, 12:21:08
Immerhin scheint es kein allzu offensichtlicher Fehler zu sein - dann habe ich ja immerhin meine Hausaufgaben in Sachen Recherche gemacht.
Wir haben das ständig...

[MyWindSensor:windSpeed] und [MyWindSensor:windGust] sind zumindest nach meiner Interpretation der Einleitung zu DOIF Ereignistrigger...:
ZitatKombinierte Ereignis- und Zeitsteuerung

define di_lamp DOIF ([06:00-09:00] and [sensor:brightness] < 40) (set lamp on) DOELSE (set lamp off)

Aber wie schon geschrieben: DOIF kapiere ich auch nicht und löse sowas dann via notify.

PS: Du bist der Student, der eine Aufgabe erhalten hat. Etwas vertiefte Recherche ist DEIN JOB, nicht unserer ;) .
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

Otto123

Die zusammengefügten Bedingungen ...
da empfehle ich auch immer eine Logiktabelle, damit man sieht was man erwarten kann. Du hast drei Bedingungen. Man muss die Klammer erst abarbeiten.
(A oder B) und C
0 0 -> 0    0 0 -> 0
1 0 -> 1    1 0 -> 0
0 1 -> 1    0 1 -> 0
1 1 -> 1    1 1 -> 1

C ist also für deinen Fall dominierend  A oder B (oder beide) muss wahr sein und C muss wahr sein für den CMD_1 Fall und zwar zur gleichen Zeit.
Alle Deine Bedingungen triggern und lösen das DOIF aus. Eventuell ist es gut auf einen Trigger zu verzichten und da nur Abfrage zu machen.
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

MadMax-FHEM

#14
Muss das (Zeile 3):

0 1 -> 1    0 1 -> 0

nicht (auch) so:

0 1 -> 1    1 0 -> 0

EDIT: oder auch so 0 1 -> 1    1 1 -> 1

sein?

Oder verstehe ich die Tabelle falsch?
(und fehlen nicht generell noch ein paar Zeilen?)

EDIT: wobei ja klar ist worauf du hinaus willst/wolltest 8)

Gruß, Joachim
FHEM PI3B+ Bullseye: HM-CFG-USB, 40x HM, ZWave-USB, 13x ZWave, EnOcean-PI, 15x EnOcean, HUE/deCONZ, CO2, ESP-Multisensor, Shelly, alexa-fhem, ...
FHEM PI2 Buster: HM-CFG-USB, 25x HM, ZWave-USB, 4x ZWave, EnOcean-PI, 3x EnOcean, Shelly, ha-bridge, ...
FHEM PI3 Buster (Test)