Hauptmenü

Beschattung mal einfach

Begonnen von oelidoc, 10 Juni 2023, 21:01:08

Vorheriges Thema - Nächstes Thema

oelidoc

Hallo,
bei uns wandert die Sonne über strassenseite, hausseite und gartenseite ums Haus herum. Momentan nutze ich ein einfaches DOIF, das man morgens einschaltet und das dann abhängig von festen Uhrzeiten die Rolläden fährt. Zur Vereinfachung habe ich die genauen Rolladenbefehle mal durch Dummys mit on und off ersetztdefmod beschattung_test DOIF ([$SELF:state] eq "on") (set strassenseite off)\
DOELSEIF ([13:30] and [?$SELF:state] eq "on") (set hausseite off)\
DOELSEIF ([15:00] and [?$SELF:state] eq "on") (set strassenseite on)\
DOELSEIF ([16:45] and [?$SELF:state] eq "on") (set gartenseite off)\
DOELSEIF ([18:45] and [?$SELF:state] eq "on") (set hausseite on)\
DOELSEIF ([19:45] and [?$SELF:state] eq "on") (set gartenseite on;;set $SELF state off)\
DOELSEIF (["$SELF:state: off"])(set hausseite on;;set strassenseite on;;set gartenseite on)
attr beschattung_test cmdState on|on|on|on|on|on|off
attr beschattung_test do always
attr beschattung_test icon fts_shutter_70
attr beschattung_test readingList state
attr beschattung_test room Jalousien
attr beschattung_test setList on off

setstate beschattung_test off
setstate beschattung_test 2023-06-10 20:28:21 cmd 7
setstate beschattung_test 2023-06-10 20:28:21 cmd_event beschattung_test
setstate beschattung_test 2023-06-10 20:28:21 cmd_nr 7
setstate beschattung_test 2023-06-10 20:28:21 e_beschattung_test_state off
setstate beschattung_test 2023-06-10 20:26:56 mode enabled
setstate beschattung_test 2023-06-10 20:28:21 state off
setstate beschattung_test 2023-06-10 20:26:56 timer_01_c02 11.06.2023 13:30:00
setstate beschattung_test 2023-06-10 20:26:56 timer_02_c03 11.06.2023 15:00:00
setstate beschattung_test 2023-06-10 20:26:56 timer_03_c04 11.06.2023 16:45:00
setstate beschattung_test 2023-06-10 20:26:56 timer_04_c05 11.06.2023 18:45:00
setstate beschattung_test 2023-06-10 20:26:56 timer_05_c06 11.06.2023 19:45:00
Das funktioniert aber sinnvoll nur solange, wie man die Beschattung nicht zu einem späteren Zeitpunkt im Tagesverlauf einschaltet. Dann werden natürlich z.B. die Rolladen strassenseite eingeschaltet, obwohl hier schon keine Sonne mehr ist oder Rolladen nicht geschlossen, weil der auslösende  Zeitpunkt schon vorüber ist. Verständlich?

Jetzt habe ich lange mit Zeitintervallen mit und ohne Zeittrigger experimentiert, kriege es aber einfach nicht gebacken.
Sowas wie AutoShutterControl ist m.E. für meine Zwecke overkill.

Vielleicht kann mich ja jemand mal in die richtige Richtung schubsen.

Vielen Dank

oelidoc

Per

Wenn du mit festen Zeiten arbeitest, wozu die Abfrage nach dem Status?

oelidoc

Ich will ja gerade weg von festen Zeiten, weil die Beschattung auch später noch eingeschaltet werden können soll (wg. WAF)

Damian

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

oelidoc

Hallo Damian,
Zitat von: Damian am 10 Juni 2023, 21:44:29Ich habe hier meine Lösung der Beschattung vorgestellt:

https://wiki.fhem.de/wiki/DOIF/Automatisierung#Beschattungssteuerung_abh%C3%A4ngig_von_der_Zimmertemperatur_und_Sonneneinstrahlung_f%C3%BCr_mehrere_Szenarien_mit_Visualisierung
Ja, das habe ich auch schon versucht zu lesen. Es übersteigt aber meinen Horizont.
Was ich suche, ist ein Gerät was auf Zuruf meiner Frau an Alexa die Beschattung abhängig nur von der Uhrzeit einschaltet. Sie will im Verlauf des Tages selber entscheiden, ob sie die Bude abdunkelt oder nicht. Und in Abhängigkeit der Uhrzeit des Einschaltens sollen eben nur die noch besonnten Hausseiten beschattet werden.
Gruß
oelidoc

Damian

Dann musst du genauso, wie in meinem Beispiel, mit Zeitintervallen arbeiten.

Statt Sonnneneinstrahlung (on/off) musst du Alexawunsch (on/off) angeben, den Temperatursensor kannst du in der Abfrage rausnehmen.

 
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

oelidoc

#6
Hallo Damian,
ich habe deine Vorlage aus dem Wiki für mich angepasst und schalte jetzt mittels eines Dummys per Alexa die Beschattung ein und aus. Bisher funktioniert soweit alles wie gewünscht  8)

Vielen Dank für deine Hilfe und den Code!

Der Vollständigkeit halber hier noch meine Versionen:

define di_beschattung1 DOIF DEF TPL_shutter (    ## Definition des Templates namens TPL_shutter\
## Parameternummer $1             $2           $3          $4          $5        $6                        $7 \
## Bedeutung       Name der Szene AlexaDummy   von Uhrzeit bis Uhrzeit Rollladen Befehl zum Herunterfahren Befehl zum Hochfahren\
shutter_$1 {                                     ## DOIF Block\
  if ([$3-$4]) {                                 ## innerhalb des Zeitfensters     \
    if ([$2] eq "ein" and !$VAR{$1}) { ## Wenn der AlexaDummy eingeschaltet ist und die Rollläden noch nicht heruntergefahren wurden\
      fhem_set("$5 $6");;;;                        ## Fenster herunterfahren\
      set_State("Beschattung läuft");;;;       ## Status Befehl belegen \
      $VAR{$1}=1;;;;                               ## Merker setzen, dass Fenster bereits heruntergefahren wurde\
    } elsif ([$2] eq "aus" and $VAR{$1}) { ## Wenn der AlexaDummy ausgeschaltet ist und die Rollläden bereits heruntergefahren wurden\
      fhem_set("$5 $7");;;;                        ## Fenster hochfahren\
      set_State("Beschattung aus");;;; ## Status mit Befehl belegen \
      $VAR{$1}=0;;;;                               ## Merker zurücksetzen\
    }\
  }  \
}\
)  ## Ende der Templatedefinition\
\
reset {[00:01];;;;delete $VAR;;;;}    ## DOIF-Block namens reset um nachts alle Merker zu löschen\
\
## Definition einzelner DOIF-Blöcke pro Fenstergruppe mit Hilfe des Templates\
##           $1           $2       $3      $4    $5    $6   $7 \
TPL_shutter (Wohnzimmer,schatten,08:00,15:00,Jalousie3,pct 30,on)\
TPL_shutter (Badezimmer,schatten,08:00,15:00,Jalousie4,pct 30,on)\
TPL_shutter (Arbeitszimmer_gross,schatten,08:00,15:00,Jalousie5,pct 30,on)\
TPL_shutter (Arbeitszimmer_klein,schatten,13:30,18:45,Jalousie6,pct 30,on)\
TPL_shutter (Schlafzimmer_klein,schatten,13:30,18:45,Jalousie7,pct 15,on)\
TPL_shutter (Schlafzimmer_gross,schatten,16:45,19:45,Jalousie8,pct 15,on)\
TPL_shutter (Ankleidezimmer,schatten,16:45,19:45,Jalousie1,pct 25,on)\

attr di_beschattung1 alias Beschattung
attr di_beschattung1 icon helper_doif
attr di_beschattung1 room Jalousien

Und der dazugehörige Dummy:

define schatten dummy
attr schatten alexaName Beschattung
attr schatten alias Beschattung
attr schatten eventMap on:ein off:aus
attr schatten genericDeviceType switch
attr schatten icon fts_shutter_70
attr schatten room Jalousien,Mobil,alexaRoom
attr schatten setList on off
#   FUUID      6485a3cb-f33f-74ea-2d38-8c32a01162fff2b2
#   NAME       schatten
#   NR         644
#   STATE      ein
#   TYPE       dummy
#   eventCount 4
#   READINGS:
#     2023-06-11 14:52:01   state           on
#   hmccu:
#
setstate schatten ein
setstate schatten 2023-06-11 14:52:01 state on


Gruß

oelidoc

oelidoc

Zitat von: oelidoc am 11 Juni 2023, 15:28:08Bisher funktioniert soweit alles wie gewünscht  8)

Mist, zu früh gefreut. Natürlich fahren die Rolladen nach Ablauf des Zeitintervalls mangels Trigger nicht wieder hoch.
Ich habe jetzt folgendes probiert:

elsif ([$4:02] and $VAR{$1}) {             
      fhem_set("$5 $7");;

DEF TPL_shutter (    ## Definition des Templates namens TPL_shutter
## Parameternummer $1             $2           $3          $4          $5        $6                        $7
## Bedeutung       Name der Szene AlexaDummy   von Uhrzeit bis Uhrzeit Rollladen Befehl zum Herunterfahren Befehl zum Hochfahren
shutter_$1 {                                     ## DOIF Block
  if ([$3-$4]) {                                 ## innerhalb des Zeitfensters     
    if ([$2] eq "ein" and !$VAR{$1}) { ## Wenn der AlexaDummy eingeschaltet ist und die Rollläden noch nicht heruntergefahren wurden
      fhem_set("$5 $6");;                        ## Fenster herunterfahren
      set_State("Beschattung läuft");;       ## Status Befehl belegen
      $VAR{$1}=1;;                               ## Merker setzen, dass Fenster bereits heruntergefahren wurde
    } elsif ([$2] eq "aus" and $VAR{$1}) { ## Wenn der AlexaDummy ausgeschaltet ist und die Rollläden bereits heruntergefahren wurden
      fhem_set("$5 $7");;                        ## Fenster hochfahren
      set_State("Beschattung aus");; ## Status mit Befehl belegen
      $VAR{$1}=0;;                               ## Merker zurücksetzen
    } ([$4:02] and $VAR{$1}) {             
      fhem_set("$5 $7");;
   }
  } 
}
)  ## Ende der Templatedefinition

reset {[00:01];;delete $VAR;;fhem_set"schatten aus";;}    ## DOIF-Block namens reset um nachts alle Merker zu löschen und
                                                          ##AlexaDummy auszuschalten

## Definition einzelner DOIF-Blöcke pro Fenstergruppe mit Hilfe des Templates
##           $1           $2       $3      $4    $5    $6   $7
TPL_shutter (Wohnzimmer,schatten,07:30,15:00,Jalousie3,pct 30,on)
TPL_shutter (Badezimmer,schatten,07:30,15:00,Jalousie4,pct 30,on)
TPL_shutter (Arbeitszimmer_gross,schatten,07:30,15:00,Jalousie5,pct 30,on)
TPL_shutter (Arbeitszimmer_klein,schatten,13:30,18:45,Jalousie6,pct 30,on)
TPL_shutter (Schlafzimmer_klein,schatten,13:30,18:45,Jalousie7,pct 15,on)
TPL_shutter (Schlafzimmer_gross,schatten,16:45,19:45,Jalousie8,pct 15,on)
TPL_shutter (Ankleidezimmer,schatten,16:45,18:54,Jalousie1,pct 25,on)
## hier können weitere Szenarien für weitere Fenster hinzugefügt wer

Das funktioniert aber leider nicht. Ich bräuchte mal konkrete Hilfe, da meine PERL Kenntnisse eigentlich gleich Null sind und hier im Moment die Sonne jeden Tag nur so brezelt...

Vielen Dank

oelidoc

Damian

Zeiten musst du ohne $ angeben. Das ist aber nicht Perl, sondern DOIF-Syntax.

([4:02] and $VAR{$1})
Willst du wirklich nachts die Rollladen bewegen?

Bei mir bleiben die Rollladen einfach unten bis man sie wieder hochfährt.



Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

oelidoc

Sorry,
Ich dachte ich könnte den Endpunkt des Zeitintervalls [$4] plus zwei Sekunden aus dem Template als Zeitpunkt zum Hochfahren der Rolladen nutzen.
Will natürlich nicht nachts um vier die Rolladen bewegen.
Und ja, bei uns müssen die Rollos, wenn die Sonne nicht mehr draufsteht automatisch wieder hoch, damit sich die Frau nicht eingesperrt fühlt...

Damian

Zitat von: oelidoc am 13 Juni 2023, 20:03:13Sorry,
Ich dachte ich könnte den Endpunkt des Zeitintervalls [$4] plus zwei Sekunden aus dem Template als Zeitpunkt zum Hochfahren der Rolladen nutzen.
Will natürlich nicht nachts um vier die Rolladen bewegen.
Und ja, bei uns müssen die Rollos, wenn die Sonne nicht mehr draufsteht automatisch wieder hoch, damit sich die Frau nicht eingesperrt fühlt...


Dann musst du die Regeln der Zeitberechnung beachten: https://fhem.de/commandref_DE.html#DOIF_Zeitsteuerung_mit_Zeitberechnung

([($4+[00:02])]
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

oelidoc

Okay, Regeln der Zeitberechnung in deinem Beispiel kann ich nachvollziehen. Aber wenn ich ([($4+[00:02])] in mein Szenario einfüge, werde ich mit Syntaxfehlern geflutet. Es ist immer die Klammersetzung, die mich fertig macht. Ich geb´s auf. Ich weiss weder, an welcher Stelle "meines Codes" ich das eingeben soll, noch wie. Als neues "if" oder als "elseif"? Für jemand, der in einer ganz anderen Branche arbeitet, kann das sehr frustrierend sein...

Gute Nacht

oelidoc

Damian

shutter_$1 {                                     ## DOIF Block
  if ([$3-$4]) {                                 ## innerhalb des Zeitfensters     
    if ([$2] eq "ein" and !$VAR{$1}) { ## Wenn der AlexaDummy eingeschaltet ist und die Rollläden noch nicht heruntergefahren wurden
      fhem_set("$5 $6");;                        ## Fenster herunterfahren
      set_State("Beschattung läuft");;       ## Status Befehl belegen
      $VAR{$1}=1;;                               ## Merker setzen, dass Fenster bereits heruntergefahren wurde
    } elsif ([$2] eq "aus" and $VAR{$1}) { ## Wenn der AlexaDummy ausgeschaltet ist und die Rollläden bereits heruntergefahren wurden
      fhem_set("$5 $7");;                        ## Fenster hochfahren
      set_State("Beschattung aus");; ## Status mit Befehl belegen
      $VAR{$1}=0;;                               ## Merker zurücksetzen
    }
  }

  if ([($4+[00:02])]) {             
    fhem_set("$5 $7");;
  }

} ## Ende shutter
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

oelidoc

Vielen Dank,
wenn ich
DEF TPL_shutter (    ## Definition des Templates namens TPL_shutter
## Parameternummer $1             $2           $3          $4          $5        $6                        $7
## Bedeutung       Name der Szene AlexaDummy   von Uhrzeit bis Uhrzeit Rollladen Befehl zum Herunterfahren Befehl zum Hochfahren
shutter_$1 {                                     ## DOIF Block
  if ([$3-$4]) {                                 ## innerhalb des Zeitfensters     
    if ([$2] eq "ein" and !$VAR{$1}) { ## Wenn der AlexaDummy eingeschaltet ist und die Rollläden noch nicht heruntergefahren wurden
      fhem_set("$5 $6");;                        ## Fenster herunterfahren
      set_State("Beschattung läuft");;       ## Status Befehl belegen
      $VAR{$1}=1;;                               ## Merker setzen, dass Fenster bereits heruntergefahren wurde
    } elsif ([$2] eq "aus" and $VAR{$1}) { ## Wenn der AlexaDummy ausgeschaltet ist und die Rollläden bereits heruntergefahren wurden
      fhem_set("$5 $7");;                        ## Fenster hochfahren
      set_State("Beschattung aus");; ## Status mit Befehl belegen
      $VAR{$1}=0;;                               ## Merker zurücksetzen
    }
  }

  if ([($4+[00:02])]) {             
    fhem_set("$5 $7");;
  }

} ## Ende shutter
)  ## Ende der Templatedefinition



reset {[00:01];;delete $VAR;;fhem_set"schatten aus";;}    ## DOIF-Block namens reset um nachts alle Merker zu löschen und
                                                          ##AlexaDummy auszuschalten

## Definition einzelner DOIF-Blöcke pro Fenstergruppe mit Hilfe des Templates
##           $1           $2       $3      $4    $5    $6   $7
TPL_shutter (Wohnzimmer,schatten,07:30,15:00,Jalousie3,pct 30,on)
TPL_shutter (Badezimmer,schatten,07:30,15:00,Jalousie4,pct 30,on)
TPL_shutter (Arbeitszimmer_gross,schatten,07:30,15:00,Jalousie5,pct 30,on)
TPL_shutter (Arbeitszimmer_klein,schatten,13:30,18:45,Jalousie6,pct 30,on)
TPL_shutter (Schlafzimmer_klein,schatten,13:30,18:45,Jalousie7,pct 15,on)
TPL_shutter (Schlafzimmer_gross,schatten,16:45,19:45,Jalousie8,pct 15,on)
TPL_shutter (Ankleidezimmer,schatten,16:45,19:16,Jalousie1,pct 25,on)
## hier können weitere Szenarien für weitere Fenster hinzugefügt werden
eingebe, kommt Readings
mode
enabled
2023-06-13 22:18:51
state
initialized
2023-06-13 22:18:51
timer_01_c01
14.06.2023 00:01:00
2023-06-13 22:18:51
timer_02_c02
14.06.2023 07:30:00
2023-06-13 22:18:51
timer_03_c02
14.06.2023 15:00:00
2023-06-13 22:18:51
timer_04_c02
error: syntax error at (eval 340654) line 1, near "15:"
2023-06-13 22:18:51
timer_05_c03
14.06.2023 07:30:00
2023-06-13 22:18:51
timer_06_c03
14.06.2023 15:00:00
2023-06-13 22:18:51
timer_07_c03
error: syntax error at (eval 340655) line 1, near "15:"
2023-06-13 22:18:51
timer_08_c04
14.06.2023 07:30:00
2023-06-13 22:18:51
timer_09_c04
14.06.2023 15:00:00
2023-06-13 22:18:51
timer_10_c04
error: syntax error at (eval 340656) line 1, near "15:"
2023-06-13 22:18:51
timer_11_c05
14.06.2023 13:30:00
2023-06-13 22:18:51
timer_12_c05
14.06.2023 18:45:00
2023-06-13 22:18:51
timer_13_c05
error: syntax error at (eval 340657) line 1, near "18:"
2023-06-13 22:18:51
timer_14_c06
14.06.2023 13:30:00
2023-06-13 22:18:51
timer_15_c06
14.06.2023 18:45:00
2023-06-13 22:18:51
timer_16_c06
error: syntax error at (eval 340658) line 1, near "18:"
2023-06-13 22:18:51
timer_17_c07
14.06.2023 16:45:00
2023-06-13 22:18:51
timer_18_c07
14.06.2023 19:45:00
2023-06-13 22:18:51
timer_19_c07
error: syntax error at (eval 340659) line 1, near "19:"
2023-06-13 22:18:51
timer_20_c08
14.06.2023 16:45:00
2023-06-13 22:18:51
timer_21_c08
14.06.2023 19:16:00
2023-06-13 22:18:51
timer_22_c08
error: syntax error at (eval 340660) line 1, near "19:"
2023-06-13 22:18:51

Und dann...?

Vielen Dank für deine Unermüdlichkeit

oelidoc


Damian

ich sehe, die Uhrzeit $4 ist ohne eckige Klammen angegeben, also muss die noch in eckige Klammern rein:

  if ([([$4]+[00:02])]) { 
Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF