Benötige Tipp zu 'OldValue' im DOIF

Begonnen von FunkOdyssey, 26 September 2017, 08:38:12

Vorheriges Thema - Nächstes Thema

FunkOdyssey

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.

Ellert

OldValue erwartet den Devicenamen als Parameter.

FunkOdyssey

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)

CoolTux

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.
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

FunkOdyssey

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.

Damian

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) ...
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

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. :-)

FunkOdyssey

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

Damian

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.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

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.

Damian

(
[Unwetterzentrale:WarnCount] and
(OldReadingsNum("Unwetterzentrale","WarnCount",0) < ReadingsNum("Unwetterzentrale","WarnCount",0))
)


Hätte es auch getan.
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

FunkOdyssey

Ach, verdammt. So war das gemeint. :-)

Per

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!