FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: All-Ex am 13 Dezember 2016, 20:00:54

Titel: Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: All-Ex am 13 Dezember 2016, 20:00:54
Hallo,

mit der DOIF Generalisierung kann ich wunderbar Aktionen beim Öffnen und Schließen von Fenstern auslösen:
(["^window_:open|tilted"])
(...)
DOELSEIF
(["^window_:closed"])
(...)
attr do always


Nun möchte ich, dass die Öffnen-Aktion erst nach einer Verzögerung ausgeführt wird und setze dazu ein wait Attribut.

Wenn ich ein Fenster öffne und die Verzögerung abwarte klappt das. Aber wenn während der Wartezeit ein zweites Fenster auf- oder zugeht, wird die (verzögerte) Aktion für das erste Fenster abgebrochen. Ist auch irgendwie logisch, weil das DOIF einen neuen Zustand hat und damit ein neuer Timer für das neue Device gestartet wird.

Ich könnte nun für jedes Fenster ein eigenes DOIF ohne Generalisierung und inkl. Verzögerung bauen. Das funktioniert, ist aber recht unübersichtlich.

Gibt es einen Trick, das mit nur einem DOIF zu erledigen?
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: Sirel am 13 Dezember 2016, 23:19:24
Hi,
das wird meiner Meinung nach nicht funktionieren. Du könntest aber über ein Event eine Schleife starten (myutils), welche dir regelmäßig, alle paar Minuten/Stunden eine Übersicht über die offenen Fenster liefert.
Schau mal hier
https://forum.fhem.de/index.php?topic=42252.0 - den Kommentar von Cooltux.

Dazu dann noch die Attribute repeatcmd und repeatsame setzen, dann hast du schon eine ganz gute Lösung.

Max
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: Brockmann am 14 Dezember 2016, 09:26:54
Zitat von: All-Ex am 13 Dezember 2016, 20:00:54
Nun möchte ich, dass die Öffnen-Aktion erst nach einer Verzögerung ausgeführt wird und setze dazu ein wait Attribut.
Um eine Aktion grundsätzlich unabhängig vom (späteren) Status des DOIFs mit einer Verzögerung auszuführen, kannst Du ein temporäres at definieren.
Also in das DOIF anstelle von set blabla sowas reinschreiben wie
define tmpxyz at +00:05:00 set blabla

Wenn die Aktion nur ausgeführt werden soll, wenn das Device (immer noch) einen bestimmten Status hat, müsste man das dann allerdings als IF-Abfrage in das at aufnehmen.
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: Brockmann am 14 Dezember 2016, 09:44:01
Ergänzung (nach etwas Nachdenken):

Das wait-Attribut verträgt sich prinzipiell nicht wirklich gut mit generalisierten DOIFs. Je mehr Devices das DOIF umfasst und je länger der wait-Timer läuft, desto größer ist die Chance, dass ein anderes Device den wait-Timer unterbricht. Wirklich kontrollieren kann man das nicht mehr. Insofern ist von dieser Kombination wohl grundsätzlich abzuraten.
Der von mir vorgeschlagene temporäre at-Timer scheit mir ein guter Workaround. Oder gibt es noch andere Ideen dazu?
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: CBSnake am 14 Dezember 2016, 10:10:15
Moin,

man könnte:
- im Fensterkontakt mit dem DOIF ein Userreading setzen bzw ein vorhandes nutzen und dieses dann zusätzlich abfragen [device:reading:sec], das geht dann auch generalisiert.
- nicht zeit sondern Temperatur/Feuchtigkeit als ausschlaggebendes Element verwenden, wenn kälter als, wenn feuchter/trockener als setzt natürlich die entsprechenden Sensoren voraus.

Grüße
Achim

Gesendet von meinem SM-P605 mit Tapatalk
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: Per am 14 Dezember 2016, 13:26:34
Zitat von: Brockmann am 14 Dezember 2016, 09:44:01Oder gibt es noch andere Ideen dazu?
Da ich das Thema schon vor einer Weile hatte: at oder xxx-for-time, alles andere (z.B. sec auswerten) wird viel mehr Aufwand.
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: justme1968 am 14 Dezember 2016, 15:40:55
das ganze geht auch mit einem oder zwei at und benannten sleep. damit kann man einen watchdog bauen der für mehrere geräte funktioniert.

das at startet bei passendem event ein sleep mit eindeutig vom device abgeleiteten namen um das darauf folgendende kommando zu verzögern.

wenn z.b. nach schließen das ganze abgebrochen werden soll wird einfach das betreffende sleep wieder gelöscht.
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: Ellert am 14 Dezember 2016, 15:57:38
Du könntes ein Reading als Nachrichtenspeicher verwenden und den Inhalt des Reading senden, wenn wait nicht unterbrochen wurde.

(["^window_:open|tilted"])
  (setreading $SELF msgbuf [$SELF:msgbuf] <Nachricht>) (set send [$SELF:msgbuf], setreading $SELF msgbuf # )

wait 0,10:...
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: Damian am 14 Dezember 2016, 17:51:22
DOIF ["^window_:open|tilted"])
  (defmod at_$DEVICE at +00:05 set send Fenster $DEVICE offen)
DOELSEIF (["^window_:closed"])
  (delete at_$DEVICE)


evtl. vor dem delete noch abfragen, ob at_$DEVICE noch existiert, um eine Fehlermeldung zu vermeiden, wenn timer schon abgelaufen ist.

@justme1968 quite gibt es bei delete glaube ich noch nicht ;)


Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: justme1968 am 14 Dezember 2016, 20:00:01
ich rede ja auch von sleep :)

ein benanntes sleep wird mit cancel abgebrochen. da gibt es quiet.
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: Damian am 14 Dezember 2016, 20:36:03
Zitat von: justme1968 am 14 Dezember 2016, 20:00:01
ich rede ja auch von sleep :)

ein benanntes sleep wird mit cancel abgebrochen. da gibt es quiet.

das weiß ich

Und ich denke an delete bla quiet löschen ohne Fehlermeldung :)
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: All-Ex am 14 Dezember 2016, 22:20:55
Perfekt, Damian :)

Habe es jetzt so gemacht:
# 1 Fenster geschlossen ==> Fenster-Icon grau
(["^fns:closed"])
(
  setreading $DEVICE ftui_color #505050,                                  ## grau
  IF ( $defs{'at_$DEVICE'} ) (delete at_$DEVICE)
)
                                   
## 2 Fenster offen ==> Fenster-Icon sofort orange und nach 10 Minuten rot
DOELSEIF
(["^fns:open|tilted"])
(
  setreading $DEVICE ftui_color #996B19,                                  ## orange
  defmod at_$DEVICE at +00:10 setreading $DEVICE ftui_color #e74c3c       ## rot
)

attr do always


Vielen Dank 
Alex
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: Sirel am 15 Dezember 2016, 13:58:16
Hallo zusammen,
sehr elegante Lösung. Top - hätte ich nicht gedacht...

Vielen Grüße,

Max
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: All-Ex am 15 Dezember 2016, 19:21:41
Hallo,

ich habe das ganze noch etwas verfeinert und statt den starren 10 Minuten Verzögerung eine Formel eingebaut, welche ab 16 °C Außentemperatur um 23:59 h verzögert und unter 0 °C um 5 Minuten verzögert. Dazwischen liegt die Verzögerung zwischen 32 Minuten und 5 Minuten. Dadurch kommt die Warnung im Sommer später als im Winter.

## 1 Fenster geschlossen ==> Fenster-Icon grau
(["^fns:closed"])
(
  setreading $DEVICE ftui_color #505050,                                                                                     ## grau
  IF ($defs{'at_$DEVICE'}) (delete at_$DEVICE)
)
                                   
## 2 Fenster offen ==> Fenster-Icon sofort orange und nach Außentemperatur-abhängiger Wartezeit rot
DOELSEIF
(["^fns:open|tilted"])
(
  setreading $DEVICE ftui_color #996B19,                                                                                     ## orange
  defmod at_$DEVICE at +{([wet.yrno:temperature] > 0 ? ([wet.yrno:temperature] < 16 ? sprintf("00:%02d",0.12*[wet.yrno:temperature]**2+5) : "23:59") : "00:05")} setreading $DEVICE ftui_color #e74c3c     ## rot
)

## Die Formel verzögert abhängig von der Außentemperatur wie folgt:
##
## °C Verzögerung hh:mm
## >= 16 23:59
## 15 00:32
## 12 00:22
## 9 00:14
## 6 00:09
## 3 00:06
## <=0 00:05
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: Damian am 15 Dezember 2016, 20:16:41
Zitat von: All-Ex am 15 Dezember 2016, 19:21:41
Hallo,

ich habe das ganze noch etwas verfeinert und statt den starren 10 Minuten Verzögerung eine Formel eingebaut, welche ab 16 °C Außentemperatur um 23:59 h verzögert und unter 0 °C um 5 Minuten verzögert. Dazwischen liegt die Verzögerung zwischen 32 Minuten und 5 Minuten. Dadurch kommt die Warnung im Sommer später als im Winter.

## 1 Fenster geschlossen ==> Fenster-Icon grau
(["^fns:closed"])
(
  setreading $DEVICE ftui_color #505050,                                                                                     ## grau
  IF ($defs{'at_$DEVICE'}) (delete at_$DEVICE)
)
                                   
## 2 Fenster offen ==> Fenster-Icon sofort orange und nach Außentemperatur-abhängiger Wartezeit rot
DOELSEIF
(["^fns:open|tilted"])
(
  setreading $DEVICE ftui_color #996B19,                                                                                     ## orange
  defmod at_$DEVICE at +{([wet.yrno:temperature] > 0 ? ([wet.yrno:temperature] < 16 ? sprintf("00:%02d",0.12*[wet.yrno:temperature]**2+5) : "23:59") : "00:05")} setreading $DEVICE ftui_color #e74c3c     ## rot
)

## Die Formel verzögert abhängig von der Außentemperatur wie folgt:
##
## °C Verzögerung hh:mm
## >= 16 23:59
## 15 00:32
## 12 00:22
## 9 00:14
## 6 00:09
## 3 00:06
## <=0 00:05


Na, du ziehst ja gleich alle Register :)

Da dürfte manch einer sich wundern, was man mit dem guten at so alles machen kann - die at-Definition aber bitte nicht außerhalb von DOIF ausprobieren ;)
Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: Damian am 25 Dezember 2016, 10:45:22
UPs da bin ich als Moderator wohl auf den Löschen-Knopf gekommen, also noch mal von vorne:

An dieser Stelle möchte ich eine Alternative mit dem FHEM-sleep Befehl vorstellen.

Der Nachteil eines at-Befehls ist, dass man Zeitangaben immer in der Form HH:MM:SS oder HH:MM angeben muss. Beim sleep Befehl werden Verzögerungen in Sekunden angeben, das hat den Vorteil, das diese als Zahl leichter berechnet werden können.

Das einfache Beispiel:

DOIF ["^window_:open|tilted"])
  (defmod at_$DEVICE at +00:05 set send Fenster $DEVICE offen)
DOELSEIF (["^window_:closed"])
  (delete at_$DEVICE)


lässt sich mit sleep so realisieren:

DOIF ["^window_:open|tilted"])
  (sleep 300 $DEVICE quiet;set send Fenster $DEVICE offen)
DOELSEIF (["^window_:closed"])
  (cancel $DEVICE quiet)


und hier mit dynamischer Zeitverzögerung abhängig von der Temperatur:

DOIF ["^window_:open|tilted"])
  (sleep {([mysensor:temperature]**2+300)} $DEVICE quiet;set send Fenster $DEVICE offen)
DOELSEIF (["^window_:closed"])
  (cancel $DEVICE quiet)


Titel: Antw:Generalisierung in Verbindung mit wait (Warnung Fenster offen nach x Minuten)
Beitrag von: All-Ex am 25 Dezember 2016, 18:57:03
Funktioniert bestens und macht es noch einfacher, Danke !