FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: FunkOdyssey am 26 September 2017, 08:38:12

Titel: Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: FunkOdyssey am 26 September 2017, 08:38:12
Hallo, ich habe irgendwie einen Schönheitsfehler in meinem DOIF. Folgende DOIF-Bedingung scheint (evtl.) zu funktionieren, ...

(
[Unwetterzentrale:WarnCount] > 0 and
{OldValue([Unwetterzentrale:WarnCount,0]) < Value([Unwetterzentrale:WarnCount,0])}
)
(
(msg ...)
)


... liefert mir aber folgende Ausgabe im FHEM-Log:

2017.09.26 01:06:57.823 1: PERL WARNING: Argument "" isn't numeric in numeric lt (<) at (eval 653046) line 1, <GEN573586> line 1.
2017.09.26 01:06:57.824 3: eval: di_uwz: warning in condition c01
2017.09.26 01:06:57.824 1: PERL WARNING: Odd number of elements in anonymous hash at (eval 653046) line 1, <GEN573586> line 1.
2017.09.26 01:06:57.825 3: eval: di_uwz: warning in condition c01


Hat jemand einen Tipp wie ich das vermeiden kann? Habe ich OldValue vielleicht sogar vollkommen falsch eingesetzt?

Danke vielmals.
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: Ellert am 26 September 2017, 11:06:41
OldValue erwartet den Devicenamen als Parameter.
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: FunkOdyssey am 26 September 2017, 11:24:07
Okay, danke. Bei der Recherche hier im Forum stolpere ich jedoch auch über Code-Zeilen, in denen ein Reading angegeben wurde.
In einigen anderen Threads ist die Rede davon, dass OldValue nur innerhalb eines notifys funktioniert.
Jetzt bin ich verwundert.

Ich probiere es jetzt erst einmal mit dem reinen Devicenamen. (STATE per stateformat angepasst)
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: CoolTux am 26 September 2017, 11:33:00
oldValue bezieht sich ausschließlich auf den STATE eines Devices.
Ich kann Dir nicht genau sagen ob DOIF das überhaupt kann, da es mal hieß das es nur von Notify unterstützt wird. Da aber Ellert Dir schon geantwortet hat gehe ich jetzt einfach mal davon aus das DOIF es kann.
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: FunkOdyssey am 26 September 2017, 11:34:02
Ich werde es beim nächsten Unwetter wissen. :-)
Wobei im Log ja eigentlich auch nur die fehlerhaften Parameter bemängelt wurden. Demnach scheint es ein OldValue in DOIF zu geben. Mal schauen.
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: Damian am 26 September 2017, 15:04:35
Zitat von: CoolTux am 26 September 2017, 11:33:00
oldValue bezieht sich ausschließlich auf den STATE eines Devices.
Ich kann Dir nicht genau sagen ob DOIF das überhaupt kann, da es mal hieß das es nur von Notify unterstützt wird. Da aber Ellert Dir schon geantwortet hat gehe ich jetzt einfach mal davon aus das DOIF es kann.

Man kann beim DOIF alle FHEM-Funktionen nutzen, die verfügbar sind, insb. oldValue. Allerdings kann man sie nur abfragen, weil sie das Modul nicht triggern können. Man könnte z. B. folgendes definieren:

DOIF ([mydevice] > oldValue("mydevice"))...


würde bedeuten, wenn der Wert im Status von mydevice ansteigt, dann ...


Das z. B. würde nicht funktionieren, weil hier ein Trigger fehlt (keine Angabe in eckigen Klammern):

DOIF (oldValue("mydevice") > 0) ...
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: FunkOdyssey am 26 September 2017, 15:10:01
Danke für den Hinweis.

Zum Triggern habe ich aber die erste Zeile:

(
[Unwetterzentrale:WarnCount] > 0 and
{OldValue("Unwetterzentrale") < Value("Unwetterzentrale")}
)


Deine Variante ist jedoch kürzer und hübscher. :-)
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: FunkOdyssey am 26 Juli 2018, 07:52:07
Ich bin jetzt mal auf das neue Attribut 'OldReadingsNum' umgestiegen und habe dies im Device 'Unwetterzentrale' für 'WarnCount' aktiviert.

Das DOIF habe ich wie folgt abgeändert:

(
[Unwetterzentrale:WarnCount] and
{(OldReadingsNum("Unwetterzentrale","WarnCount",0) < ReadingsNum("Unwetterzentrale","WarnCount",0))}
)
(
(msg mail...)
)
DOELSE
(
)


Ich habe bereits verschiedene Schreibweisen ausprobiert. Mit und ohne zusätzliche Klammern innerhalb der geschwungenen Klammern. Leider wird der Ausführungsteil jedesmal ausgeführt, wenn 'WarnCount' sich aktualisiert. Vermutlich greift irgendwo die Default-Wertangabe 0. Aber ich finde den Fehler nicht.

Sieht jemand den Fehler? Danke.




Abgesehen davon habe ich immer noch folgende Warnung:

condition c01: Odd number of elements in anonymous hash
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: Damian am 26 Juli 2018, 09:00:38
Zitat von: FunkOdyssey am 26 Juli 2018, 07:52:07
Ich bin jetzt mal auf das neue Attribut 'OldReadingsNum' umgestiegen und habe dies im Device 'Unwetterzentrale' für 'WarnCount' aktiviert.

Das DOIF habe ich wie folgt abgeändert:

(
[Unwetterzentrale:WarnCount] and
{(OldReadingsNum("Unwetterzentrale","WarnCount",0) < ReadingsNum("Unwetterzentrale","WarnCount",0))}
)
(
(msg mail...)
)
DOELSE
(
)


Ich habe bereits verschiedene Schreibweisen ausprobiert. Mit und ohne zusätzliche Klammern innerhalb der geschwungenen Klammern. Leider wird der Ausführungsteil jedesmal ausgeführt, wenn 'WarnCount' sich aktualisiert. Vermutlich greift irgendwo die Default-Wertangabe 0. Aber ich finde den Fehler nicht.

Sieht jemand den Fehler? Danke.




Abgesehen davon habe ich immer noch folgende Warnung:

condition c01: Odd number of elements in anonymous hash

In die DOIF-Bedingung gehören keine geschweiften Klammern hin.
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: FunkOdyssey am 26 Juli 2018, 09:41:41
Okay, vielen Dank.

Ich habe mir den alten Wert nun einfach als userreading angelegt:


attr Unwetterzentrale userReadings WarnCountOld:WarnCount.* { OldReadingsNum($name,"WarnCount",0) }


So sieht die DOIF-Bedingung nun einfacher aus:

[Unwetterzentrale:WarnCount] > [?Unwetterzentrale:WarnCountOld]

Danke für deinen Tipp.
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: Damian am 26 Juli 2018, 09:53:48
(
[Unwetterzentrale:WarnCount] and
(OldReadingsNum("Unwetterzentrale","WarnCount",0) < ReadingsNum("Unwetterzentrale","WarnCount",0))
)


Hätte es auch getan.
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: FunkOdyssey am 26 Juli 2018, 10:08:40
Ach, verdammt. So war das gemeint. :-)
Titel: Antw:Benötige Tipp zu 'OldValue' im DOIF
Beitrag von: Per am 06 August 2018, 13:06:38
Zitat von: FunkOdyssey am 26 Juli 2018, 09:41:41Ich habe mir den alten Wert nun einfach als userreading angelegt:


attr Unwetterzentrale userReadings WarnCountOld:WarnCount.* { OldReadingsNum($name,"WarnCount",0) }

Gefällt mir, gleich mal bei meinen Code-Schnipseln ablegen!