FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Invers am 28 Februar 2016, 00:51:33

Titel: Warum erfolgt hier eine Ansage, obwohl die Bedingung nicht erfüllt ist?
Beitrag von: Invers am 28 Februar 2016, 00:51:33
Irgendwie habe ich den Durchblick verloren und vom Lesen schon Augenkrebs.

Ich habe ein DOIF, welches testweise eine Ansage machen soll, wenn die Luftfeuchtigkeit unter 5 Prozent liegt. Die Ansage kommt aber, wenn die Bedingung nicht erfüllt ist.

(["^TMP_:humidity"] <5) (say Batterie leer) DOELSE ()

Die Thermometer beginnen alle mit TMP_
Ich bitte um einen kleinen Hinweis, damit ich das verstehen kann.

Hier noch listg
Internals:
   CFGFN
   DEF        (["^TMP_:humidity"] <5) (say Batterie leer) DOELSE ()
   NAME       DI_Batterie_Thermometer
   NR         370
   NTFY_ORDER 50-DI_Batterie_Thermometer
   STATE      initialized
   TYPE       DOIF
   Readings:
     2016-02-28 00:49:16   state           initialized
   Condition:
     0          EventDoIf('^TMP_',$hash,'humidity',0) <5
   Devices:
   Do:
     0:
       0          say Batterie leer
     1:
       0
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   Itimer:
   Regexp:
     0:
       0          ^TMP_:humidity
     All:
       0          ^TMP_:humidity
   State:
   Timerfunc:
Attributes:
   do         always
   room       1


Besten Dank im Voraus.
Titel: Antw:Warum erfolgt hier eine Ansage, obwohl die Bedingung nicht erfüllt ist?
Beitrag von: CoolTux am 28 Februar 2016, 07:22:34
Was mir auffällt ist das zwischen dem mathematischen Operator und der Zahl kein Leerzeichen ist. Vielleicht hilft das schon.



Grüße
Titel: Antw:Warum erfolgt hier eine Ansage, obwohl die Bedingung nicht erfüllt ist?
Beitrag von: Ellert am 28 Februar 2016, 08:02:25
Mit ["^TMP_:humidity"] fragst Du nach einem Event, die Antwort liefert nur wahr oder falsch, daher führt der nachfolgende Vergleich "< 5" zu keinem sinnvollen Ergebnis.
Titel: Antw:Warum erfolgt hier eine Ansage, obwohl die Bedingung nicht erfüllt ist?
Beitrag von: CoolTux am 28 Februar 2016, 08:08:09
In der Tat steht es auch so in der Commandref. Danke Dir Ellert für den guten Hinweis. Dachte man kann das auch auswerten. Wieder was gelernt.
Wird er wohl noch ein and ranhängen müssen mit der Abfrage.

Könnte es gehen wenn er die Abfrage auf den Event macht?


and $event < 5


Denn laut Doku

Zitat

In der Bedingung und im Ausführungsteil werden die Schlüsselwörter $DEVICE durch das aktuelle Device, $EVENT durch die passende Eventzeile, $EVENTS kommagetrennt durch alle Eventzeilen des Triggers ersetzt.

Entsprechend können Perl-Variablen in der DOIF-Bedingung ausgewertet werden, sie werden in Kleinbuchstaben geschrieben. Sie lauten: $device, $event, $events


Und vielleicht statt DOELSE ein attr doalways




Grüße
Titel: Antw:Warum erfolgt hier eine Ansage, obwohl die Bedingung nicht erfüllt ist?
Beitrag von: Invers am 28 Februar 2016, 09:14:57
Das do allways war schon gesetzt.
Ich habe nun eure Vorschläge probiert, aber das Ergebnis ist leider gleich. Der Vergleich schewint so auch nciht zu funktionieren, obwohl eure Erläterungen einleuchtend sind.
Hier noch einmal ein aktuelles List:
Internals:
   CFGFN
   DEF        (["^TMP_:humidity"] and $event < 50) (say Batterie leer)
   NAME       DI_Batterie_Thermometer
   NR         370
   NTFY_ORDER 50-DI_Batterie_Thermometer
   STATE      cmd_1
   TYPE       DOIF
   Readings:
     2016-02-28 09:10:50   Device          TMP_SZ
     2016-02-28 09:10:50   cmd_event       TMP_SZ
     2016-02-28 09:10:50   cmd_nr          1
     2016-02-28 09:10:50   matched_event_c1_1 humidity: 59.0
     2016-02-28 09:10:50   state           cmd_1
   Condition:
     0          EventDoIf('^TMP_',$hash,'humidity',0) and $event < 50
   Devices:
   Do:
     0:
       0          say Batterie leer
   Helper:
     event      humidity: 59.0
     globalinit 1
     last_timer 0
     sleeptimer -1
     timerdev   TMP_SZ
     timerevent humidity: 59.0
     triggerDev TMP_SZ
     timerevents:
       T: 17.5 H: 59.0
       humidity: 59.0
     triggerEvents:
       T: 17.5 H: 59.0
       humidity: 59.0
   Internals:
   Itimer:
   Readings:
   Regexp:
     0:
       0          ^TMP_:humidity
     All:
       0          ^TMP_:humidity
   State:
   Timerfunc:
   Trigger:
Attributes:
   do         always
   room       1


Habt ihr noch eine Idee?
Titel: Antw:Warum erfolgt hier eine Ansage, obwohl die Bedingung nicht erfüllt ist?
Beitrag von: CoolTux am 28 Februar 2016, 09:21:57
Schau mal, da steht genau wie der event aus schaut. Matched Event humidity: 59.0
So kann man das also nicht auswerten. Schau mal das du was findest das nur Zählen beachtet werden oder Du das humidity beim prüfen von Event weg bekommst.



Grüße
Titel: Antw:Warum erfolgt hier eine Ansage, obwohl die Bedingung nicht erfüllt ist?
Beitrag von: Damian am 28 Februar 2016, 10:04:55
Zitat von: CoolTux am 28 Februar 2016, 09:21:57
Schau mal, da steht genau wie der event aus schaut. Matched Event humidity: 59.0
So kann man das also nicht auswerten. Schau mal das du was findest das nur Zählen beachtet werden oder Du das humidity beim prüfen von Event weg bekommst.



Grüße

(["^TMP_:humidity"] and [$DEVICE:humidity] < 50) (say Batterie leer)

Gruß

Damian
Titel: Antw:Warum erfolgt hier eine Ansage, obwohl die Bedingung nicht erfüllt ist?
Beitrag von: CoolTux am 28 Februar 2016, 10:30:36
Vielen Dank Damian für Deine Unterstützung.
Das Thema hatte mich auch Interessiert. So geht das also.



Grüße
Titel: Antw:Warum erfolgt hier eine Ansage, obwohl die Bedingung nicht erfüllt ist?
Beitrag von: Invers am 28 Februar 2016, 10:41:27
Danke, Damian.
Manchmal denke ich, ich sollte mir lieber Lego kaufen. :-)
Mein Trost ist, dass auch die Anderen nicht drauf gekommen sind. Da fühlt man sich nicht gleich ganz so dämlich. Lacht.

Damit der Computer mich nun nicht ununterbrochen vollquatscht, wenn eine Batterie leer ist, habe ich mal noch ein waitsame angefügt.

Meine TMP-Fühler können zwar ihren Batteriezustand melden, aber das tun sie nicht rechtzeitig. Die zeigen zuerst tagelang temperature -50 und humidity 0.1 an, bevor die Batteriemeldung kommt. Da ist das natürlich relativ sinnfrei.
Ich fange das Problem nun mit diesem DOIF ab, natürlich erst nach dem Einsetzen des richtigen Wertes 0.1.

Trotzdem danke ich natürlich ALLEN für die Unterstützung.
Titel: Antw:Warum erfolgt hier eine Ansage, obwohl die Bedingung nicht erfüllt ist?
Beitrag von: CoolTux am 28 Februar 2016, 10:45:25
Man lernt nie aus und immer dazu. Egal wie lange man das schon macht. Hihi.
Das wäre vielleicht ein gutes Beispiel für die Commandref, oder?