[gelöst]DOIF-Bedingung ohne Timer möglich? Anfängerfrage

Begonnen von Yil, 29 Januar 2016, 00:25:11

Vorheriges Thema - Nächstes Thema

Yil

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
HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi

scooty

#1
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" lohnt sich für Dich vielleicht doch noch mal ein Blick in den entsprechenden Abschnitt der  deutschen Commandref;)
Fhem auf Gigabyte Brix
CUL V3 HM / CUL V3 MAX / MaxCube aFW Homematic&MAX / ZWave.me ZME_UZB1 / SDuino 433 / Velux KLF200
Homematic / MAX / Logitech Hub / ZWave / Wifi LED / div. 433 Temperatursensoren / pywws WH1080 / IO Homecontrol

Per

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

Ellert

@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)

Per

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

Damian

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

Yil

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
HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi

Yil

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 
HM CCU3 und HCU mit ca. 50 HM-Komponenten inkl. Bausätzen
fhem auf RPi mit Sonos, EnOcean-CUL, ZWAVE-CUL und Bluetooth,
HUE, UniFi