FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: golmic am 13 März 2016, 22:23:37

Titel: isday() in DOIF
Beitrag von: golmic am 13 März 2016, 22:23:37
Hallo!
ich will eine Aktion nur ausführen wenn noch kein Tag ist:
Zitat
DOELSEIF ([07:00] and [!isday()] ) (set EG_FLUR_Spiegel on)

leider klappt das nicht. Es kommt die Fehlermeldung:
Zitat
DOIF: Wrong timespec !isday(): either HH:MM:SS or {perlcode}: !isday()

Was mache ich falsch?
Schonmal danke. :)
Titel: Antw:isday() in DOIF
Beitrag von: Otto123 am 13 März 2016, 22:31:39
in [] will DOIF Zeiten oder Readings. isday() ist eine Perlfunktion, die liefert null und eins. Die kannst Du dort so gar nicht verwenden.
Wenn überhaupt dann innerhalb von {} ...

Insofern sagt die Fehlermeldung genau was Sache ist.

So in der Art könnte das gehen:
([{!isday()}] eq "0"))

Gruß Otto
Titel: Antw:isday() in DOIF
Beitrag von: golmic am 13 März 2016, 22:51:48
Danke Otto123!
Habe mal die Abfrage nach deinem Vorschlag geändert.
Jetzt kommt folgende Fehlermeldung:
Zitat
DOIF: the function "!isday()" must return a timespec and not 1.: ([{!isday()}]eq"0")
Kann man den Wert einer Funktion überhaupt so auswerten?
Titel: Antw:isday() in DOIF
Beitrag von: Ellert am 13 März 2016, 23:59:14
([07:00] and [?{sunset}-{sunrise}]) siehe ab hier: http://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung
Titel: Antw:isday() in DOIF
Beitrag von: Per am 14 März 2016, 00:09:27
([07:00] and !({isday()}))
Titel: Antw:isday() in DOIF
Beitrag von: golmic am 14 März 2016, 06:50:06
Danke Per und Ellert,
es kommen zwar keine Fehlermeldungen mehr beim Abspeichern des DOIF, aber beides funktioniert leider nicht.

Bei !({isday()}) steht dann folgendes um 7:00 im Logfile:
PERL WARNING: Odd number of element in anonymious  hash at line 1

Bei sunset-sunrise passiert nichts, auch kein Eintrag im Log.

Woran könnte das jetzt liegen?
Titel: Antw:isday() in DOIF
Beitrag von: Damian am 14 März 2016, 07:45:03
Zitat von: golmic am 14 März 2016, 06:50:06
Danke Per und Ellert,
es kommen zwar keine Fehlermeldungen mehr beim Abspeichern des DOIF, aber beides funktioniert leider nicht.

Bei !({isday()}) steht dann folgendes um 7:00 im Logfile:
PERL WARNING: Odd number of element in anonymious  hash at line 1

Bei sunset-sunrise passiert nichts, auch kein Eintrag im Log.

Woran könnte das jetzt liegen?

Die Bedingung in DOIF ist in erster Linie Perl. isday ist eine Perlfunktion also:

!isday() oder sogar !isday

Gruß

Damian
Titel: Antw:isday() in DOIF
Beitrag von: Otto123 am 14 März 2016, 08:53:00
Zitat von: golmic am 13 März 2016, 22:51:48
Kann man den Wert einer Funktion überhaupt so auswerten?
Moin golmic,

DOIF will an dieser Stelle Zeitangaben (sagt ja auch die Fehlermeldung) oder den Inhalt von Readings. Damians Antwort erklärt mir jetzt auch nicht ob man eine Perl Funktion an der Stelle auswerten kann,  ich habe es noch nie hinbekommen.
Da ich vor allem ganz am Anfang immer Probleme mit dem Auswerten von isday hatte, habe ich mir ziemlich frühzeitig einfach einen dummy gebaut, der Tageslicht heißt und 0 und 1 annimmt. Der dummy wird mit at's und sunset /sunrise gesetzt, mit dem Vorteil, dass ich dabei noch "meine" Definition von Tageslicht setzen kann, also etwas früher oder später.
Der dummy geht immer, auch in DOIF auszuwerten, ich muss mich nicht mit unterschiedlichen Syntax von der Einbindung von Perlfunktionen rumschlagen.
Das ist eventuell keine elegante Lösung, aber einmal eingerichtet und funktioniert. Nie wieder drüber nachgedacht  8)

Gruß Otto
Titel: Antw:isday() in DOIF
Beitrag von: Damian am 14 März 2016, 09:40:49
Zitat von: Otto123 am 14 März 2016, 08:53:00
Moin golmic,

DOIF will an dieser Stelle Zeitangaben (sagt ja auch die Fehlermeldung) oder den Inhalt von Readings. Damians Antwort erklärt mir jetzt auch nicht ob man eine Perl Funktion an der Stelle auswerten kann,  ich habe es noch nie hinbekommen.
Da ich vor allem ganz am Anfang immer Probleme mit dem Auswerten von isday hatte, habe ich mir ziemlich frühzeitig einfach einen dummy gebaut, der Tageslicht heißt und 0 und 1 annimmt. Der dummy wird mit at's und sunset /sunrise gesetzt, mit dem Vorteil, dass ich dabei noch "meine" Definition von Tageslicht setzen kann, also etwas früher oder später.
Der dummy geht immer, auch in DOIF auszuwerten, ich muss mich nicht mit unterschiedlichen Syntax von der Einbindung von Perlfunktionen rumschlagen.
Das ist eventuell keine elegante Lösung, aber einmal eingerichtet und funktioniert. Nie wieder drüber nachgedacht  8)

Gruß Otto

Hallo Otto,

grundsätzlich kann man sagen, dass in der Bedingung eines DOIF-Moduls alles außerhalb von eckigen Klammern (rot markiert) Perl ist:


Bsp:.

DOIF ( myperlfunc()==1 or [mydevice] and [20:00] or [[mytime]] or myfunc2 )...
Titel: Antw:isday() in DOIF
Beitrag von: Otto123 am 14 März 2016, 09:55:10
Aha, also ohne {}?
golmic Beispiel also so:?DOELSEIF ([07:00] and !isday ) (set EG_FLUR_Spiegel on)
Titel: Antw:isday() in DOIF
Beitrag von: golmic am 14 März 2016, 10:40:26
Hallo!
Habe mal die beiden Vorschläge von Damian und den von Ellert mit "positiver Logik" wie folgt ausprobiert und alle 3 schalten den Lampe (um 10:22,10,10:23 und 10:24) ein.
Sieht dann (als Test - da jetzt Tag ist) so aus:

DOELSEIF ([10:22] and isday()) (set EG_FLUR_Spiegel on)
DOELSEIF ([10:23] and isday)    (set EG_FLUR_Spiegel on)
DOELSEIF ([10:24] and [?{sunrise}-{sunset}]) (set EG_FLUR_Spiegel on)


@Ellert: Meine Aussage ob zu Deinem Vorschlag " [?{sunset}-{sunrise}]" war falsch, es passiert nichts, weil zum Testzeitpunkt ja schon Tag war.

Danke Euch allen und einen schönen Tag aus Südhessen  :).