FHEM/Perl Verschachtelungen

Begonnen von MaxAut, 19 Juni 2016, 13:02:23

Vorheriges Thema - Nächstes Thema

MaxAut

OK. Man würde also gar keine RegEx dafür verwenden, sondern einfach wieder Perl ... verstehe.

Zwei Probleme sehe ich noch mit Deinem Beispiel:
1. Die zweite RegEx muss doch false sein, damit der der WatchDog auslöst, oder verstehe ich das falsch? Im Wiki ist der Watchdog ja wie folgt definiert: "Führe Befehl <command> aus, wenn nach Ereignis <regexp1> nicht innerhalb der Zeitspanne <timespec> das Ereignis <regexp2> auftritt." Insofern dürfte man nicht auf TFKontaktEingang.closed abfragen, oder? Ich will aber auch nicht auf .open abfragen, weil auch noch andere Stati vorhanden sein können, sondern eben eine RegEx die closed verneint. Aus WatchDog Sicht wäre es also: wenn zu und nach 10 Sekunden nicht nicht zu, dann ...

2. Im Perl Teil fehlt noch das Auslesen der Zeit und speichern in der Variable $time. Aber das ist mir klar und brauche ich ja bloß aus meiner bisherigen Implementierung kopieren.

CoolTux

Gut auf gepasst. Ja Du hast Recht. Beim zweiten muss open stehen.


define w_Eingangstuer_zusperren watchdog TFKontaktEingang.closed 00:10 TFKontaktEingang.open { if....
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

MaxAut

Ich will aber eben nicht auf open prüfen, sondern auf alles außer closed. Und genau das weiß ich nicht wie es geht ...

CoolTux

Das verstehe ich nicht. Der Zustand einer Tür kann doch nur open oder closed sein. Was soll denn da noch ab zu fragen gehen.
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

MaxAut

Der Sensor liefert auch andere Werte zurück; mir geht es prinzipiell darum wie ich bei Fhem mit einer RegEx eben nicht auf einen bestimmten Wert prüfe, sondern alles außer einem bestimmtem Wert.

ernst1024

du kannst in perl doch auch negieren. Ich weiß jetzt die String Vergleichsoperatoren nicht, schätze mal 'not equal "open"'
Gruß Ernst

CoolTux

Irgendwie reden wir aneinander vorbei.
Erstmal geht es darum das der watchdog aus löst, auslösen kann er nur bei einem Ereignis (Trigger). Hier kann man nicht auf nicht Ereignisse eine RegEx setzen.

Kann aber sein das ich Dich nicht verstanden habe. Dachte bis jetzt die Aufgabenstellung bestünde nur darin das wenn die Tür zu gemacht wird und nicht innerhalb einer bestimmten Zeit wieder auf das dann das Türschloss zwischen bestimmten Zeiten verschließen soll. Wenn da jetzt noch mehr ist fehlt mir die Info.

Ja Dein Türsensor liefert auch andere Werte. Batterie vielleicht und sabotageError. Frage ist nur ob das relevant ist für Dein Schließvorgang.
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

Benni

Zitat von: MaxAut am 25 Juni 2016, 11:14:41
Ich will aber eben nicht auf open prüfen, sondern auf alles außer closed. Und genau das weiß ich nicht wie es geht ...

... ne 'closed'

MaxAut

In diesem Fall hast Du wohl recht und es macht keinen Sinn auf nicht closed abzufragen, aber es geht mir auch ums Allgemeine; ich will wissen, wie ich mit einer RegEx verneine, bzw. wie diese RegEx generell funktionieren - ich finde leider kaum Beispiele (die auch kommentiert sind, sodass man etwas daraus lernen könnte ...).

... ne 'closed'
--> Das würde doch nur für ein if gehen, oder?

Kann mir irgendjemand sagen, wie ich in nachstehender Zeile den Teil "TFKontaktEingang.open" durch ein "TFKontaktEingang.<alles andere außer closed>" ersetze?

define w_Eingangstuer_zusperren watchdog TFKontaktEingang.closed 00:10 TFKontaktEingang.open { if....

ernst1024

was hast du denn die ganze Zeit mit RegEx, die benutzt du doch überhaupt nicht?

Es gibt eine millionen Möglichkeiten zu testen und darauf zu reagieren. Mit if, elseif, else zb. Dann kannst du dir das DOIF mal anschauen, da sind genug Beispiele. http://www.fhemwiki.de/wiki/DOIF


Gruß Ernst

MaxAut

Wir drehen uns im Kreis ... das ist mir schon klar; sobald ich es in Perl mache habe ich auch kein Problem.

Die eigentliche Aufgabenstellung ist: Wenn ein Kontakt geschlossen ist, schaue 10 Sekunden später nach ob er das immer noch ist, und wenn ja reagiere darauf. Derzeit habe ich es in Perl implementiert, wie ja auch in diesem Thread zu lesen ist. Dann wurde empfohlen ich soll Watchdog nehmen. Das will ich nun auch tun, allerdings fehlt mir eben die zweite RegEx.

Nochmal: Ich will es nicht in Perl realisieren, sondern eben mit diesem Watchdog, und der hört laut WIKI nunmal auf RegEx.

Benni

Ah sorry, ich habe leider nicht mitbekommen, dass wir schon beim watchdog sind. (Den wollte ich dir für den Use-case gerade vorschlagen  :o )

Deine zweite RegEx könnte im Endeffekt auch einfach komplett offen sein (.*) sein: Der Watchdog prüft das zweite RegEx ja erst, wenn das erste zuvor auch eingetreten ist, also in deinem Fall closed. Wenn jetzt eine weiter Zustandsänderung auftritt, kann die ja nur was anderes sein, als closed, da dieser Zustand ja bereits erreicht ist. Das sollte funktionieren, sofern event-on-change-reading auch korrekt gesetzt ist, so dass das closed-Event auch nur 1 mal auftreten kann.


MaxAut

#27
Das verstehe ich nicht ... die zweite RegEx ist soweit ich WatchDog verstanden habe doch kein Event, oder? Die Erste ist der Event auf den der WatchDog reagiert, die Zweite ist dann die Prüfung die der WatchDog nach Ablauf der angegeben Zeit selbständig prüft.

Das ich .* nehmen kann ist mir klar, aber dann würde ich es ja wieder in Perl abhandeln. Ich will den WatchDog einfach gesagt so einsetzen wie er gedacht ist, und ihn selbst die zweite RegEx prüfen lassen. Er "feuert" ja, wenn die zweite RegEx false ist; zumindest lese ich das aus der Wiki Beschreibung heraus. Das einzige was mir fehlt ist das Wissen wie ich die zweite RegEx schreibe. Ich will eben nicht schreiben .open (dass das funktionieren würde ist mir schon klar, denn das wäre false wenn die Türe zu ist, und damit würde das folgende Kommando ausgeführt werden und damit auch den Sinn erfüllen), sondern <jeder andere Status außer closed>. Warum? Einfach weil ich grundsätzlich interessiert an diesem RegEx Zeug bin und das lernen möchte. Im wesentlichen reduziert sich meine Frage eigentlich darauf, wie ich die Prüfung TFKontaktEingang.closed verneinen kann.

Benni

#28
Nein!
Der Watchdog (Wachhund) befindet sich ursprünglich quasi in einem "Schlafzustand" und wacht bei einem Ereignis auf, das von RegEx 1 abgedeckt wird. Dann wartet er (er wacht) bis die angegebene Zeit abgelaufen ist und führt dann den angegebenen Ausführungsteil aus (Wachhund bellt). Tritt allerdings während der Wartezeit (Wach-Zeit) ein Ereignis auf, das von RegEx 2 abgedeckt wird, dann geht er wieder den "Schlafzustand" zurück, bis wieder in ein Ereignis auftritt, das von RegEx 1 abgedeckt wird.

Wurde übrigens der Ausführungsteil einmal ausgeführt (Hund hat gebellt) geht er nicht automatisch wieder in den "Schlafzustand" zurück. Es sei denn man setzt beim Watchdog das Attribut autoRestart (oder triggert den Ihn nach der Ausführung mit einem Punkt .)

Zitat von: MaxAut am 25 Juni 2016, 19:05:02
Das ich .* nehmen kann ist mir klar, aber dann würde ich es ja wieder in Perl abhandeln.

Das ist RegEx und kein Perl!

MaxAut

OK, verstanden; die zweite RegEx ist ebenfalls ein Event auf das gewartet wird, und bei Nichteintritt innerhalb der angegeben Zeit wird ausgeführt.

Aber dennoch bleibt meine Grundfrage: Wie lautet die RegEx für alle anderen Events außer ein bestimmter? In meinem Beispiel alles andere außer "closed".