Hauptmenü

DOIF

Begonnen von Wolfgang Hochweller, 05 November 2017, 10:35:24

Vorheriges Thema - Nächstes Thema

Wolfgang Hochweller

Ich moechte mit DOIF ein Toggle realisieren, aber wie ?
Das Ereignis fuer das DOIF ist ja immer gleich, nur die Auswertung aendert sich.
Standardmaessig kann  man ja nicht dasselbe Event damit zweimal hintereinander verwenden,
erst muss sich was aendern.
Kann ich das abschalten ?

Frank_Huber

Licht Toggle mir the DOIF:


defmod Licht_Werkstatt DOIF ([GPIO_IN_05:"^on$"] and [?GPIO_OUT_17] eq "off") (set GPIO_OUT_17 on)\
DOELSEIF ([GPIO_IN_05:"^on$"] and [?GPIO_OUT_17] eq "on") (set GPIO_OUT_17 off)
attr Licht_Werkstatt cmdState on|off
attr Licht_Werkstatt cmdpause 1:1
attr Licht_Werkstatt devStateIcon on:on:cmd_2 initialize|initialized|off:off:cmd_1
attr Licht_Werkstatt do always
attr Licht_Werkstatt stateFormat [GPIO_OUT_17:state]


Mit dem Handy online, daher kurz gefasst...


Pfriemler

DOIFs führen auch auch Aktionen auf identische Trigger aus, wenn sie mit dem Attribut do always versehen werden. So lässt sich auch toggeln, und der Aufriss um die Statusabfrage erübrigt sich sogar, wenn das zu steuernde Gerät einen Toggle-Befehl direkt untersützt (wie etwa HomeMatic, Rademacher-Rolläden, ...).
Für die Verhinderung zu schnell aufeinanderfolgender Trigger (vulgo: Prellen) gibt es das Attribut cmdpause. Steht alles in der hervorragenden deutschen commandref.
"Änd're nie in fhem.cfg, denn das tut hier allen weh!" *** Wheezy@Raspi(3), HMWLAN+HMUART, CUL868(SlowRF) für FHT+KS+FS20, miniCUL433, Rademacher DuoFern *** "... kaum macht man es richtig, funktioniert es ..."

nils_

Zitat von: Frank_Huber am 05 November 2017, 10:39:54
Licht Toggle mir the DOIF:


defmod Licht_Werkstatt DOIF ([GPIO_IN_05:"^on$"] and [?GPIO_OUT_17] eq "off") (set GPIO_OUT_17 on)\
DOELSEIF ([GPIO_IN_05:"^on$"] and [?GPIO_OUT_17] eq "on") (set GPIO_OUT_17 off)
attr Licht_Werkstatt cmdState on|off
attr Licht_Werkstatt cmdpause 1:1
attr Licht_Werkstatt devStateIcon on:on:cmd_2 initialize|initialized|off:off:cmd_1
attr Licht_Werkstatt do always
attr Licht_Werkstatt stateFormat [GPIO_OUT_17:state]


Mit dem Handy online, daher kurz gefasst...

das hast du mit dem handy getippt?  :o
Respekt!
viele Wege in FHEM es gibt!

Frank_Huber

Zitat von: nils_ am 06 November 2017, 16:19:48
das hast du mit dem handy getippt?  :o
Respekt!

Neee, aber auch ein Handy kann copy & paste vom Browser. :-)
Da wären sonst mindestens 20 Rechtschreibfehler...

Wolfgang Hochweller

Danke, jetzt habe ich folgendes :
1. Ein Notify. Ist kompliziert, funktioniert aber.


LichtWohnAll:cSceneSet:.* {
my $test = sprintf ( "%u", ReadingsVal("LichtWohnAll", "cSceneSet", 0));;
if ( $test == 3 )
{
   if ( ReadingsVal("LichtWohnEsstisch","state","") eq "on")
     { fhem ("set LichtWohnEsstisch off");; }
   else
     { fhem ("set LichtWohnEsstisch on");;}
}

}


2. Ein DOIF
Ist viel einfacher, geht aber nicht.


([LichtWohnAll:cSceneSet] == 3 ) (IF ([LichtWohnEsstisch:state] eq "on" ) (set LichtWohnEsstisch  off) ELSE (set LichtWohnEsstisch on))


Wo liegt hier der Fehler ?

Frank_Huber

Zitat von: howi42 am 10 November 2017, 10:59:52
Danke, jetzt habe ich folgendes :
1. Ein Notify. Ist kompliziert, funktioniert aber.


LichtWohnAll:cSceneSet:.* {
my $test = sprintf ( "%u", ReadingsVal("LichtWohnAll", "cSceneSet", 0));;
if ( $test == 3 )
{
   if ( ReadingsVal("LichtWohnEsstisch","state","") eq "on")
     { fhem ("set LichtWohnEsstisch off");; }
   else
     { fhem ("set LichtWohnEsstisch on");;}
}

}


2. Ein DOIF
Ist viel einfacher, geht aber nicht.


([LichtWohnAll:cSceneSet] == 3 ) (IF ([LichtWohnEsstisch:state] eq "on" ) (set LichtWohnEsstisch  off) ELSE (set LichtWohnEsstisch on))


Wo liegt hier der Fehler ?

versuche mal das:

([LichtWohnAll:cSceneSet] == 3  and [LichtWohnEsstisch] eq "on" ) (set LichtWohnEsstisch  off) DOELSEIF ([LichtWohnAll:cSceneSet] == 3  and [LichtWohnEsstisch] eq "off" ) (set LichtWohnEsstisch on))


Wolfgang Hochweller

Nicht ganz ....
Wenn ich mal die allerletzte Klammer wegnehme, erhalte ich ein Doppelkommando , on off hintereinander,
was ich auch verstehe.
Nach der 1. Bedingung geht die Lampe an, beim ElSEIF geht sie wieder aus.

Frank_Huber

#8
Zitat von: Frank_Huber am 10 November 2017, 11:10:21
versuche mal das:

([LichtWohnAll:cSceneSet] == 3  and [?LichtWohnEsstisch] eq "on" ) (set LichtWohnEsstisch  off) DOELSEIF ([LichtWohnAll:cSceneSet] == 3  and [?LichtWohnEsstisch] eq "off" ) (set LichtWohnEsstisch on)


Ja, sorry hinten war ne Klammer zuviel. LichtWohnEsstisch auf nicht triggernd.
Habs hier angepasst. versuch mal.
dazu evtl noch

attr cmdpause 1:1

eisman

hi,

ich habe das so gelöst....

defmod Taste33 DOIF ([Pin33:"low"] and [$SELF:Taste] ne "on") (set $SELF Taste on)\
DOELSEIF\
([Pin33:"low"] and [$SELF:Taste] ne "off") (set $SELF Taste off)
attr Taste33 alias Grünetaste
attr Taste33 cmdState off|on
attr Taste33 devStateIcon on:10px-kreis-rot off:10px-kreis-gruen
attr Taste33 group Steuerung
attr Taste33 readingList Taste
attr Taste33 room Steuerung
attr Taste33 setList Taste


und geht

gruss
1x FHEM Debian, Homematic,ZigBee,FS20 / 1X Raspberry, ConBee / 7x ESP
1x FHEM Debian, Homematic,Z2M             / 1X Raspberry, ConBee / 6x ESP
1x FHEM Debian,MQTT2                             / 1X Raspberry, i2c,onewire,gpio
1x auf Windows 2012 Hyper-V-S

Wolfgang Hochweller

Danke fuer eure Hilfe.
Letztendlich hat es das

attr cmdpause 1:1

gebracht.