FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: Bond246 am 01 Januar 2019, 15:29:00

Titel: DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Bond246 am 01 Januar 2019, 15:29:00
Hallo zusammen,

ich habe ein DOIF für meine LED-Steuerung. Vor dem Neopixel-Modul ist ein Sonoff geschaltet, um das gesamte System offline zu nehmen. Das Problem ist, um die LED-Steuerung anzusprechen, muss ich Befehle nach dem Einschalten des Sonoff verzögern. Wenn der Sonoff aber eingeschaltet ist, soll die Verzögerung nicht vorhanden sein.

Deswegen versuchen ich das mit einem unterverschachtelten IF oder { if ... } zu lösen.

([$SELF:effect] eq "off") (
set [$SELF:device] nfx off 1000 10;
sleep 5;
set sonoff.bett OFF;
)
## cmd_2: Animation anhalten
DOELSEIF ([$SELF:effect] eq "stop") (
set [$SELF:device] nfx stop
)
## cmd_3: Einschalten
DOELSEIF ([$SELF:effect] eq "on") (
{ if ([sonoff.bett:state] eq "OFF") {
fhem('set sonoff.bett ON');
fhem('sleep 6,set [$SELF:device] nfx on 1000 10')
} else { fhem('set [$SELF:device] nfx on 1000 10')}
}
)
## cmd_4: Alle Pixel auf eine Farbe setzen
DOELSEIF ([$SELF:effect] eq "all") (
{ if ([sonoff.bett:state] eq "OFF") {
fhem('set sonoff.bett ON');
fhem('sleep 6,set [$SELF:device] nfx all [$SELF:color_1]')
} else { fhem('set [$SELF:device] nfx all [$SELF:color_1]')}
}
)


Wenn ich obiges Beispiel ausführe, bekomme ich folgenden Fehler:
2019.01.01 15:06:46 1: ERROR evaluating { if (OFF eq "OFF") { fhem('set sonoff.bett ON'); fhem('sleep 6,set ESP_bett_mcu nfx on 1000 10') } else { fhem('set ESP_bett_mcu nfx on 1000 10')} }: Bareword "OFF" not allowed while "strict subs" in use at (eval 265746) line 1.

2019.01.01 15:06:46 2: Bett_LEDs_Schalter: { if (OFF eq "OFF") { fhem('set sonoff.bett ON'); fhem('sleep 6,set ESP_bett_mcu nfx on 1000 10') } else { fhem('set ESP_bett_mcu nfx on 1000 10')} }: Bareword "OFF" not allowed while "strict subs" in use at (eval 265746) line 1.


Folgendes hab ich ebenfalls erfolglos probiert:
DOELSEIF ([$SELF:effect] eq "on") (
        IF ([sonoff.bett:state] eq "OFF") (
            set sonoff.bett ON;
            sleep 6,set [$SELF:device] nfx on 1000 10
        ) ELSE ( set [$SELF:device] nfx on 1000 10 )
)


Ich lerne zwar, dass DOIF extrem mächtig ist (wenn ich mir die commandref dazu anschaue) aber ich finde nicht den Bereich, der für mich relevant ist.

Das DOIF besteht insgesamt aus 20 cmds, nicht ausgeschlossen dass es noch mehr werden aber ich denke das ist an der Stelle nicht weiter relevant.

Ich hab zwar nach verschachelten DOIFs im Forum gesucht, war aber nicht besonders fündig wenn es darum geht, das auf mein Problem anzuwenden.

Viele Grüße
Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: the ratman am 01 Januar 2019, 16:00:39
ohne jetzt der super doif-crack zu sein oder sonoff-devices zu besitzen, versuch ich mich mal ... mal schaun, wer wieder lachen muß *g* (ich wette, damian und andere würden sowas in 2 zeilen lösen).

ich würds für mich "vereinfachen" und einfach mal 2 doelseif aus den jeweiligen dingern machen - z.b. cmd_4 irgendwie so oder ähnlich in cmd_4 und cmd_5 aufteilen:
DOELSEIF ([$SELF:effect] eq "all" and [sonoff.bett:state] eq "OFF")
( set sonoff.bett ON )
( set [$SELF:device] nfx all [$SELF:color_1] )
DOELSEIF ([$SELF:effect] eq "all" and [sonoff.bett:state] ne "OFF")
(  set [$SELF:device] nfx all [$SELF:color_1] )

die sleeps würd ich dann einfach mit dem wait-attr machen.
0,6:
0
Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Ellert am 01 Januar 2019, 18:04:52
Zitat von: Bond246 am 01 Januar 2019, 15:29:00
Hallo zusammen,

ich habe ein DOIF für meine LED-Steuerung. Vor dem Neopixel-Modul ist ein Sonoff geschaltet, um das gesamte System offline zu nehmen. Das Problem ist, um die LED-Steuerung anzusprechen, muss ich Befehle nach dem Einschalten des Sonoff verzögern. Wenn der Sonoff aber eingeschaltet ist, soll die Verzögerung nicht vorhanden sein.

Deswegen versuchen ich das mit einem unterverschachtelten IF oder { if ... } zu lösen.

([$SELF:effect] eq "off") (
set [$SELF:device] nfx off 1000 10;
sleep 5;
set sonoff.bett OFF;
)
## cmd_2: Animation anhalten
DOELSEIF ([$SELF:effect] eq "stop") (
set [$SELF:device] nfx stop
)
## cmd_3: Einschalten
DOELSEIF ([$SELF:effect] eq "on") (
{ if ([sonoff.bett:state] eq "OFF") {
fhem('set sonoff.bett ON');
fhem('sleep 6,set [$SELF:device] nfx on 1000 10')
} else { fhem('set [$SELF:device] nfx on 1000 10')}
}
)
## cmd_4: Alle Pixel auf eine Farbe setzen
DOELSEIF ([$SELF:effect] eq "all") (
{ if ([sonoff.bett:state] eq "OFF") {
fhem('set sonoff.bett ON');
fhem('sleep 6,set [$SELF:device] nfx all [$SELF:color_1]')
} else { fhem('set [$SELF:device] nfx all [$SELF:color_1]')}
}
)


Wenn ich obiges Beispiel ausführe, bekomme ich folgenden Fehler:
2019.01.01 15:06:46 1: ERROR evaluating { if (OFF eq "OFF") { fhem('set sonoff.bett ON'); fhem('sleep 6,set ESP_bett_mcu nfx on 1000 10') } else { fhem('set ESP_bett_mcu nfx on 1000 10')} }: Bareword "OFF" not allowed while "strict subs" in use at (eval 265746) line 1.

2019.01.01 15:06:46 2: Bett_LEDs_Schalter: { if (OFF eq "OFF") { fhem('set sonoff.bett ON'); fhem('sleep 6,set ESP_bett_mcu nfx on 1000 10') } else { fhem('set ESP_bett_mcu nfx on 1000 10')} }: Bareword "OFF" not allowed while "strict subs" in use at (eval 265746) line 1.


Folgendes hab ich ebenfalls erfolglos probiert:
DOELSEIF ([$SELF:effect] eq "on") (
        IF ([sonoff.bett:state] eq "OFF") (
            set sonoff.bett ON;
            sleep 6,set [$SELF:device] nfx on 1000 10
        ) ELSE ( set [$SELF:device] nfx on 1000 10 )
)


Ich lerne zwar, dass DOIF extrem mächtig ist (wenn ich mir die commandref dazu anschaue) aber ich finde nicht den Bereich, der für mich relevant ist.

Das DOIF besteht insgesamt aus 20 cmds, nicht ausgeschlossen dass es noch mehr werden aber ich denke das ist an der Stelle nicht weiter relevant.

Ich hab zwar nach verschachelten DOIFs im Forum gesucht, war aber nicht besonders fündig wenn es darum geht, das auf mein Problem anzuwenden.

Viele Grüße

'[sonoff.bett:state]' weil Bareword "OFF" not allowed in [sonoff.bett:state] eq "OFF", das gilt auch für die anderen Angaben im Perlcode.
Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Damian am 01 Januar 2019, 18:11:06
[sonoff.bett:state] wird im DOIF-FHEM-Modus gegen den Wert ersetzt. Im DOIF-Perl-Modus bleibt es eine Perlfunktion, dort klappen solche verschachtelten if-Abfragen besser.
Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Bond246 am 01 Januar 2019, 19:33:30
Zitat von: the ratman am 01 Januar 2019, 16:00:39
ohne jetzt der super doif-crack zu sein oder sonoff-devices zu besitzen, versuch ich mich mal ... mal schaun, wer wieder lachen muß *g* (ich wette, damian und andere würden sowas in 2 zeilen lösen).

ich würds für mich "vereinfachen" und einfach mal 2 doelseif aus den jeweiligen dingern machen - z.b. cmd_4 irgendwie so oder ähnlich in cmd_4 und cmd_5 aufteilen:
DOELSEIF ([$SELF:effect] eq "all" and [sonoff.bett:state] eq "OFF")
( set sonoff.bett ON )
( set [$SELF:device] nfx all [$SELF:color_1] )
DOELSEIF ([$SELF:effect] eq "all" and [sonoff.bett:state] ne "OFF")
(  set [$SELF:device] nfx all [$SELF:color_1] )

die sleeps würd ich dann einfach mit dem wait-attr machen.
0,6:
0


Den Gedanken hatte ich grundsätzlich auch schon. Aber irgendwie finde ich es charmanter, wenn ich die Anzahl der cmds auf das nötigste reduziere.

Zitat von: Damian am 01 Januar 2019, 18:11:06
[sonoff.bett:state] wird im DOIF-FHEM-Modus gegen den Wert ersetzt. Im DOIF-Perl-Modus bleibt es eine Perlfunktion, dort klappen solche verschachtelten if-Abfragen besser.


Heißt, dass ich mit Perl-Code verschachtel ist grundsätzlich eine gute Idee?
Aber was heißt das jetzt für mich? Ich verwende ja Perl, da bleibt es ja? Aber irgendwie nicht? Sorry, irgend etwas verstehe ich gerade falsch.
Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Damian am 01 Januar 2019, 19:35:10
Zitat von: Bond246 am 01 Januar 2019, 19:33:30
Den Gedanken hatte ich grundsätzlich auch schon. Aber irgendwie finde ich es charmanter, wenn ich die Anzahl der cmds auf das nötigste reduziere.

Heißt, dass ich mit Perl-Code verschachtel ist grundsätzlich eine gute Idee?
Aber was heißt das jetzt für mich? Ich verwende ja Perl, da bleibt es ja? Aber irgendwie nicht? Sorry, irgend etwas verstehe ich gerade falsch.

Den Unterschied kannst du hier nachlesen: https://fhem.de/commandref_DE.html#DOIF_Perl_Modus
Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Bond246 am 02 Januar 2019, 13:15:14
Ich glaube zuerst sollte geklärt werden, ob man es kombinieren kann, so wie ich es oben ja mache oder ob man das lieber nicht machen sollte.
Oder ob es theoretisch funktionieren müsste aber ob eventuell ein anderes Problem besteht.

Fakt ist, das obige funktioniert nicht und ich verstehe nach wie vor nicht warum. Dabei hilft mir leider auch die Commandref nicht.
Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Per am 02 Januar 2019, 13:46:31
attr DOIF_Readings verzoegerung:("[sonoff.bett:state]" eq "on"?0:6)
attr wait :[$SELF:verzoegerung]
Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Damian am 02 Januar 2019, 17:29:52
Zitat von: Bond246 am 02 Januar 2019, 13:15:14
Ich glaube zuerst sollte geklärt werden, ob man es kombinieren kann, so wie ich es oben ja mache oder ob man das lieber nicht machen sollte.
Oder ob es theoretisch funktionieren müsste aber ob eventuell ein anderes Problem besteht.

Fakt ist, das obige funktioniert nicht und ich verstehe nach wie vor nicht warum. Dabei hilft mir leider auch die Commandref nicht.

DOIF ersetzt im Ausführungsteil [sonoff.bett:state] gegen dessen Wert, dann ergibt sich if (off eq "off")... und das versteht Perl nicht.

DOIF mit IF kann das oder eben Perl-if im DOIF-Perl-Modus (Verzögerungen muss man dann allerdings über set_Exec programmieren).
Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Bond246 am 03 Januar 2019, 14:03:25
Zitat von: Per am 02 Januar 2019, 13:46:31
attr DOIF_Readings verzoegerung:("[sonoff.bett:state]" eq "on"?0:6)
attr wait :[$SELF:verzoegerung]

Vielen Dank für diesen Hinweis, das sieht super aus - glaub ich...
So wie ich die Beispiele in der commandref verstehe, triggert sonoff.bett das DOIF_Reading. Heißt, wenn der sonoff an geht, wird 6 sekunden verzögert das DOIF ausgeführt.
Bei mir wird aber ein DOIF ausgeführt, das zuerst den sonoff einschaltet und danach einen easyesp mit Daten befeuert. Je nachdem ob der sonoff bereits eingeschaltet ist oder nicht, soll der zweite Befehl innerhalb des gleichen DOIF verzögert sein oder nicht.

attr wait ist also entweder "0,0" oder "0,6", sonoff immer 0 und der folgende Wert 6 oder 0.
Was würde eigentlich passieren, wenn mehr als 2 Befehle innerhalb des DOIF sind?

Zitat von: Damian am 02 Januar 2019, 17:29:52
DOIF ersetzt im Ausführungsteil [sonoff.bett:state] gegen dessen Wert, dann ergibt sich if (off eq "off")... und das versteht Perl nicht.

DOIF mit IF kann das oder eben Perl-if im DOIF-Perl-Modus (Verzögerungen muss man dann allerdings über set_Exec programmieren).

Das hab ich verstanden.
Meine Frage zu FHEM- und Perl-Modus bezieht sich darauf:
DOELSEIF ([$SELF:effect] eq "on") (
{ if ([sonoff.bett:state] eq "OFF") {
fhem('set sonoff.bett ON');
fhem('sleep 6,set [$SELF:device] nfx on 1000 10')
} else { fhem('set [$SELF:device] nfx on 1000 10')}
}
)

Das IF wird ja noch im FHEM-Modus geprüft, der Perl-Bereich startet ja dann erst nach der Prüfung.

Ich tu mich da deswegen so schwer, weil ich den Perlmodus ansich schwerer lesbar finde, als den FHEM-Modus. Wenn ich da in 6 Monaten wieder Änderungen dran machen will, fange ich im Kopf vermutlich wieder an darüber nachzudenken, wie das eine oder das andere funktioniert hat. Der FHEM-Modus kommt mir da leichter verständlich vor ;-)

Aber vermutlich muss ich wohl mein ganzes DOIF in den Perlmodus konvertieren, um mit dem Problem klar zu kommen.
{ if ([sonoff.bett:state] eq "OFF") {
Das funktioniert nicht, weil OFF eq "OFF" da steht.
Aber korrekt ist es? :
{ if ("[sonoff.bett:state]" eq "OFF") {

Vielen Dank für die Unterstützung!
Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Damian am 03 Januar 2019, 18:48:54
Zitat von: Bond246 am 03 Januar 2019, 14:03:25
Meine Frage zu FHEM- und Perl-Modus bezieht sich darauf:
DOELSEIF ([$SELF:effect] eq "on") (
{ if ([sonoff.bett:state] eq "OFF") {
fhem('set sonoff.bett ON');
fhem('sleep 6,set [$SELF:device] nfx on 1000 10')
} else { fhem('set [$SELF:device] nfx on 1000 10')}
}
)

Das IF wird ja noch im FHEM-Modus geprüft, der Perl-Bereich startet ja dann erst nach der Prüfung.

mit FHEM-IF würde es so funktionieren:

DOELSEIF ([$SELF:effect] eq "on") (
IF ([sonoff.bett:state] eq "OFF") (
set sonoff.bett ON,
sleep 6,
                set [$SELF:device] nfx on 1000 10
) ELSE (set [$SELF:device] nfx on 1000 10)
)


Titel: Antw:DOIF verzögern mit mehreren DOELSEIF
Beitrag von: Bond246 am 03 Januar 2019, 21:17:23
Hallo Damian,

danke für den Code.
Ich hatte es genau so schonmal und hab ein
IF: no right bracket: ( set sonoff.bett ON
Meine Zeilen im IF hatte ich mit ; getrennt, nicht mit ,
Vermutlich war genau das mein Problem und ich dachte das Problem ist irgendwo an anderer Stelle und hab es mit perl probiert.

Vielen Dank!!!