Hauptmenü

DOIF - $we hebelt DOELSEIF aus

Begonnen von Cujo, 30 Oktober 2017, 21:53:01

Vorheriges Thema - Nächstes Thema

Cujo

Hallo

Ich habe meine simple Jalousiensteuerung  neulich um eine Wochenendabfrage erweitert. Die Definition sieht so aus:

([HomeStatus] eq 1 and (!($we)) and ([{sunrise("REAL",0,"08:00","9:00")}])) (set .*Jalousie*.* on) DOELSEIF ([HomeStatus] eq 1 and ([{sunset("REAL",900)}])) (set .*Jalousie*.* off)


Kurz gesagt: wenn der Haustatus gleich 1 und nicht Wochenende und Sonnenaufgang dann Jalousien hoch, sonst wenn Haustatus 1 und Sonnenuntergang Jalousien runter.

Das funktioniert auch prima unter der Woche. Am Wochenende passiert aber nichts. Ich wäre jetzt schon stark davon ausgegangen, dass die ELSE Bedingung auch am Wochenende greifen wird, aber dem ist nicht so.

Ich komme leider nicht dahinter was hier evaluiert wird und warum die Jalousien am Wochenende abends nicht hochfahren. Es hat den Anschein als würde !($we) die gesamte Abfrage terminieren.

Hat mir jemand einen Tipi. Vielen Dank. Grüße. Lukas

Ellert

#1
Du verwendest zu viele unnötige runde Klammern, das verwirrt nur, schau Dir die Beispiele in der deutschsprachigen Befehlsreferenz an.

Dort gibt es auch Beispiele zur Wochentagsteuerung, auf $we kann und wird im DOIF verzichtet.

Zusätzlich solltest Du Dich informieren, wann Befehle ausgeführt werden, wenn der gleiche Bedingungszweig wiederholt wahr wird.

Cujo

Danke für deine gutrn Absichten aber es hat mir jetzt leider nichts gebracht.

Die Klammern um $we müssen vielleicht nicht wirklich sein, aber das Weglassen bringt auch keine Verbesserung des Problems.

Warum sollte ich auf $we verzichten? Es klingt als ein Konstrukt welches seine Sacht macht. Es funktioniert auch tatsächlich nur bewirkt es etwas mit dem DOElseif was ich verstehen will. Zur Not werde ich es wieder entfernen und mit den Wochentagen hantieren.

Zitatwenn der gleiche Bedingungszweig wiederholt wahr wird
Hmmm. Kann ich dir bei bestem Willen nicht folgen.  Erste Bedingung wird durch !$we false also sollte DoElseIf greifen. Hausstatus und Sonnenuntergang ergibt true. Also was wird hier wiederholt wahr?

Nicht jeder fhem user = perl profi, also bitte erkläre mir jemand warum das mit $we so nicht geht. Oder weiss es auch niemand?

Danke. Lukas

Frank_Huber

Attribut do always.

Gesendet von meinem S3_32 mit Tapatalk


Otto123

#4
Hi Lukas,

siehe https://fhem.de/commandref_DE.html#DOIF_Wochentagsteuerung

Dein Beispiel so?
([HomeStatus] eq 1 and [{sunrise("REAL",0,"08:00","9:00")}|8]) (set .*Jalousie*.* on) DOELSEIF ([HomeStatus] eq 1 and [{sunset("REAL",900)}]) (set .*Jalousie*.* off)

Allerdings passiert dann eben am Wochenende früh nichts beim Sonnenaufgang. Du brauchst eine Alternative am Morgen.

Also in der Art ([<Zeit1>|7] or [<Zeit2>|8]) ()

Gruß Otto
Viele Grüße aus Leipzig  ⇉  nächster Stammtisch an der Lindennaundorfer Mühle
RaspberryPi B B+ B2 B3 B3+ ZeroW,HMLAN,HMUART,Homematic,Fritz!Box 7590,WRT3200ACS-OpenWrt,Sonos,VU+,Arduino nano,ESP8266,MQTT,Zigbee,deconz

Ellert

#5
Zitat von: Cujo am 31 Oktober 2017, 22:41:54
Danke für deine gutrn Absichten aber es hat mir jetzt leider nichts gebracht.

Die Klammern um $we müssen vielleicht nicht wirklich sein, aber das Weglassen bringt auch keine Verbesserung des Problems.

Warum sollte ich auf $we verzichten? Es klingt als ein Konstrukt welches seine Sacht macht. Es funktioniert auch tatsächlich nur bewirkt es etwas mit dem DOElseif was ich verstehen will. Zur Not werde ich es wieder entfernen und mit den Wochentagen hantieren.
Hmmm. Kann ich dir bei bestem Willen nicht folgen.  Erste Bedingung wird durch !$we false also sollte DoElseIf greifen. Hausstatus und Sonnenuntergang ergibt true. Also was wird hier wiederholt wahr?

Nicht jeder fhem user = perl profi, also bitte erkläre mir jemand warum das mit $we so nicht geht. Oder weiss es auch niemand?

Danke. Lukas
ZitatDie Klammern um $we müssen vielleicht nicht wirklich sein, aber das Weglassen bringt auch keine Verbesserung des Problems.
Ohne die Klammern wird's lesbarer. Und wenn Du den Code etwas strukturierst, wird es noch übersichtlicher, das hift dem Helfenden.
([HomeStatus] eq 1 and [{sunrise("REAL",0,"08:00","9:00")}|8])
     (set .*Jalousie*.* on)
DOELSEIF ([HomeStatus] eq 1 and [{sunset("REAL",900)}])
     (set .*Jalousie*.* off)

Übersichtlicher bedeutet auch meist, weniger Fehler.

$we ist Perl pur.
ZitatNicht jeder fhem user = perl profi,
Deshalb ist es im DOIF nicht notwendig und du sparst eine Verküpfung.

ZitatKann ich dir bei bestem Willen nicht folgen.
Was Dein Code am Wochenende machen soll, hast Du nicht beschrieben.
Daher kann man nur feststellen, dass die 2. Bedingung am WE zweimal nacheinander wahr wird und schon am Freitag wahr wurde. Daher wird set...off am WE nicht mehr ausgeführt, dieses Verhalten ist schon in der Einleitung zu DOIF beschrieben.

do always wurde hier schon erwähnt.

Dann funktioniert das DOIF auch am WE. Also, wenn Du am Sa. morgens die Jalousie manuell öffnest, dann fährt sie zu sunset(...) abends wieder runter.

War das verständlich?

Cujo

Jawohl, jetzt verstanden. Wenn also die zwei Bedingungszweige nur im Wechsel funktionieren also nur wenn erster Teil eintrat, dann der Zweite theoretisch ausgeführt werden kann, dann wir bei mir am Samstag früh cmd1 nicht true was cmd2 am Abend "unlocken" würde...Mhhh schon strange aber vor dem Hintergrund der Sensorsendeintervale natürlich legitim hier von der klassischen if/else logik abzuweihen. Fazit: doalways braucht der Mensch oder ein drittes cmd was am Samstag und Sonntag früh wahr wird. Grüsse und Danke. Lukas