FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Yil am 29 Januar 2016, 00:25:11

Titel: [gelöst]DOIF-Bedingung ohne Timer möglich? Anfängerfrage
Beitrag von: Yil am 29 Januar 2016, 00:25:11
Hallo,

ich möchte in einer einfachen DOIF-Abfrage das Reading eines Dummys auslesen und abgleichen. Egal wie ich's mache: ich erhalte immer den Fehler:

error: Wrong timespec ReadingsVal('KellerLueftungDummy','state',''): either HH:MM:SS or {perlcode}

1. Frage: Ich hatte DOIF so verstanden, dass man damit nicht nur Zeitpunkte und Zeiträume, sondern auch Zustände abfragen kann - oder bin ich da auf dem Holzweg?

Die Abfrage sieht so aus:

define TaupunktLueftungStart DOIF ([ReadingsVal('KellerLueftungDummy','state','')] eq 'ja'  and [ReadingsVal('KellerLueftungDummy','Last_Check','')] eq 'no') ((set KE.Abluft on-for-timer 300);;(setreading KellerLueftungDummy Last_Check yes)) DOELSE (setreading KellerLueftungDummy Last_Check no)
attr TaupunktLueftungStart do always
attr TaupunktLueftungStart wait Lueften_Intervall():300


2.Frage: Kann ich den 1.Wartezeitraum auch als Variable definieren? ich meinte, das irgendwo schon einmal gesehen zu haben.

Danke für Eure Unterstützung.

VG Yil
Titel: Antw:DOIF-Bedingung ohne Timer möglich? Anfängerfrage
Beitrag von: scooty am 29 Januar 2016, 09:08:55
Ungetestet und ohne Gewähr (Code ist zum Einfügen in das DEF-Feld Deines "TaupunktLueftungStart"-Devices:
([KellerLueftungDummy] eq 'ja' and [KellerLueftungDummy:Last_Check] eq 'no') (
   set KE.Abluft on-for-timer 300,
   setreading KellerLueftungDummy Last_Check yes)
DOELSE (setreading KellerLueftungDummy Last_Check no)


Desweiteren kommt mir Dein
attr TaupunktLueftungStart wait Lueften_Intervall():300
etwas sonderbar vor, was ist "Lueften_Intervall()"? Eine Sub im Deiner 99_myUtils.pm?
Falls ja, könnte es ggf. (selbst unsicher, ob  es so funktioniert)
attr TaupunktLueftungStart wait [{Lueften_Intervall()}]:300
sein.


Andreas

Disclaimer:
Wegen der Nutzung der grundsätzlichen Syntax von DOIF und Möglichkeiten des Attributs "wait" (http://fhem.de/commandref_DE.html#DOIF_wait) lohnt sich für Dich vielleicht doch noch mal ein Blick in den entsprechenden Abschnitt der  deutschen Commandref (//http://)?  ;)
Titel: Antw:DOIF-Bedingung ohne Timer möglich? Anfängerfrage
Beitrag von: Per am 29 Januar 2016, 09:58:47
Von Anfänger zu Anfänger ;)
Zitat von: Yil am 29 Januar 2016, 00:25:11define TaupunktLueftungStart DOIF ([ReadingsVal('KellerLueftungDummy','state','')] eq 'ja'  and [ReadingsVal('KellerLueftungDummy','Last_Check','')] eq 'no')
((set KE.Abluft on-for-timer 300);;(setreading KellerLueftungDummy Last_Check yes))
DOELSE (setreading KellerLueftungDummy Last_Check no)
ReadingsVal('KellerLueftungDummy','state','') ist eine Perl-Funktion, diese wird a: nicht getriggert, sondern nur abgefragt und müsste b: zusätzlich in geschweifte Klammern [{ReadingsVal('KellerLueftungDummy','state','')}].
Besser ist aber die Variante von scotty, die wird auch getriggert (wobei [KellerLueftungDummy:Last_Check] eq 'no' als Funktion bleiben kann oder evtl mit Fragezeichen versehen werden sollte: [?KellerLueftungDummy:Last_Check] eq 'no').

wait funktioniert auch mit "Variablen", nicht aber mit Funktionen. Wenn deine Funktion einen Dummy-Status setzt, kannst du diesen Nutzen:
wait TaupunktLueftungStart wait [von_funktion_gesetzter_dummy]:300
Titel: Antw:DOIF-Bedingung ohne Timer möglich? Anfängerfrage
Beitrag von: Ellert am 29 Januar 2016, 10:05:40
@Per:
Zitatwait funktioniert auch mit "Variablen", nicht aber mit Funktionen
Perl-Funktionen können genutzt werden, s. Beispiel aus der Commandref:
Zitatattr <DOIF-modul> wait 1:[delay]:rand(600)
Titel: Antw:DOIF-Bedingung ohne Timer möglich? Anfängerfrage
Beitrag von: Per am 29 Januar 2016, 10:16:56
OK, wenn das Ergebnis bei Ausführung feststeht, ja, wenn es sich später noch ändern kann, nein (zumindest wird die Änderung nicht mehr berücksichtigt). Bei rand() ändert sich später nix mehr, Lueften_Intervall() kennen wir nicht.
Titel: Antw:DOIF-Bedingung ohne Timer möglich? Anfängerfrage
Beitrag von: Damian am 29 Januar 2016, 10:30:27
wait funktioniert sowohl mit Stati, wie auch mit Funktionen. Es darf z. Zt. allerdings kein Komma oder Doppelpunkt im Ausdruck vorkommen. Die Werte werden immer erst dann ausgewertet, wenn ein Sleeptimer gesetzt wird, d.h. sie werden immer aktualisiert bevor der Timer gesetzt wird.

Gruß

Damian
Titel: Antw:DOIF-Bedingung ohne Timer möglich? Anfängerfrage
Beitrag von: Yil am 29 Januar 2016, 16:31:17
Oh, ihr seit alle genial! Danke für die Hinweise. Ich hab tatsächlich lange über der Commandref gesessen, aber bin irgendwie nicht drauf gekommen. Readings werden nicht getriggert, aber Zustände - ok, das war ein echter Hirnfehler meinerseits.

Also: es geht - vielen Dank.

Allerdings muss ich noch etwas an der Funktion arbeiten. Derzeit sieht das reading für den ersten Timer so aus:

wait_timer

10.03.2018 03:09:37 cmd_1 KellerLueftungDummy
   ;D ;D ;D

So lange wollte ich dann doch nicht warten  :o

Aber das bastel ich mir noch zurecht.

VG und nochmals Danke!

Yil
Titel: Antw:DOIF-Bedingung ohne Timer möglich? Anfängerfrage
Beitrag von: Yil am 29 Januar 2016, 17:22:21
Also. Die merkwürdig lange Wartezeit ergab sich daraus, dass die Funktion Lueften_Intervall() den return-Wert 60*70 hatte. Ganz offensichtlich bewirkt hier der Stern eine ganz eigene Berechnung. Schreibt man dagegen 4200, ist alles fein.

Es funktioniert tatsächlich mit einer Funktion, dann aber wie Damian geschrieben hat, ohne eckige oder geschweifte Klammern.

Hier der funktionale Code, wobei die Wait-Funktion int-Werte ausgibt und den Timer korrekt setzt.

define TaupunktLueftungStart DOIF ([KellerLueftungDummy] eq 'ja' and [KellerLueftungDummy:Last_Check] eq 'nein') (\
   set KE.Abluft on-for-timer 300,\
   setreading KellerLueftungDummy Last_Check yes)\
DOELSE (setreading KellerLueftungDummy Last_Check nein)
attr TaupunktLueftungStart do always
attr TaupunktLueftungStart wait Lueften_Intervall():300


Danke nochmals an alle!

VG Yil