FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: MunichFan am 06 August 2018, 17:44:32

Titel: [gelöst] DOIF und at-Befehl
Beitrag von: MunichFan am 06 August 2018, 17:44:32
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

Titel: Antw:DOIF und at-Befehl
Beitrag 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') }
Titel: Antw:DOIF und at-Befehl
Beitrag von: Ellert am 06 August 2018, 17:57:40
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
Titel: Antw:DOIF und at-Befehl
Beitrag 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:

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 ...
Titel: Antw:DOIF und at-Befehl
Beitrag von: MunichFan am 07 August 2018, 17:08:20
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
Titel: Antw:DOIF und at-Befehl
Beitrag von: CoolTux am 07 August 2018, 17:14:52
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?
Titel: Antw:DOIF und at-Befehl
Beitrag von: Ellert am 07 August 2018, 17:57:52
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.
Titel: Antw:DOIF und at-Befehl
Beitrag von: MunichFan am 17 August 2018, 12:00:49
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
Titel: Antw:DOIF und at-Befehl
Beitrag von: CoolTux am 17 August 2018, 12:48:39
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
Titel: Antw:DOIF und at-Befehl
Beitrag von: Pfriemler am 17 August 2018, 13:32:58
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  ;)