Rolladen holiday wird nicht beachtet

Begonnen von pointde, 27 April 2015, 16:22:57

Vorheriges Thema - Nächstes Thema

pointde

Ich wollte, dass meine Rolladen um 07:15 Uhr hochgehen, wenn nicht Wochenende ist, nicht wenn ein Ferientag ist, und nicht wenn Urlaub ist.
define Rollo_auf at *7:15:00 { if ( !($we) && !(Value("Bayern_Ferientag") && !(Value("Feiertag_Urlaub")) ) { fhem ("set RolloWohnenEssen 100");; fhem("set LichtEssen off");; fhem("set StehlampeWohnen off");; } }

Wenn Wochenende und Feiertag und Urlaub ist, hätte ich dann eine zweite Zeile geschrieben, bei der dann eine andere Zeit steht. Oder könnte man das evtl. in eine schreiben?

Testweise habe ich mal einen freien Tag in die Holiday geschreiben.
Ergebnis:
Internals:
   NAME       Feiertag_Urlaub
   NR         25
   STATE      none
   TRIGGERTIME 1430172002.99922
   TYPE       holiday
   Readings:
     2015-04-27 16:12:13   state           none
     2015-04-27 16:12:13   tomorrow        Frei
     2015-04-27 16:12:13   yesterday       none
Attributes:
   room       Kalender


Wenn ich mir aber jetzt das Rolloprogramm anschaue, steht da, dass es morgen doch ausgeführt wird.
Wo liegt mein Fehler?

Internals:
   COMMAND    { if ( !($we) && !(Value("Bayern_Ferientag") && !(Value("Feiertag_Urlaub")) ) { fhem ("set RolloWohnenEssen 100"); fhem("set LichtEssen off"); fhem("set StehlampeWohnen off"); } }
   DEF        *7:15:00 { if ( !($we) && !(Value("Bayern_Ferientag") && !(Value("Feiertag_Urlaub")) ) { fhem ("set RolloWohnenEssen 100"); fhem("set LichtEssen off"); fhem("set StehlampeWohnen off"); } }
   NAME       Rollo_auf
   NR         192
   PERIODIC   yes
   RELATIVE   no
   REP        -1
   STATE      Next: 07:15:00
   TIMESPEC   7:15:00
   TRIGGERTIME 1430198100
   TRIGGERTIME_FMT 2015-04-28 07:15:00
   TYPE       at
   Readings:
     2015-04-27 16:13:07   state           Next: 07:15:00
Attributes:

Paul

Das at wird doch immer um 7:15 Uhr ausgeführt, ob dann das Rollo öffnet entscheidet dein if.
Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

pointde

Hast recht, war ein Denkfehler, wird ja immer um 07:15 auseführt.
So klappt es jetzt:
define Rollo_auf at *21:19 { if ( !($we) && !(Value("Bayern_Ferientag")) ) { fhem("set RolloKuecheFenster 100");; } }
Wenn ich aber noch die Variable Ferientag_Urlaub einbinde, geht es nicht. Hier steht auch nicht 0 drin, sondern none. Also habe ich folgendes getestet, was nicht geht:
define Rollo_auf at *21:25 { if ( !($we) && !(Value("Bayern_Ferientag")) && {if (Value("Feiertag_Urlaub") eq "none")) ) { fhem("set RolloKuecheFenster 100");; } }
Ich habe mir gedacht, wenn in der Variable als Wert none drin steht,... geht aber nicht:
Internals:
   NAME       Feiertag_Urlaub
   NR         25
   STATE      none
   TRIGGERTIME 1430344802.03538
   TYPE       holiday
   Readings:
     2015-04-29 00:00:02   state           none
     2015-04-29 00:00:02   tomorrow        none
     2015-04-29 00:00:02   yesterday       Frei
Attributes:
   room       Kalende



Paul

Weshalb ein zweites if?

Du willst doch vergleichen

Wenn nicht WE und nicht Ferien und nicht sonstwas
Cubietruck, HM-USB, CUL, FS20, FHT, HUE, Keymatic

pointde

Nicht Wochenende, nicht Ferien, nicht Feiertag und Urlaub

Mr. P

Ich glaub, was du möchtest, müsste so aussehen:
define Rollo_auf at *21:25 { if ( !$we && Value("Bayern_Ferientag") ne "none" && Value("Feiertag_Urlaub") ne "none" ) { fhem("set RolloKuecheFenster 100");; }


Ergibt logisch:
Wenn nicht Wochenende und Bayern_Ferientag irgendwas nur nicht "none" und Feiertag_Urlaub irgendwas nur nicht "none", dann mach die Küchenrollo ganz auf.

Im übrigen ist vielleicht das Attribut was für dich:
attr RolloKuecheFenster param levelInverse
Dadurch werden die Values umgedreht und dann ist 0 auch 'offen' und 100 'geschlossen. ;-)
Greetz,
   Mr. P

pointde

#6
Danke für die Antwort!
Hinten fehlt die geschweifte Klammer, oder?...
Bayern_Ferientag kennt nur 0 oder 1
Internals:
   NAME       Bayern_Ferientag
   NR         23
   STATE      0
   TYPE       dummy
   Readings:
     2015-04-30 16:11:58   state           0
Attributes:
   room       Kalender


Feiertag_Urlaub:
Internals:
   NAME       Feiertag_Urlaub
   NR         25
   STATE      none
   TRIGGERTIME 1430431202.05461
   TYPE       holiday
   Readings:
     2015-04-30 00:00:02   state           none
     2015-04-30 00:00:02   tomorrow        Tag der Arbeit
     2015-04-30 00:00:02   yesterday       none
Attributes:
   room       Kalender


Also müsste es doch eigentlich so sein:
Wenn nicht Wochenende und kein Ferientag (also 0) und kein Feiertag_Urlaub (none)..
Ich habe keine Fehler im Log, er führt es einfach nicht aus....

edit:
oder so:
define Rollo_auf at *17:52 { if ( !$we && Value("Bayern_Ferientag") eq "0" && Value("Feiertag_Urlaub") eq "none" ) { fhem("set RolloKuecheFenster 100");; } }

Mr. P

Zitat von: pointde am 30 April 2015, 17:46:35
Hinten fehlt die geschweifte Klammer, oder?...
Hast natürlich recht. Sollte keinen Code mit TapaTalk schreiben. ;-)

Zitat von: pointde am 30 April 2015, 17:46:35
Bayern_Ferientag kennt nur 0 oder 1
.
.
.
oder so:
define Rollo_auf at *17:52 { if ( !$we && Value("Bayern_Ferientag") eq "0" && Value("Feiertag_Urlaub") eq "none" ) { fhem("set RolloKuecheFenster 100");; } }

define Rollo_auf at *17:52 { \
   if ( !$we && Value("Bayern_Ferientag") == 0  && Value("Feiertag_Urlaub") eq "none" ) { \
      fhem("set RolloKuecheFenster 100");; \
   } \
}


Habs zwecks Lesbarkeit jetzt einmal etwas aufgesplittet und korrigiert, müsste so funktionieren.
Was mir noch aufgefallen ist: Warum nutzt du eigentlich nicht die holiday2we-Funktion?
Und was das Mitloggen angeht:
attr global verbose 4
vorm Testen in FHEM ausführen. Dann bekommst im Logfile von FHEM schon etwas mehr Output. ;-)
Greetz,
   Mr. P

pointde

Ich habe es jetzt mal so gelöst, obwohl der 2. Befehl nicht funktioniert:
define Rollo_auf_Werktag at *07:15 { if ( !$we && Value("Bayern_Ferientag") == 0 && Value("Feiertag_Urlaub") eq "none" ) { fhem("set RolloWohnenEssen 100");; fhem("set RolloKuecheFenster 100");; fhem("set LichtEssen off");; fhem("set StehlampeWohnen off");; } }

define Rollo_auf_Wochenende at *08:45 { if ( $we && Value("Bayern_Ferientag") == 1 && Value("Feiertag_Urlaub") ne "none" ) { fhem("set RolloWohnenEssen 100");; fhem("set RolloKuecheFenster 100");; fhem("set LichtEssen off");; fhem("set StehlampeWohnen off");; } }

pointde

Es hat gestern, am Vatertag mal funktoniert. Mein Code ist zwar bestimmt nicht sauber, hat aber wie gesagt funktoniert. Kann man das verkürzen oder besser machen.

define Rollo_auf_Wochenende at *08:45 {if ($we) { fhem("set RolloWohnenEssen 100");; fhem("set RolloKuecheFenster 100");; fhem("set LichtEssen off");; fhem("set StehlampeWohnen off")} elsif (Value("Bayern_Ferientag") == 1) { fhem("set RolloWohnenEssen 100");; fhem("set RolloKuecheFenster 100");; fhem("set LichtEssen off");; fhem("set StehlampeWohnen off")} elsif (Value("Feiertag_Urlaub") ne "none" ) { fhem("set RolloWohnenEssen 100");; fhem("set RolloKuecheFenster 100");; fhem("set LichtEssen off");; fhem("set StehlampeWohnen off")}}


Mr. P

Zitat von: pointde am 15 Mai 2015, 17:21:31
Es hat gestern, am Vatertag mal funktoniert. Mein Code ist zwar bestimmt nicht sauber, hat aber wie gesagt funktoniert. Kann man das verkürzen oder besser machen.

define Rollo_auf_Wochenende at *08:45 {if ($we) { fhem("set RolloWohnenEssen 100");; fhem("set RolloKuecheFenster 100");; fhem("set LichtEssen off");; fhem("set StehlampeWohnen off")} elsif (Value("Bayern_Ferientag") == 1) { fhem("set RolloWohnenEssen 100");; fhem("set RolloKuecheFenster 100");; fhem("set LichtEssen off");; fhem("set StehlampeWohnen off")} elsif (Value("Feiertag_Urlaub") ne "none" ) { fhem("set RolloWohnenEssen 100");; fhem("set RolloKuecheFenster 100");; fhem("set LichtEssen off");; fhem("set StehlampeWohnen off")}}



Zwei Dinge:

1) Schreib nicht alles in eine Zeile. Das ist zwar nett platzsparend... Aber das Wesentliche, nämlich das du auf einen Blick gut lesen kannst, was in deinem Code passieren soll, bleibt dabei auf der Strecke.

2) Wie es aussieht, bist du auf deinen Fehler drauf gekommen und hast ihn (wenn auch etwas umständlich, wie du selbst schon angemerkt hast) gelöst.
Optimiert sieht dein Code folgendermaßen aus:
define Rollo_auf_Wochenende at *08:45 { \
if ($we || Value("Bayern_Ferientag") == 1 || Value("Feiertag_Urlaub") ne "none" ) { \
fhem("set RolloWohnenEssen,RolloKuecheFenster 100";; set LichtEssen,StehlampeWohnen off") \
} \
}


Du hattest alles ursprünglich mit logischen && verknüpft gehabt. Es mussten also alle drei Werte wahr ergeben, damit deine Befehle ausgeführt werden.
Mit deinen elsif's hast du im Prinzip logische oder gebaut, die ich in einem if mit || darstellst. Der einzige Unterschied (und der ist hier offensichtlich unwichtig) zwischen dem elsif und der Verknüpfung mit logischem || in einem if besteht darin, dass beim if einfach einer der Werte zutreffen muss, ganz egal an welcher Position er steht. Beim elsif hingegen klappert das if jede einzelne Möglichkeit in der gewählten Reihenfolge ab und führt im Falle eines Treffers die darunter liegenden Befehle aus und beendet anschließend die if-Anweisung.

Have fun! :-)
Greetz,
   Mr. P

pointde

Dein Code funktioniert leider nicht!
Ich sehe aber keinen Fehler. Kannst du mir bitte nochmal helfen?

Treibhaus

Zitat von: pointde am 26 Mai 2015, 10:30:18
Dein Code funktioniert leider nicht!
Ich sehe aber keinen Fehler. Kannst du mir bitte nochmal helfen?

Meines Erachtens fehlt es an einer weiteren ) hinter dem none.
 
Signatur:
Raspberry 5 & NVMe + HM-Module für 3 Etagen (inkl  Garage/Garten) 
+BSC EnOcean TCM310 -Fensterkontakt,-Bewegungsmelder
+ 1-wired Temp-Sensoren + RHASSPY-Spracherkennung