Hauptmenü

Fragen zu AND und OR

Begonnen von M_I_B, 28 Juni 2016, 15:53:04

Vorheriges Thema - Nächstes Thema

M_I_B

Hallo liebe Leute,

ich hänge mal wieder ...

Wenn ich abfragen möchte ob a=1 und (b=1 oder c=1) ist, wobei die Klammerung meint, das bei a=1 nur einer der beiden b=1 oder c=1 zutreffen muss, wie baut man das in den DOIF zusammen?

M.E. müsste das ja ein Konstrukt ala DOIF ( [ A ] eq "1" and [ B ] eq "1" or [ A ] eq "1" and [ C ] eq "1" ) ergeben? Oder gibt es eine Möglichkeit, den OR- Bereich zu klammern? Denn DOIF ( [ A ] eq "1" and [ B ] eq "1" or [ C ] eq "1" ) funktioniert (hier) nicht...

Hintergrund: Presenzerkennung IP und Geo zwecks Redundanz.
IP kann nur "absent" oder "present" sein, also kein Problem. Aber GEO:currLoc_xy kann "0", "underway", "Daheim" oder "TestGeoZone" sein, wobei "0" und "underway" als abwesend, "Daheim" und "TestGeoZone" als anwesend zu werten sind...

Ellert

#1
In der deutschsprachigen Befehlsreferenz zum DOIF findest Du die Antwort  ;) http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung

Icinger

ZitatOder gibt es eine Möglichkeit, den OR- Bereich zu klammern?
Warum probierst du's nicht einfach aus?
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

M_I_B

@Ellert: Klar, da habe ich natürlich zuerst nachgeschaut. Wenn Du ...
ZitatDie Reihenfolge der Auswertung wird, wie in höheren Sprachen üblich, durch runde Klammern beeinflusst.
... meinen solltest; funktioniert nicht und generiert eine Fehlermeldung ...
@Icinger: ... womit auch Deine Frage beantwortet wäre; klar habe ich probiert. Aber allgemein führt Probieren zwar oft zu Ergebnissen, die genauen, festgeschriebenen Regeln aber hat man dann immer noch nicht unbedingt erfasst ...

marvin78

Zitat von: M_I_B am 28 Juni 2016, 17:52:39
@Ellert: Klar, da habe ich natürlich zuerst nachgeschaut. Wenn Du ...  ... meinen solltest; funktioniert nicht und generiert eine Fehlermeldung ...
@Icinger: ... womit auch Deine Frage beantwortet wäre; klar habe ich probiert. Aber allgemein führt Probieren zwar oft zu Ergebnissen, die genauen, festgeschriebenen Regeln aber hat man dann immer noch nicht unbedingt erfasst ...

Aber es kann einem eventuell geholfen werden, wenn man postet was man genau probiert (ungekürztes list, DEF o.ä.) hat und die entsprechende Fehlermeldung dazu genau wieder gibt.

M_I_B

Zitat von: marvin78 am 28 Juni 2016, 17:57:23Aber es kann einem eventuell geholfen werden, wenn man ...
Schon wahr... Ich habe mich vielleicht falsch ausgedrückt... Auf den Punkt gebracht: Wo ist das genaue Regelwerk zu solchen AND/OR Dingen nachzulesen?
Ein vollständiges List hätte ich gemacht, wenn ich denn Probleme erwartet hätte. Zwischenzeitlich habe ich alles wieder auf den ursprünglichen Zustand ohne Auswertung von "0" und "TestGeoZone" zurück geschrieben...
Aus dem Gedächtnis mit einer konkreten Zeile:

... ([IPcheckBB] eq "absent" and [GeoFancy:currLoc_BB] eq "Daheim" or [GeoFancy:currLoc_BB] eq "TestGeoZone") (set ...
Dabei reicht es schon, wenn "TestGeoZone" gesetzt ist ...
... ([IPcheckBB] eq "absent" and [GeoFancy:currLoc_BB] eq "Daheim" or [IPcheckBB] eq "absent" and [GeoFancy:currLoc_BB] eq "TestGeoZone") (set...
Das wurde in keiner Kombination wahr ...
... ([IPcheckBB] eq "absent" and ([GeoFancy:currLoc_BB] eq "Daheim" or [GeoFancy:currLoc_BB] eq "TestGeoZone")) (set...
Erzeugt einen Fehler wrong time format: eq"Daheim"or[GeoFancy:currLoc_MB]eq"TestGeoZone"

marvin78

#6
Im Grunde ist das Logik 1.0.

Man kann es auch mit Punkt-vor-Strich Rechnung in der Mathematik vergleichen, wobei OR der Strich und AND der Punkt ist. Du kannst einen Logik Kurs besuchen oder über Logik nachlesen. Das hilft sicher. Im Grunde ist es aber ganz einfach: Man muss sich vorstellen, was man machen möchte, und wenn man die genannte Regel im Hinterkopf hat, ist es ganz leicht.

DOIF ist nicht mein Thema, deswegen werde ich dir hier keinen speziellen Rat geben. Ich kann nicht sagen, ob etwas falsch implementiert ist. Deien Klammersetzung sieht aber teilweise seltsam aus. Ich kann aber nicht sagen, ob das ein Fehler ist, da du ja nur Ausschnitte postest (was niemals eine gute Idee ist, wenn man Hilfe sucht).

EIB-Fan

Hallo,

bastel mal deine Definition mit diesem Syntax.

DOIF ( [ A ] eq "1" and ([ B ] eq "1" or [ C ] eq "1" ))

Du hattest es in deiner Fragestellung schon fast selber beantwortet. ;)

Gruß Jens

CoolTux

Genau so sollte es aber auch ohne Klammerung gehen. Wie gesagt, AND vor OR.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

EIB-Fan

Hallo,

AND vor OR ist klar. Für mich ist das zusätzliche Klammernpaar eine klarere Trennung der Funktionen innerhalb der Definition. Ist aber Geschmackssache ...

Gruß Jens

M_I_B

Zitat von: marvin78 am 28 Juni 2016, 18:17:48... wobei OR der Strich und AND der Punkt ist.
Eben... so dachte ich auch. Dann hätte zumindest das zweite Beispiel greifen müssen ...

Zitat von: marvin78 am 28 Juni 2016, 18:17:48... sieht aber teilweise seltsam aus. Ich kann aber nicht sagen, ob das ein Fehler ist, da du ja nur Ausschnitte postest (was niemals eine gute Idee ist, wenn man Hilfe sucht).
Die sehen alle gleich aus, aber gerne mal ein Vollständiges ohne die genannten Zusatz-Abfragen auf "0" und "TestGeoZone" (aktueller Stand):
define SetPresCB DOIF ([IPcheckCB] eq "absent" and [GeoFancy:currLoc_CB] eq "underway") (set PresenzCB 0) \
DOELSEIF ([IPcheckCB] eq "present" and [GeoFancy:currLoc_CB] eq "underway") (set PresenzCB 1) \
DOELSEIF ([IPcheckCB] eq "absent" and [GeoFancy:currLoc_CB] eq "Daheim") (set PresenzCB 2) \
DOELSEIF ([IPcheckCB] eq "present" and [GeoFancy:currLoc_CB] eq "Daheim") (set PresenzCB 3) \
attr SetPresCB do always

"PresenzCB" ist dabei ein Dummy, der entsprechend gesetzt wird, ein passendes Icon für jeden der 4 Stati anzeigt und für weitere Funktionen abgefragt wird. Dieses Konstrukt funktioniert soweit einwandfrei seit ein paar Tagen. Erst heute ist mir aufgefallen, das GeoFence u.a. auch die Stati "0" und "TestGeoZone" generiert, welche ich entsprechend mit abfangen wollte ...

Zitat von: EIB-Fan am 28 Juni 2016, 18:36:38bastel mal deine Definition mit diesem Syntax.
DOIF ( [ A ] eq "1" and ([ B ] eq "1" or [ C ] eq "1" ))
Das ist genau mein drittes Beispiel, was aber die besagte Fehlermeldung generiert ... Oder habe ich da eine Typo drin, den ich nicht sehe?


Ellert

Zitat von: M_I_B am 28 Juni 2016, 18:12:26
Schon wahr... Ich habe mich vielleicht falsch ausgedrückt... Auf den Punkt gebracht: Wo ist das genaue Regelwerk zu solchen AND/OR Dingen nachzulesen?
Ein vollständiges List hätte ich gemacht, wenn ich denn Probleme erwartet hätte. Zwischenzeitlich habe ich alles wieder auf den ursprünglichen Zustand ohne Auswertung von "0" und "TestGeoZone" zurück geschrieben...
Aus dem Gedächtnis mit einer konkreten Zeile:

... ([IPcheckBB] eq "absent" and [GeoFancy:currLoc_BB] eq "Daheim" or [GeoFancy:currLoc_BB] eq "TestGeoZone") (set ...
Dabei reicht es schon, wenn "TestGeoZone" gesetzt ist ...
... ([IPcheckBB] eq "absent" and [GeoFancy:currLoc_BB] eq "Daheim" or [IPcheckBB] eq "absent" and [GeoFancy:currLoc_BB] eq "TestGeoZone") (set...
Das wurde in keiner Kombination wahr ...
... ([IPcheckBB] eq "absent" and ([GeoFancy:currLoc_BB] eq "Daheim" or [GeoFancy:currLoc_BB] eq "TestGeoZone")) (set...
Erzeugt einen Fehler wrong time format: eq"Daheim"or[GeoFancy:currLoc_MB]eq"TestGeoZone"

Zitatwrong time format: eq"Daheim"or[GeoFancy:currLoc_MB]eq"TestGeoZone"
Kommt die Fehlermeldung auch, wenn Du Leerzeichen benutzt?

Zitat von: M_I_B am 28 Juni 2016, 18:53:45
Eben... so dachte ich auch. Dann hätte zumindest das zweite Beispiel greifen müssen ...
Die sehen alle gleich aus, aber gerne mal ein Vollständiges ohne die genannten Zusatz-Abfragen auf "0" und "TestGeoZone" (aktueller Stand):
define SetPresCB DOIF ([IPcheckCB] eq "absent" and [GeoFancy:currLoc_CB] eq "underway") (set PresenzCB 0) \
DOELSEIF ([IPcheckCB] eq "present" and [GeoFancy:currLoc_CB] eq "underway") (set PresenzCB 1) \
DOELSEIF ([IPcheckCB] eq "absent" and [GeoFancy:currLoc_CB] eq "Daheim") (set PresenzCB 2) \
DOELSEIF ([IPcheckCB] eq "present" and [GeoFancy:currLoc_CB] eq "Daheim") (set PresenzCB 3) \
attr SetPresCB do always

"PresenzCB" ist dabei ein Dummy, der entsprechend gesetzt wird, ein passendes Icon für jeden der 4 Stati anzeigt und für weitere Funktionen abgefragt wird. Dieses Konstrukt funktioniert soweit einwandfrei seit ein paar Tagen. Erst heute ist mir aufgefallen, das GeoFence u.a. auch die Stati "0" und "TestGeoZone" generiert, welche ich entsprechend mit abfangen wollte ...
Das ist genau mein drittes Beispiel, was aber die besagte Fehlermeldung generiert ... Oder habe ich da eine Typo drin, den ich nicht sehe?



ZitatOder habe ich da eine Typo drin, den ich nicht sehe?

Was sagt die Syntaxprüfung im DEF-Editor?

M_I_B

Zitat von: Ellert am 28 Juni 2016, 18:57:39Kommt die Fehlermeldung auch, wenn Du Leerzeichen benutzt?
... öhhh ... Keine Ahnung ... Hatte ich nicht probiert, weil ich darauf ganz stumpf nicht gekommen bin. Hole ich heute Abend mal nach ...

Zitat von: Ellert am 28 Juni 2016, 18:57:39Was sagt die Syntaxprüfung im DEF-Editor?
Das kann ich Dir nicht sagen, da ich von Anfang an direkt mit NotePad++ arbeite. Ich wusste gar nicht, das es so etwas in FHEM gibt *DuckUndWeg*

CoolTux

Wusste gar nicht das Notepad++ in FHEM integriert ist.

Also solltest Du mal genau erzählen was Du mit dem Code aus dem Notepad++ dann genau machst. Lädst Du ihn in die DEF oder bearbeitest Du die fhem.cfg direkt?
Könnten sich nicht gewünschte Zeichen mit eingeschlichen haben welche das ganze durcheinander bringen?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

M_I_B

Zitat von: CoolTux am 28 Juni 2016, 19:12:05Wusste gar nicht das Notepad++ in FHEM integriert ist.
Ne, natürlich nicht ;) Ich arbeite seit Anfang an direkt mit den CFG- Dateien via Samba- Freigabe. Natürlich sind alle Dateien UNIX UTF-8 ohne BOM. Fremde Zeichen würden auch auffallen, da ich in NotePad++ für FHEM ein Syntax- Highlighting aktiv habe. Da werden auch TAB's u.ä. Zeichen dargestellt ... Schaut so aus z.B.: