Verständnis von DOIF "do always"?

Begonnen von MichaelO, 08 November 2015, 22:12:00

Vorheriges Thema - Nächstes Thema

MichaelO

Hallo,

ich habe einen ZWave-Wandschalter, welcher ein Reading "sceneEvent1" auf on oder off setzt, je nachdem, ob ich oben oder unten doppelklicke. Auf dieses Doppelklicken wollte ich nun eine "Lichtszene" schalten - entweder ein, oder aus. Dabei sollte es egal sein, ob irgendwann einzelne Lampen der Szene manuell ein- oder ausgeschaltet werden. Ebenso sollte ein erneuter Doppelklick die entsprechende Szene "wiederherstellen".

Dazu habe ich folgendes DOIF formuliert:

Internals:
   CFGFN
   DEF        ## wenn der Taster der Wandlampe doppelt oben geklickt wird
( [WG_LS_Wandlampe:sceneEvent1] eq "on")

     ## Deckenlampe aus,
     ## beide indirekten Beleuchtungen an
     (set WG_DS_Fenster_Ch1_Licht on, set WG_LS_Deckenlampe off, set WG_LS_Wandlampe on )

## wenn  doppelt unten geklickt wird
DOELSEIF
( [WG_LS_Wandlampe:sceneEvent1] eq "off" )

     ## die Lichtszene aus
     (set WG_DS_Fenster_Ch1_Licht off, set WG_LS_Wandlampe off)
   NAME       WG_Lichtszene
   NR         605
   NTFY_ORDER 50-WG_Lichtszene
   STATE      disabled
   TYPE       DOIF
   Readings:
     2015-11-08 22:02:02   Device          WG_LS_Wandlampe
     2015-11-08 22:02:02   cmd_event       WG_LS_Wandlampe
     2015-11-08 22:02:02   cmd_nr          2
     2015-11-08 22:02:02   e_WG_LS_Wandlampe_sceneEvent1 off
     2015-11-08 22:02:42   mode            disabled
     2015-11-08 22:02:42   state           disabled
   Condition:
     0           ReadingValDoIf('WG_LS_Wandlampe','sceneEvent1','') eq "on"
     1           ReadingValDoIf('WG_LS_Wandlampe','sceneEvent1','') eq "off"
   Devices:
     0           WG_LS_Wandlampe
     1           WG_LS_Wandlampe
     all         WG_LS_Wandlampe
   Do:
     0:
       0          set WG_DS_Fenster_Ch1_Licht on, set WG_LS_Deckenlampe off, set WG_LS_Wandlampe on
     1:
       0          set WG_DS_Fenster_Ch1_Licht off, set WG_LS_Wandlampe off
   Helper:
     globalinit 1
     last_timer 0
     sleeptimer -1
   Internals:
   Itimer:
   Readings:
     0           WG_LS_Wandlampe:sceneEvent1
     1           WG_LS_Wandlampe:sceneEvent1
     all         WG_LS_Wandlampe:sceneEvent1
   State:
   Timerfunc:
   Trigger:
Attributes:
   do         always
   room       9.1.1_Skript


Und jetzt passiert es, dass ich bei eingeschalteter Szene nur die Lichter ausschalten kann, welche nicht an dem Doppelklick-Schalter hängen. Sobald ich den "WG_LS_Wandlampe"-Taster einfach betätige (und damit z.B. die Wandlampe ausschalte), stellt sich die Szene wieder her. Das Reading sceneEvent1 wird aber in dem Fall gar nicht neu getriggert.

Wieso sorgt das do always denn in dem Fall trotzdem dafür, dass das cmd1 nochmals ausgeführt wird?

Danke
Michael

hanske

Ich bin da auch schon häufiger reingefallen.

Ein DOIF auf ein reading z.B.:

define di_test DOIF ([dummy1:reading1] eq "on") ()

triggert auch, wenn sich ein anderes reading im gleichen dummy ändert.
z.B:
setreading dummy1 reading2 off

Wenn reading1 immer noch "on" ist, würde dadurch obiges DOIF erneut ausgelöst.
Ich finde das Verhalten sehr unlogisch.

Mein aktueller workaround ist:

define di_test DOIF ([dummy1:"reading1..on"]) ()

Es wäre schön, wenn man das auch mit der ersten Syntax erledigen könnte.
Raspberry Pi (Wheezy), Aeon Labs Z-Wave USB Stick 2, HM-USB Adapter, EBUS 2.0 mit Wemos
diverse HM und Z-Wave Geräte

9zehn75

Zitat
Es wäre schön, wenn man das auch mit der ersten Syntax erledigen könnte.

Wie soll das gehen?

ZitatDie Angaben werden immer von links nach rechts abgearbeitet. Zu beachten ist, dass nur die Bedingungen überprüft werden, die zum ausgelösten Event das dazughörige Device bzw. die dazugehörige Triggerzeit beinhalten. Kommt ein Device in mehreren Bedingungen vor, so wird immer nur ein Kommando ausgeführt, und zwar das erste, für das die dazugehörige Bedingung in der abgearbeiteten Reihenfolge wahr ist.
(commandref DOIF)

Das was Du möchtest, ist doch gerade das Triggern über Events. Das ist doch gerade das schöne an DOIF, dass es sowohl das eine wie auch das andere kann.
VG, 9zehn75

FHEM seit 02.02.2016: Raspberry Pi 2, ZME_UZB1, Fibaro WallPlugs, Fibaro Fenstersensoren, Aeon Indoor Sirene, Greenwave WallPlugs, Qubino Dimmer

Damian

Zitat von: 9zehn75 am 25 Februar 2016, 21:55:28
Wie soll das gehen?
(commandref DOIF)

Das was Du möchtest, ist doch gerade das Triggern über Events. Das ist doch gerade das schöne an DOIF, dass es sowohl das eine wie auch das andere kann.

und

[dummy1:"reading1..on"]

ist nicht komplizierter anzugeben als:

[dummy1:reading1] eq "on"

Beides hat seine Daseinsberechtigung.


ZitatEin DOIF auf ein reading z.B.:

Code: [Auswählen]
define di_test DOIF ([dummy1:reading1] eq "on") ()

triggert auch, wenn sich ein anderes reading im gleichen dummy ändert.

Das Gleiche gilt auf für Stati.

Probiere mal aus dem Event zu erkennen, ob ein Status geändert wurde ;)

Gruß

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

hanske

Ok, dann hatte ich wohl das falsche Gedankenmodell.

Es wird also immer auf irgendeine Änderung des Device getriggert, auch wenn ich vermeintlich nur ein Reading als Trigger angegeben habe.
Wenn ich nur bestimmte Änderungen triggern möchte, (also z.B. nur ein Reading) muss ich, ähnlich wie beim alten notify,
Reguläre Ausdrücke benutzen.
Das ist mir trotz der doch sehr umfangreichen DOIF Dokumentation nicht klar gewesen.

Danke und Grüße
Raspberry Pi (Wheezy), Aeon Labs Z-Wave USB Stick 2, HM-USB Adapter, EBUS 2.0 mit Wemos
diverse HM und Z-Wave Geräte

Damian

Zitat von: hanske am 26 Februar 2016, 09:17:48
Ok, dann hatte ich wohl das falsche Gedankenmodell.

Es wird also immer auf irgendeine Änderung des Device getriggert, auch wenn ich vermeintlich nur ein Reading als Trigger angegeben habe.
Wenn ich nur bestimmte Änderungen triggern möchte, (also z.B. nur ein Reading) muss ich, ähnlich wie beim alten notify,
Reguläre Ausdrücke benutzen.
Das ist mir trotz der doch sehr umfangreichen DOIF Dokumentation nicht klar gewesen.

Danke und Grüße

nicht, dass du für:
Zitat... beim alten notify ...

hier noch gesteinigt wirst :)

Gruß

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

hanske

Ich stelle gerade meine teilweise doch sehr komplexen notifys auf DOIF um.
Ist viel schlanker, ich hatte nur das Verständnisproblem mit den Readings.
Das "alte notify" hat aber immer noch seine Berechtigung und kommt bei mir weiterhin zum Einsatz für:
a) sehr einfache Ausdrücke
b) für verschachtelte Bedingungen (das ist dann dort teilweise übersichtlicher als beim DOIF)

Das DOIF hat einfache tolle Features und macht vieles einfacher.
Also bitte nicht steinigen ;)
Raspberry Pi (Wheezy), Aeon Labs Z-Wave USB Stick 2, HM-USB Adapter, EBUS 2.0 mit Wemos
diverse HM und Z-Wave Geräte

Damian

Zitat von: hanske am 26 Februar 2016, 10:12:56
Das DOIF hat einfache tolle Features und macht vieles einfacher.
Also bitte nicht steinigen ;)

Mir musst du das nicht sagen und ich werde dich auch nicht steinigen :)

Gruß

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

frank

ZitatDas DOIF hat einfache tolle Features und macht vieles einfacher.
das hört sich aber anders an. ;)
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

heikoh81

Hallo zusammen,

Zitat von: hanske am 26 Februar 2016, 10:12:56
Ich stelle gerade meine teilweise doch sehr komplexen notifys auf DOIF um.

So geht es mir auch.
DOIF hat meine FHEM-Programmierarbeit derart vereinfacht, dass ich mittlerweile sogar bestehende notifies umschreibe.
Eigentlich unnötig, da "Never change a running system".
Aber Würdigung von damians Arbeit, wie ich finde!

Zitat
Das "alte notify" hat aber immer noch seine Berechtigung und kommt bei mir weiterhin zum Einsatz für:
b) für verschachtelte Bedingungen (das ist dann dort teilweise übersichtlicher als beim DOIF)

So ist es auch bei mir.
Ich habe teils recht komplexe notifies mit viel Perl, die lasse ich wie sie sind.
Manche waren derart umfangreich, dass ich sie in Funktionen ausgelagert habe...

Viele Grüße,
Heiko