FHEM Forum

FHEM - Hausautomations-Systeme => Homematic => Thema gestartet von: pointde am 27 April 2015, 16:22:57

Titel: Rolladen holiday wird nicht beachtet
Beitrag von: pointde am 27 April 2015, 16:22:57
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:
Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag von: Paul am 27 April 2015, 19:22:21
Das at wird doch immer um 7:15 Uhr ausgeführt, ob dann das Rollo öffnet entscheidet dein if.
Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag von: pointde am 29 April 2015, 21:29:11
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


Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag von: Paul am 29 April 2015, 21:44:38
Weshalb ein zweites if?

Du willst doch vergleichen

Wenn nicht WE und nicht Ferien und nicht sonstwas
Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag von: pointde am 29 April 2015, 22:25:59
Nicht Wochenende, nicht Ferien, nicht Feiertag und Urlaub
Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag von: Mr. P am 30 April 2015, 15:51:06
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. ;-)
Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag von: pointde am 30 April 2015, 17:46:35
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");; } }
Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag von: Mr. P am 30 April 2015, 23:22:23
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. ;-)
Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag von: pointde am 10 Mai 2015, 11:36:36
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");; } }
Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag 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")}}

Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag von: Mr. P am 15 Mai 2015, 23:02:21
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! :-)
Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag 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?
Titel: Antw:Rolladen holiday wird nicht beachtet
Beitrag von: Treibhaus am 13 Juli 2015, 20:17:36
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.