[Gelöst] DOIF: Wert für WAIT Attribut als Variable?

Begonnen von Klaus.A, 22 Mai 2015, 22:17:10

Vorheriges Thema - Nächstes Thema

Klaus.A

Hallo, ich versuche das geniale "DOIF" für die Überwachung meiner Fenster einzusetzen. Funktioniert soweit sehr gut, nur möchte ich die Zeitspanne bis eine Meldung ausgelöst wird variabel regeln - abhängig von Jahreszeit und Außentemperatur und nicht fix wie bisher 15 Minuten.

Dazu wäre der beste Ansatz, den Wert für das WAIT Attribut in einer Variablen zu übergeben und den Wert der Variablen periodisch (z.B. jede Stunde) neu zu berechnen. (Die Variable wäre ein Dummy).

Ich bekomme das nicht hin. Entweder stehe ich auf der Leitung (alle möglichen Syntax-Varianten getestet) oder es geht aus konzeptionellen Gründen nicht. Wird dieser Wert einmalig bei Initialisierung des DOIF gesetzt und ist nicht mehr änderbar? Theoretisch könnte der Wert doch auch bei Evaluierung der DOIF-Bedingung aktuell verwendet werden um dann die Verzögerung zu definieren?

Natürlich könnte ich eine fest definierte Anzahl Bedingungen und Zeiträume festlegen und diese mit mehreren DOELSEIF's und entsprechenden WAIT Wertsequenzen definieren. Das ist mir allerdings zu statisch.

Ich bin für jeden Tipp, Idee, Anregung dankbar. Vielleicht denke ich auch in die falsche Richtung ...

Gruß, Klaus

2 x CubieTruck mit 1) FHEM 5.9 und 2) IOBroker-mit Echo-Dot/Alexa und Homekit-/Siri-Integration. 1 x HMLAN, 3 x HM-LGW-O-TW-W-EU-2, mehr als 90 HomeMatic Sensoren und Aktoren, Velux-Fenster-IF, Fibaro ZWave-Sensoren und Aktoren, Philips Hue Bridge, IRTrans IR-Konverter, AutoMower via API

igami

Das habe ich auch schon mal gebraucht. Einfach einen weitern DOELSIF zweig hinzufügen mit etwas in der Art

DOELSEIF([d_wait])
  (attr di_wait wait 0:0:{([d_wait]*60)})


Grüße
igami
Pi3 mit fhem.cfg + DbLog/logProxy
Komm vorbei zum FHEM Treffen im Kreis Gütersloh! Das nächste Mal im April 2020.

MAINTAINER: archetype, LuftdatenInfo, monitoring, msgDialog, Nmap, powerMap
ToDo: AVScene, FluxLED

flurin

#2
Wenn ich es richtig gelesen habe, soll DOIF entsprechend erweitert werden. "Coming soon", Termin unbekannt.
Solange kann man es so lösen:

Variante A:


define du_time dummy
set du_time 900

define di_var_watchdogA DOIF ([sensor]) ({Log(3,"di_var_watchdogA: Sensor failed")})
DOELSEIF ([du_time]) (attr di_var_watchdogA wait [du_time]:0, save)
attr di_var_watchdogA do resetwait
attr di_var_watchdogA wait 900:0


Die Fehlermeldung erfolgt nur einmal.
fhem.cfg wird gespeichert, damit das rote Fragezeichen bei "Save config" nicht nervt.

Variante B:


define du_time dummy
set du_time 900

define di_var_watchdogB DOIF ([sensor]) (trigger du_time)
DOELSEIF ([+[du_time]]) ({Log(3,"di_var_watchdogB: Sensor failed")})


Die Fehlermeldung erfolgt auch hier nur einmal.
Mit "do always" wird die Fehlermeldung wiederholt.

Gruss
flurin

Klaus.A

Ich hole das alte Thema wieder raus ... soeben in der CommandRef gesehen, dass jetzt für das WAIT Attribut auch eine Variable möglich ist. Genau das löst das ursprüngliche Problem.

DANKE für die Anpassung! Und auch für die Top-Doku in der CommandRef

Gruß, Klaus
2 x CubieTruck mit 1) FHEM 5.9 und 2) IOBroker-mit Echo-Dot/Alexa und Homekit-/Siri-Integration. 1 x HMLAN, 3 x HM-LGW-O-TW-W-EU-2, mehr als 90 HomeMatic Sensoren und Aktoren, Velux-Fenster-IF, Fibaro ZWave-Sensoren und Aktoren, Philips Hue Bridge, IRTrans IR-Konverter, AutoMower via API

Damian

Zitat von: Klaus.A am 04 April 2016, 23:06:12
Ich hole das alte Thema wieder raus ... soeben in der CommandRef gesehen, dass jetzt für das WAIT Attribut auch eine Variable möglich ist. Genau das löst das ursprüngliche Problem.

DANKE für die Anpassung! Und auch für die Top-Doku in der CommandRef

Gruß, Klaus

In der neuen Version https://forum.fhem.de/index.php/topic,51060.0.html, die bald eingecheckt wird, ist noch mehr möglich und zwar für alle Attribute, die mit Sekunden arbeiten:

Auszug aus der Doku:

ZitatStatt Sekundenangaben können ebenfalls Stati, Readings in eckigen Klammen, Perl-Funktionen sowie Perl-Berechnung angegeben werden. Dabei werden die Trennzeichen Komma und Doppelpunkt in Klammern geschützt und gelten dort nicht als Trennzeichen.
Diese Angaben können ebenfalls bei folgenden Attributen gemacht werden: cmdpause, repeatcmd, repeatsame, waitsame, waitdel

Beispiel:

attr my_doif wait 1:[wether:state]*3:rand(600)+100,Attr("mydevice","myattr","")

Gruß

Damian
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

fhemjan

Zitat von: Klaus.A am 04 April 2016, 23:06:12
Ich hole das alte Thema wieder raus ... soeben in der CommandRef gesehen, dass jetzt für das WAIT Attribut auch eine Variable möglich ist. Genau das löst das ursprüngliche Problem.
Kann mir jemand auf die Sprünge helfen? Finde dazu nichts in der Referenz.
Mein Ziel: Habe ein DOIF, das Bescheid gibt wenn ein Fenster 10 Min. offen ist. Nun würde ich gern abhängig von der Außentemperatur das wait Attribut anpassen, z.B. auf 5 Min. Ist das möglich?

Damian

Zitat von: fhemjan am 18 Januar 2023, 16:21:54
Kann mir jemand auf die Sprünge helfen? Finde dazu nichts in der Referenz.
Mein Ziel: Habe ein DOIF, das Bescheid gibt wenn ein Fenster 10 Min. offen ist. Nun würde ich gern abhängig von der Außentemperatur das wait Attribut anpassen, z.B. auf 5 Min. Ist das möglich?

ja, im wait-Attribut kannst du statt Zahlen auch andere Dinge angeben u. a. Readings, die eine Zahl beinhalten. Durch Ändern des Readings ändert sich die Wait-Zeit, siehe https://fhem.de/commandref_DE.html#DOIF_wait
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

fhemjan

Ok, danke schon mal für die Antwort.
Ist mein Gedanke richtig es so in den wait-Befehl zu schreiben:
my $temp = ReadingsVal("Temp_Terrasse","temperature","");;
if (($temp >= 10)) {700:0}
elsif (($temp >= 0) && ($temp < 10)) {600:0}
elsif (($temp < 0)) {300:0}

Ergebnis ist aktuell, dass das DOIF sofort ausgeführt wird sobald das Fenster geöffnet wird. Es scheint also noch der Wurm drin zu sein.

Damian

eher:

attr wait {[Temp_Terrasse:temperature] > 10 ? 700: [Temp_Terrasse:temperature] < 0 ? 300:600}:0
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

fhemjan

#9
Zitat von: Damian am 19 Januar 2023, 08:07:19
eher:

attr wait {[Temp_Terrasse:temperature] > 10 ? 700: [Temp_Terrasse:temperature] < 0 ? 300:600}:0
Ok, das probiere ich., danke!

Damian

Der ternäre Operator ist keine Spezialität von Perl, den gibt es in diversen Programmiersprachen, insb. in C
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF