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...
In der deutschsprachigen Befehlsreferenz zum DOIF findest Du die Antwort ;) http://fhem.de/commandref_DE.html#DOIF_Ereignissteuerung
ZitatOder gibt es eine Möglichkeit, den OR- Bereich zu klammern?
Warum probierst du's nicht einfach aus?
@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 ...
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.
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"
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).
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
Genau so sollte es aber auch ohne Klammerung gehen. Wie gesagt, AND vor OR.
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
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?
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?
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*
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?
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.:
... aus der Befehlszeilenreferenz zum DOIF:
ZitatDa die Definitionen im Laufe der Zeit recht umfangreich werden können, sollten die gleichen Regeln, wie auch beim Programmieren in höheren Sprachen, beachtet werden. Dazu zählen: das Einrücken von Befehlen, Zeilenumbrüche sowie das Kommentieren seiner Definition, damit man auch später noch die Funktionalität seines Moduls nachvollziehen kann.
Das Modul unterstützt dazu Einrückungen, Zeilenumbrüche an beliebiger Stelle und Kommentierungen beginnend mit ## bis zum Ende der Zeile. Die Formatierungen lassen sich im DEF-Editor der Web-Oberfläche vornehmen.
ZitatIch wusste gar nicht, das es so etwas in FHEM gibt *DuckUndWeg*
Schwer zu glauben, ist es nicht mehr eine "Beratungsresistenz"?
Für mich ist der DEF-Editor (codemirror) ein vollwertiger Ersatz für einen externen Editor,
siehe: https://forum.fhem.de/index.php/topic,45373.0.html
Zitat von: Ellert am 28 Juni 2016, 19:26:46Schwer zu glauben, ist es nicht mehr eine "Beratungsresistenz"?
Was soll nun das schon wieder? Erst einmal vollkommen OT, zum anderen echt komisch, das in diesem Forum immer in irgend einer Form an Stelle von Hilfe lieber gestänkert wird ... das nervt ungemein >:(
EDIT: So, mal schnell das Thema int. Editor Quergelesen, um auch mal OT zu labern: So lange man nur ein paar Geräte hat und in einer einzigen Datei (fhem.cfg) rumwurschtelt, mag dieser interne Editor ganz nett sein. Aber bei einem großen System mit vielen includierten CFG's ist der int. Editor unbrauchbar, da die includierten CFG's ignoriert werden und nur über viel Gehampel aufrufbar sind ...
Und: Natürlich kenne ich den int. Editor. Aber das der auch "DEF-Editor" genannt wird, war mir unbekannt, da ich den nicht nutze...
ZitatEditor Quergelesen, um auch mal OT zu labern:
Wohl
nicht richtig an der falschen Stelle gelesen.....Du meinst vermutlich den Editor unter "Edit Files...."
Elert meint den Editor direkt im Device :) (Siehe Anhang)
Damit ersparts du dir das ständige Reloaden der Config, dem Def-Editor ist egal, aus welchem CFG-Konstrukt das Device ist, und du bekommst direkt beim Klick auf "Modify xxx" die etwaigen Fehlermeldungen.
Just my 2 cents
Und includierte cfg files ist ja sowas von Old School. Da kannst auch noch mit Win 3.11 rum machen ;D
Zitat von: Icinger am 28 Juni 2016, 19:54:28Wohl nicht richtig an der falschen Stelle gelesen.....Du meinst vermutlich den Editor unter "Edit Files...."
Elert meint den Editor direkt im Device :) (Siehe Anhang)
Jupp, da hast Du vollkommen recht: Ich meinte den "Edit Files". Den "anderen" Editor kenne ich tatsächlich nicht (bis jetzt), da ich nie auf die Idee gekommen bin, DOIF oder andere Konstrukte direkt in FHEM zu editieren, geschweige denn nach einer solchen Möglichkeit zu suchen, da ich schon immer, auch in anderen Zusammenhängen, mit Notepad++ gearbeitet habe...
Dann revidiere ich meine vorherige Aussage wegen Unkenntnis und nehme alles zurück ...
Dennoch fällt mir gerade beim Ausprobieren des Editors ein Manko auf, welches sich natürlich mit Notepad++ nicht ergibt: Wenn ich bestimmte Teile, wie z.B. diese besagten DOIF mehrfach benötige, geht das in Notepad++ blitzschnell. Mit dem Editor muss ich das erst in die Zwischenablage kopieren, den anderen Raum mit dem Device aufrufen, das Device auswählen und kann dann erst eine Kopie davon generieren.
Ich werde dennoch mal öfter damit arbeiten, um das mal kennen zu lernen. Vielleicht ist die Kombination beider Editoren für mich der Königsweg... Ich werde sehen ...
Danke auf jeden Fall für den Hinweis ...
Zitat von: CoolTux am 28 Juni 2016, 20:15:36Und includierte cfg files ist ja sowas von Old School. Da kannst auch noch mit Win 3.11 rum machen ;D
... ja ne, is klar ::) Daher repariere und restauriere ich ja auch "Old School" und total altmodische voll analoge Bandmaschinen und Röhrengeräte und Du zerschrädderst Dir hochmodern die Lauscher mit MP3- Rechteck- Geschrabbel ;)
Ok, jetzt aber genug OT .. oder?
Zitat von: M_I_B am 28 Juni 2016, 18:53:45Oder habe ich da eine Typo drin, den ich nicht sehe?
Ich sehe ihn auch nicht, gehe aber von seinem Vorhandensein aus. Klammernebenen in beliebiger (?, aber 5 mindestens, selbst im Einsatz) kann DOIF nähmlich.
Alternativ ein Copy'n'Paste-Fehler ini->Forum.
Zitat von: M_I_B am 28 Juni 2016, 20:24:03Vielleicht ist die Kombination beider Editoren für mich der Königsweg...
Ich teste alles mit dem internen, nach Tipps aufgewerteten (DEF-)Editor innerhalb des laufenden FHEM, die eigentlichen dauerhaften Änderungen mache ich mit Scite direkt in den .ini, welche erst nach einem Restart zum Tragen kommen. Erstens ist mir FHEM in der Anfangszeit nach Änderungen zu oft abgestürzt. Und Zweitens hat mir die 'Eigenintelligenz' von FHEM beim Ändern/Speichern der .ini zu oft Streiche gespielt!
Zitat von: Per am 29 Juni 2016, 09:42:42Ich sehe ihn auch nicht, gehe aber von seinem Vorhandensein aus. ...
Und Zweitens hat mir die 'Eigenintelligenz' von FHEM beim Ändern/Speichern der .ini zu oft Streiche gespielt!
Ja, genau Letzteres ist auch noch so ein Knackpunkt. Schon sooo oft wurde mit einem Klick auf "Save Config" alles Mögliche umsortiert (noch bedingt akzeptabel) und Kommentare resp. auskommentierte Teile einfach entsorgt (unakzeptabel). Aber wenn man ausschließlich mit dem int. Editor arbeitet, mag das keine Rolle spielen resp. fällt das überhaupt nicht auf ...
Zum Thema:
Ich habe das jetzt erst mal so gelassen und gestern Abend noch die Präsenz- Sache missbraucht um zu erkennen, ob der TV noch läuft. In dem Zusammenhang war es auch erforderlich, ein vergleichbares Konstrukt ( A and B or C) zu bauen, um die Lichtsteuerung damit zu koppeln. Das funktioniert auf Anhieb. Also habe ich per Copy&Past den Teil so übernommen und lediglich die Bezeichnungen angepasst, um übersehene Typo's o.ä. zu eliminieren; hat nix geholfen.
Kann es denn sein, das es eine Beschränkung oder so was ähnliches in Verbindung mit der Anzahl der DOELSEIF gibt? Ich werde das mal zerlegen und einzeln behandeln. Vielleicht komme ich dann dahinter...
... BTW: Der int. Editor hat keine Fehler dargestellt / bemängelt ...
Nun muss ich mich aber noch erst mal um was anderes Kümmern: Seit Umstellung auf VCCU quittieren meine 6-Fach Taster PB-6-WM55 auch nach mehrfachem, erneutem Pairing mit der VCCU nicht mehr grün, sondern nur noch orange, gelegentlich mit einem wilden, orangen Geflacker, bis irgendwann de Befehl ausgeführt wird. Ist mir bisher nicht aufgefallen, weil alles weiterhin funktioniert ...
Nochmal zurück auf Anfang:
Zitat von: M_I_B am 28 Juni 2016, 18:12:26
... ([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"
Meine Vorgehensweise wäre:
a: testweise drei DOIFs mit je einer der Bedingung erstellen (jeweils mit und ohne nochmal Klammern drumrum)
b: statt der Klammern mal || probieren:
... ([IPcheckBB] eq "absent" and [GeoFancy:currLoc_BB] eq "Daheim" || [GeoFancy:currLoc_BB] eq "TestGeoZone") (set ...
c: RegEx:
... ([IPcheckBB] eq "absent" and [GeoFancy:currLoc_BB] =~ "Daheim|TestGeoZone") (set ...
(ich hoffe, meine rudimentären RegEx-Kenntnisse haben mich hier nicht verlassen, habe gerade nur Ideone.com (http://ideone.com) zum Testen da...)
und:
ZitatErzeugt einen Fehler wrong time format: eq"Daheim"or[GeoFancy:currLoc_MB]eq"TestGeoZone"
deutet auf fehlende Leerzeichen hin! Was sagt denn das
list des DOIF?