[gelöst] DOIF und at-Befehl

Begonnen von MunichFan, 06 August 2018, 17:44:32

Vorheriges Thema - Nächstes Thema

MunichFan

Liebe FHEM-Freunde,

Ich habe folgende Frage:

Bisher hatte ich einen Befehl

  define cz.LampeAn at * 20:15 set Stehlampe on

und der wird auch erfolgreich jeden Abend ausgeführt.

Jetzt möchte ich aber diesen Befehl erweitern, indem das alles nur geschehen soll, wenn ein dummy Hauptschalter  (group Schalter webCmd on:off) auf "on" steht. Ich habe es versucht mit:

  defmod cz.LampeAn DOIF ([Hauptschalter]="on") (at * 20:15 set Stehlampe on);

aber offensichtlich wird der DOIF-Part gar nicht übernommen

Hat jemand eine Idee, was ich falsch mache und könnte mir villeicht freundlicherweise helfen?

Vielen Dank im Voraus


CoolTux

Mach lieber nur rein mit at


define cz.LampeAn at * 20:15 { CommandSet(undef,'Stehlampe on') if( Value('Hauptschalter') eq 'on') }
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ellert

DOIF kombiniert Zeit und Ereignissteuerung, daher benötigst Du kein at.
Mit defmod kannst Du den Modultyp nicht ändern

define LA DOIF ([20:15-23:00] and [Hauptschalter] eq "on") (set Stehlampe on) DOELSE (set Stehlampe off)


Verwende bitte Codetags #, dann wird Code lesbarer.

In der deutschsprachigen Befehlsreferenz gibt es umfangreiche Beispiele und Erklärungen, falls Du dich fragst, was die Änderungen zu bedeuten haben.
https://fhem.de/commandref_DE.html#DOIF

MunichFan

#3
vielen Dank für die schnellen Antworten, aber irgendwie habe ich leider doch noch Probleme (hatte erst gedacht, es würde funktionieren)

@CoolTux:
vielen Dank:

Zitat von: CoolTux am 06 August 2018, 17:49:30
Mach lieber nur rein mit at


define cz.LampeAn at * 20:15 { CommandSet(undef,'Stehlampe on') if( Value('Hauptschalter') eq 'on') }

muss in dem Befehl nicht irgendwo
set Stehlampe on
vorkommen?

Wenn ich den Befehl aber zu

define cz.LampeAn at * 20:15 set Stehlampe on { CommandSet(undef,'Stehlampe on') if( Value('Hauptschalter') eq 'on') }

ändere, macht er nie etwas unabhängig vom Hauptschalter (auch nicht bei
... if( Value('Hauptschalter') ne 'off') }
)

@Ellert
ebenfalls vielen Dank!


define cz.LampeAn DOIF ([20:15-23:00] and [Hauptschalter] eq "on") (set Stehlampe on) DOELSE (set Stehlampe off)

das klingt eigentlich gut, aber im DOELSE-Zweig sollte die Stehlampe unverändert bleiben, also am liebsten etwas der Art
...DOELSE (do nothing)
oder kann man den DOELSE-Zweig ganz weglassen?
und schließlich kann man den Zeitbereich durch einen Zeitpunkt (Sonnenuntergang) ersetzen?
Mit dem richtigen Modultyp und dessen Definition muss ich mich noch auseinandersetzen.

Tut mir leid, dass ich immer noch Fragen habe ...

MunichFan

nochmal ich:

Also ich bin jetzt soweit, dass

defmod cz.StehlampeAn at *{sunset("HORIZON=+2.0")} IF ('on' eq 'on') (set cz.Stehlampe on)
die Lampe schaltet, bzw.
defmod cz.StehlampeAn at *{sunset("HORIZON=+2.0")} IF ('on' ne 'on') (set cz.Stehlampe on)
die Lampe nicht schaltet

d. h. ich muss nur noch die Bedingung finden, die das dummy Hauptschalter mit dem state 'on' oder 'off' afragen kann,

IF (Value('Hauptschalter') eq 'on')
oder
[Hauptschalter] eq "on"
sind offensichtlich falsch.

viele Grüße

CoolTux

Zitat von: MunichFan am 06 August 2018, 18:25:59
vielen Dank für die schnellen Antworten, aber irgendwie habe ich leider doch noch Probleme (hatte erst gedacht, es würde funktionieren)

@CoolTux:
vielen Dank:
muss in dem Befehl nicht irgendwo
set Stehlampe on
vorkommen?

Wenn ich den Befehl aber zu

define cz.LampeAn at * 20:15 set Stehlampe on { CommandSet(undef,'Stehlampe on') if( Value('Hauptschalter') eq 'on') }

ändere, macht er nie etwas unabhängig vom Hauptschalter (auch nicht bei
... if( Value('Hauptschalter') ne 'off') }
)

Die Funktion CommandSet ist das was fhem mit set macht. Es wird bei set Kurzbefehl in FHEM auch nur die Funktion CommandSet aufgerufen. Es hätte also klappen sollen.

Und warum gehst du vom Perl if zum FHEM Modul IF?
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Ellert

Zitat von: MunichFan am 06 August 2018, 18:25:59
vielen Dank für die schnellen Antworten, aber irgendwie habe ich leider doch noch Probleme (hatte erst gedacht, es würde funktionieren)

@CoolTux:
vielen Dank:
muss in dem Befehl nicht irgendwo
set Stehlampe on
vorkommen?

Wenn ich den Befehl aber zu

define cz.LampeAn at * 20:15 set Stehlampe on { CommandSet(undef,'Stehlampe on') if( Value('Hauptschalter') eq 'on') }

ändere, macht er nie etwas unabhängig vom Hauptschalter (auch nicht bei
... if( Value('Hauptschalter') ne 'off') }
)

@Ellert
ebenfalls vielen Dank!


define cz.LampeAn DOIF ([20:15-23:00] and [Hauptschalter] eq "on") (set Stehlampe on) DOELSE (set Stehlampe off)

das klingt eigentlich gut, aber im DOELSE-Zweig sollte die Stehlampe unverändert bleiben, also am liebsten etwas der Art
...DOELSE (do nothing)
oder kann man den DOELSE-Zweig ganz weglassen?
und schließlich kann man den Zeitbereich durch einen Zeitpunkt (Sonnenuntergang) ersetzen?
Mit dem richtigen Modultyp und dessen Definition muss ich mich noch auseinandersetzen.

Tut mir leid, dass ich immer noch Fragen habe ...
DOELSE ist optional.
Selbstverständlich kannst Du auch einen Sonnenuntergang angeben.

Du kannst zum Ausschalten eine weitere Bedingung angeben, mit DOELSEIF

Mein Vorschlag war eine Variante, die das Ausschalten beinhaltet. Das automatisch Ausgeschaltet werden soll ist meisten der Fall.

MunichFan

Vielen Dank noch einmal für die Hinweise von Ellert und CoolTux, sie haben mich auf die richtige Fährte gesetzt. Meine Kommandos waren nämlich etwas komplizierter und haben deshalb nicht funktioniert. Nach der if-Bedingung wollte ich mehrere Befehle nacheinander geben und dabei bin ich ins Schleudern gekommen.

Richtig muss es bei IF wohl offensichtlich heissen:

defmod LA
at *{sunset("HORIZON=0")}
IF ([wz.HS] eq "on")
(set wz.Buecher on, sleep 1, set wz.Fenster on)

d. h. der Separator muss in diesem Fall ein ',' sein und nicht ein ';'. Bei 'IF' finde ich aber sehr praktisch, dass man diesen Befehl mit ExecNow leicht sofort testen kann.

@Ellert
Bei DOIF müssen mehrere Bedingungen wohl offensichtlich so formuliert werden

defmod LA DOIF ([] and [] eq "on")\
(set ...)(set ...)(set ...)
attr LA wait 0,1,2

d. h. offensichtlich steht jedes Kommando in einer Klammer, wie ich aus CmdRef herausgefunden habe. (Ja, ich weiss, erst lesen dann schreiben!) Verzögerungen werden über ein attr angegeben. Ich hatte aber fälschlich alles mit ';' getrennt und sleep verwendet. Bei DOIF ist mir aber nicht klar, wie man das einfach testen kann, ohne auf die Zeit zu warten, wann es stattfindet.

Die Lösung von CoolTux

define cz.LampeAn at * 20:15 set Stehlampe on { CommandSet(undef,'Stehlampe on') if( Value('Hauptschalter') eq 'on') }

finde ich auch sehr interessant und würde gerne genaueres darüber lesen, die Frage ist nur wo.

Aber insgesamt bin ich sehr happy und habe nun dank Euch eine gute Lösung - vielen Dank

CoolTux

Was genau willst Du da lesen? Bedingungsabfragen mit if? Das ist Perl Standard. Kann man in jedem Perl ich lesen.

Das mit CommandSet ist FHEM. Das kann man im Wiki im Developer Teil nachlesen oder in der fhem.pl



Grüße
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Das TuxNet Wiki:
https://www.cooltux.net

Pfriemler

Zitat von: MunichFan am 17 August 2018, 12:00:49
Bei DOIF ist mir aber nicht klar, wie man das einfach testen kann, ohne auf die Zeit zu warten, wann es stattfindet.
Mit "set <DOIF> cmd_<X>" kannst Du jeden Ausführungszweig ohne Bedingung triggern und ausführen lassen, also bspw. "set LA cmd_1" aus Deinem Beispiel.
So einfach ist das  ;)
"Ä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 ..."