DOIF immer ausführen, jedoch nur wenn Status sich x Sekunden nicht verändert hat

Begonnen von timtom, 22 November 2016, 17:47:32

Vorheriges Thema - Nächstes Thema

timtom

Hallo,

ich verzweifel an einem DOIF.

Setting:
1 Wandtaster mit 4 Status

Dieser steuert ein eine DOIF (mit 3 DOELSEIF) über das ich jeweils eine LightScene ansteuere, z.B. regelt eine Scene die Heizung 5 Grad nach oben. Nach 60 Minuten wechselt diese wieder eigenständig  in den Automatikmodus. Da weder die LightScene noch das DOIF das mitbekommt, verbleiben die Status (Wandtaster und DOIF)

Daher nutze ich ein "do always", um z.B. die +5 Grad Scene erneut zu triggern.

Das "do always" hat aber den Nebeneffekt, dass beim Verdrücken des Tasters jeweils die LightScene umgestellt wird. Als Lösung habe ich überlegt, dass diese erst geändert werden soll, wenn sich der DOIF-Status x Sekunden nicht mehr ändert. Würde das so (in Pseudocode) funktionieren?

define di_LightScene
DOIF ([Button Hoch])
  (set LightScene A)
DOELSEIF ([Button Runter])
  (set LightScene B)
...
attr di_LightScene waitdel 5:5
attr di_LightScene do always


Was mich irritiert ist "wird ein laufender Timer gelöscht, falls eine Bedingung wiederholt wahr wird.". Dann würde mein Vorschlag ja nur Doppeldrücken (Hoch -> Hoch innerhalb 5 Sek) des Tasters abfangen und nicht (Hoch -> Runter)?

Ellert

Wenn Du "Verdrücken" korrigieren willst, dann reicht es wait zu setzen ohne zusätzliches Attribut. Ein wait-Timer wird zurück gesetzt, wenn Du nach der falschen Taste, bevor der Timer abgelaufen ist, eine andere Taste drückst.

timtom

Zitat von: Ellert am 22 November 2016, 20:15:58
Wenn Du "Verdrücken" korrigieren willst, dann reicht es wait zu setzen ohne zusätzliches Attribut. Ein wait-Timer wird zurück gesetzt, wenn Du nach der falschen Taste, bevor der Timer abgelaufen ist, eine andere Taste drückst.
Ok, gilt das denn auch in Kombination mit "do always". Wenn ich z.B. ein "wait 10" und "do always" nutze und innerhalb von 10 Sek hoch -> runter -> hoch drücke. Wir dann nur das letzte "hoch" getriggert?

Muschelpuster

Ja, wenn der ausgewertete Status dann nicht 10 Sekunden 'hält', dann passiert nichts. Bedeutet aber auch, dass das nicht funktioniert, wenn der Taster eine Release-Meldung hat und sich der Status wieder ändert.

abwartende Grüße
Niels
fhem @ ZBOX mit 1,6MHz Celeron, 4GB RAM & 120GB SSD mit Debian Bullseye # MiLight # Homematic via CCU3 # W&T WebIO # Rademacher DuoFern # ESPeasy # logdb@mysql # configdb@mysql # Shelly @ MQTT2 # go-eCharger mit PV-Überschussladung via DOIF

Per

Überleg dir das gut, ob du das wirklich willst. Besonders der WAF sinkt enorm, wenn nach dem Druck auf eine Taste nix passiert...
Ist deine Heizung wirklich so schnell, dass sie auf ein Verdrücken innerhalb 5 Sekunden reagieren kann?
Zur Not solltest du ein Dummy einführen, welches erst nach 5 Sekunden geändert wird, die Rückmeldung aber dennoch sofort kommt.

timtom

Zitat von: Per am 23 November 2016, 13:31:11
Überleg dir das gut, ob du das wirklich willst. Besonders der WAF sinkt enorm, wenn nach dem Druck auf eine Taste nix passiert...
Ist deine Heizung wirklich so schnell, dass sie auf ein Verdrücken innerhalb 5 Sekunden reagieren kann?
Zur Not solltest du ein Dummy einführen, welches erst nach 5 Sekunden geändert wird, die Rückmeldung aber dennoch sofort kommt.
Die Heizung reagiert nicht so schnell. Daher fand ich die Idee bisher ganz gut ;) Würde ich alles sofort triggern, würde bei jedem Druck die LightScene geändetr und mehrere Heizkörper angesteuert. Das würde die Funklast stark erhöhen. Daher die Heizkörper eh nicht so schnell reagieren, war die Idee, dass halt erst nach 10 Sek der Status genommen wird und dann erst die Heizkörper geregelt werden.

Oder hab ich da einen Denkfehler?