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ß
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
Hallo, greif auf den Wert mal ohne ReadingsVal zu. Also: [Helligkeit_Rolladen_auf]
Gesendet von iPhone mit Tapatalk
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.
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
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
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)
...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!?
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