FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: rih am 20 November 2016, 11:21:26

Titel: Doif mit ReadingsVal-Abfrage
Beitrag von: rih am 20 November 2016, 11:21:26
Hallo,
nach stundenlangem Suchen und Probieren muss ich nun doch um Hilfe bitten. Das nachfolgende doif-Konstrukt funktioniert:

([07:00-09:00] and (Value("Flur_Modus") eq "Automatik") and [Lichtsensor:brightness] > 20) (set Flur_Rolladen up)

Nun möchte ich den Größer-Vergleich mit dem hart kodierten Lichtsensorwert (20) durch den variablen state-Wert eines Dummys ersetzen:

([07:00-09:00] and (Value("Flur_Modus") eq "Automatik") and {[Lichtsensor:brightness] > ReadingsVal("Helligkeit_Rolladen_auf","state","")}) (set Flur_Rolladen up)

Das funktioniert zwar auch, aber ich bekomme im Logfile die Meldung: PERL WARNING: Odd number of elements in anonymous hash at (eval 74474) line 1.
Was mache ich falsch? Die Bedeutung der Perl-Warnung bringt mich leider auch nicht weiter.

Gruß
Titel: Antw:Doif mit ReadingsVal-Abfrage
Beitrag von: DeeSPe am 20 November 2016, 11:56:06
Du bist im DOIF und nicht in Perl, darum geht ReadingsVal nicht! Value dürfte auch nicht gehen.
[Lichtsensor:brightness] ist doch auch ein ReadingsVal. Warum dann nicht auch so für Helligkeit_Rolladen_auf ?

Gruß
Dan
Titel: Antw:Doif mit ReadingsVal-Abfrage
Beitrag von: pole23 am 20 November 2016, 11:57:41
Hallo, greif auf den Wert mal ohne ReadingsVal zu. Also: [Helligkeit_Rolladen_auf]


Gesendet von iPhone mit Tapatalk
Titel: Antw:Doif mit ReadingsVal-Abfrage
Beitrag von: Damian am 20 November 2016, 12:15:42
Zitat von: DeeSPe am 20 November 2016, 11:56:06
Du bist im DOIF und nicht in Perl, darum geht ReadingsVal nicht! Value dürfte auch nicht gehen.
[Lichtsensor:brightness] ist doch auch ein ReadingsVal. Warum dann nicht auch so für Helligkeit_Rolladen_auf ?

Gruß
Dan

ReadingsVal geht schon, da die Bedingung im DOIF "erweitertest" Perl ist. Aber in der Bedingung sollte man keine geschweiften Klammern an dieser Stelle setzen, das macht man beim Perl-if auch nicht ;)

Aber es ist schon richtig: Es ist mehr als sinnvoll in DOIF mit DOIF-spezifischen Angaben [...] zu arbeiten.

Titel: Antw:Doif mit ReadingsVal-Abfrage
Beitrag von: hschuett am 20 November 2016, 12:49:05
Hallo,
im DOIF kann auf Werte eines Dummys bzw. (State-)Werte eines Devices wie folgt zugegriffen werden:
[Dummy] eq "Dummy-Wert" --> es wird dabei der State des Dummys zum Vergleich herangezogen
[?Dummy] eq "Dummy-Wert" --> mit Fragezeichen davor kann Du die Abfrage als Bedingung verwenden, allerdings wird das DOIF dadurch nicht getriggert. Es muss nur zusätzlich zum eigentlichen Trigger diese Bedingung ebenfalls erfüllt sein

Auf Internals eines Geräts kann im DOIF ebenfalls direkt zugegriffen werden, es muss dazu ein & vor das zu verwendende Internal eines Geräts gesetzt werden. Ich mach das z.B. bei einem AT-Device um die nächste Ausführungszeit (Internal NTM) des ATs im DOIF zu verwenden.
[timer_Rolladen_Unten:&NTM]

Auf Readings kann ebenfalls direkt zugegriffen werden:
[FHEM-Device:READING]
[outdoor:humidity]>70

Auszug aus der Commandref Kurzreferenz:
http://fhem.de/commandref_DE.html#DOIF_Kurzreferenz (http://fhem.de/commandref_DE.html#DOIF_Kurzreferenz)
Operanden in der Bedingung und den Befehlen

    Stati [<devicename>]
    Readings [<devicename>:<readingname>]
    Internals [<devicename>:&<internalname>]

Die Funktionen Value() ReadingsVal() würde ich daher nicht verwenden, sondern die Abfragemöglichkeiten des DOIFs direkt nutzen.
Grüße, Harald
Titel: Antw:Doif mit ReadingsVal-Abfrage
Beitrag von: rih am 20 November 2016, 13:54:19
Danke für die Anregungen und Erklärungen. Manchmal sieht man halt den Wald vor lauter Bäumen nicht  :-[. So geht es:

([07:00-09:00] and (Value("Flur_Modus") eq "Automatik") and ([Lichtsensor:brightness] > [Helligkeit_Rolladen_auf:state])) (set Flur_Rolladen up)

Vielen Dank
Titel: Antw:Doif mit ReadingsVal-Abfrage
Beitrag von: Damian am 20 November 2016, 13:57:24
Zitat von: rih am 20 November 2016, 13:54:19
Danke für die Anregungen und Erklärungen. Manchmal sieht man halt den Wald vor lauter Bäumen nicht  :-[. So geht es:

([07:00-09:00] and (Value("Flur_Modus") eq "Automatik") and ([Lichtsensor:brightness] > [Helligkeit_Rolladen_auf:state])) (set Flur_Rolladen up)

Vielen Dank

ist das Gleiche wie:

([07:00-09:00] and [Flur_Modus] eq "Automatik" and [Lichtsensor:brightness] > [Helligkeit_Rolladen_auf:state]) (set Flur_Rolladen up)
Titel: Antw:Doif mit ReadingsVal-Abfrage
Beitrag von: hschuett am 20 November 2016, 15:50:20
...mich überrascht es sogar dass scheinbar die Value() Funktion direkt im DOIF funktioniert, dachte immer man müsste sich für die Funktionen Value() oder ReadingsVal() auf der "Perl-Ebene", also zwischen geschweiften Klammern befinden!?
Titel: Antw:Doif mit ReadingsVal-Abfrage
Beitrag von: Damian am 20 November 2016, 16:41:10
Zitat von: hschuett am 20 November 2016, 15:50:20
...mich überrascht es sogar dass scheinbar die Value() Funktion direkt im DOIF funktioniert, dachte immer man müsste sich für die Funktionen Value() oder ReadingsVal() auf der "Perl-Ebene", also zwischen geschweiften Klammern befinden!?

[Dummy] ist nichts anderes als Value("Dummy")

Merke:

Bedingung in DOIF = Perl erweitert um [...] Angaben

Ausführungen in DOIF = FHEM erweiterbar um Perl in {(...)} innerhalb der FHEM-Befehle