Meine Jalousie-Steuerung

Begonnen von Icinger, 08 März 2015, 09:40:32

Vorheriges Thema - Nächstes Thema

Icinger

Da immer wieder mal nach Ideen für eine Jalousie-Steuerung gesucht wird, hier mal mein Ansatz:

Durch die sehr flexible Automatik wird der Hoch/Runter-Taster bei uns eigentlich so gut wie nie verwendet.
Meine Fenster sind mit Rolladenmotor, Homematik-Rolladenaktor und Homematic Fenstergriff-Sensor ausgestattet.

Zunächst mal die Eingreif-Möglichkeiten von der Weboberfläche:
(http://forum.fhem.de/index.php?action=dlattach;topic=34782.0;attach=28956;image)

Einerseits kann ich die Öffnung einstellen (Offen, 25%, 50%, 75%, 90%, Zu), andererseits die Öffnungsautomatik overrulen:

define EG_SZ_Jalousie dummy
attr EG_SZ_Jalousie setlist state:Offen,25,50,75,90,Zu
attr EG_SZ_Jalousie webcmd state

define JalousieOverride dummy
attr JalousieOverride setlist state:Auto,04:00,04:30,05:00,05:30,06:00,06:30,07:00,07:30,08:00,08:30,09:00,09:30,Skip
attr JalousieOverride webcmd state


Nachdem die Prozentwerte nicht 1:1 mit den Werten des Rolladenaktors übereinstimmen, wandle ich die im notify um:
define ntf_EG_SZ_Jalousie notify EG_SZ_Jalousie:.* {my $r ; my $dd = ReadingsVal("EG_SZ_Jalousie","state","Offen");
                   if ($dd eq "Offen") {$r=100} 
                   elsif ($dd eq "25") {$r=80} 
                   elsif ($dd eq "50") {$r=64} 
                   elsif ($dd eq "75") {$r=42} 
                   elsif ($dd eq "90") {$r=17} 
                   elsif ($dd eq "Zu") {$r=0}
                   else {$r=$dd};
                   Fensteroeffner "EG_SZ_Fenstersensor_li","SZ_JalousieTaster",$r;}

Zu der Sub Fensteroeffner komme ich nachher noch, die kommt noch öfters vor.

Ausserdem noch ein Notify, welches auf den Drehgriff triggert:
define ntf_Schlafzimmerfenster notify EG_SZ_Fenstersensor_li:.* {Fensteroeffner "EG_SZ_Fenstersensor_li","SZ_JalousieTaster"}
Normalerweise öffnet und schließt die Jalousie automatisch mit einem Weekday-Timer:
define AutoJalousie WeekdayTimer SZ_JalousieTaster {sunset_abs(0,"17:00","22:00")}|Zu Mo,Di,Mi,Do,Fr|{sunrise_abs(0,"04:00","06:00")}|Offen Sa,So|07:30|65 { fhem("set EG_SZ_Jalousie %")}

Mittels dem Override kann ich die Öffnungsautomatik aber ausser kraft setzen:
define nftJalousieOverride JalousieOverride { $a=Value("JalousieOverride");
                   fhem("attr AutoJalousie disable 0");
                   fhem("delete Ja_On") if (defined($defs{'Ja_On'}));
                   if ($a ne "Auto") {
                       if($a eq "Skip") {
                           my $diff=time_till_Reading(ReadingsVal("AutoJalousie","nextUpdate",localtime(time())));
                           my $time2=sprintf("%%02d:%%02d:%%02d",$diff->hours,$diff->minutes,$diff->seconds);
                           my $t2=$diff->add(minutes     => -2);
                           $time2=sprintf("%%02d:%%02d:%%02d",$t2->hours,$t2->minutes,$t2->seconds);
                           fhem "attr AutoJalousie disable 1";
                       fhem "define Ja_On at +$time2 attr AutoJalousie disable 0;;set JalousieOverride Auto"
                       } else
                       {
                       $a =~ s/\./:/;
                       fhem "attr AutoJalousie disable 1";
                           fhem "define Ja_On at $a set EG_SZ_Jalousie Offen;;attr AutoJalousie disable 0;;set JalousieOverride Auto"
                       }
                   
                   }
                 }

Hier wird:
       1) Bei Auswahl von "Auto" ein evtl. bestehendes Override wieder entfernt
       2) Bei Auswahl einer Uhrzeit die Automatik einmalig ausgeschaltet und ein at definiert, welches zur ausgewählten Uhrzeit die Jalousie öffnet
       3) Bei Auswahl von "Skip" einmalig die Öffnung übersprungen

Würd ich jetzt oben im ntf_EG_SZ_Jalousie das Sub "Fensteroeffner" durch ein "set EG_SZ_Schlafzimmer $r" ersetzen, würde die Jalousie immer schön brav hoch- und runterfahren, ohne Rücksicht auf den Drehgriff-Sensor.

Da ich diesen aber auch berücksichtigen will, habe ich noch ein wenig Logik in die Sub eingebaut:
Lüftungsmodus :
1) Wenn die Jalousie unter 50% ist, und das Fenster gekippt/geöffnet WIRD, fährt die J. auf 50% hoch und speichert die vorherige Position.
2) Wenn Fenster gekippt/geöffnet IST und die Automatik greift, wird max. zur Hälfte runtergefahren und die gewünschte Position gespeichert.
3) Wenn dann später das Fenster geschlossen wird, wird die angepeilte Position endgültig angefahren.

Hier nun die dazugehörige Sub:
sub Fensteroeffner
{
    my ( $fenstersensor, $taster, $option_param ,$force) = @_;
    my $curVal=int ReadingsVal($taster,"pct",0);
    my $halb=54;
my $curState=ReadingsVal($fenstersensor,"state","closed");
    $curState =~ s/tilted/open/g;
    Log 4,"Fensteröffner - Params: $fenstersensor, $taster, $option_param, $force";
    if (defined $option_param) {
        $curVal=$option_param;
        if($curState ne "closed")
        {
            if ($curVal <= $halb)
            {
            readingsSingleUpdate($defs{$taster},"lastPCT",$curVal,0);
                if (defined $force) { fhem "set $taster $option_param"; }
                              else { fhem "set $taster $halb",1; }
            } else
            {
                readingsSingleUpdate($defs{$taster},"lastPCT",-1,0);
                fhem "set $taster $curVal",1;
            }
        } else {
            {
                readingsSingleUpdate($defs{$taster},"lastPCT",-1,0);
                fhem "set $taster $curVal",1;
            }
        }
    } else {
        return 0 if ($lastState eq $curState);
        $lastState=$curState;
        Log 4,"Undefine pct.. v=$curVal";
        if ($curVal=~ /^[+-]?\d+$/)
        {
        if($curState ne "closed")
        {
                Log 4,"IsOpening v=$curVal";
            if ($curVal <= $halb)
            {
                readingsSingleUpdate($defs{$taster},"lastPCT",$curVal,0);
                fhem "set $taster $halb",1;
            }
        } else
        {
          my $v2=ReadingsVal($taster,"lastPCT",0);
                Log 4,"IsClosing v=$curVal, v2=$v2";
                if ($v2 ne "-1")
                {
                Log 4,"NE zugetroffen";
                  if ($curVal == $halb)
                  {
                    Log 4,"IsClosing";
                    readingsSingleUpdate($defs{$taster},"lastPCT",-1,0);
                    fhem "set $taster $v2",1;
                  }
                }
        }
      }
    }
}


Übergeben wird hier:
1) Der Drehgriff-Sensor
2) Der Jalousie-Aktor
3) Optional: eine gewünschte Position
4) Optional: Force.....Damit wird die Logik ausser Kraft gesetzt und die gewünschte Position angefahren, ohne auf den Drehgriff Rücksicht zu nehmen. (Wert ist egal, es wird nur auf "defined" geprüft)

So, ich hoffe, ich habe nichts vergessen....
Was noch kommt: Da unser Schlafzimmer südseitig liegt, möchte ich im Sommer abhängig von Aussen/Innentemp sowie Sonneneinstrahlung die Jalousie auch tagsüber schließen, um am Nachmittag das SZ nicht allzusehr aufheizen.

Vielleicht hilft mein Ansatz ja dem einen oder anderen.

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Hollo

Zitat von: Icinger am 08 März 2015, 09:40:32
...Vielleicht hilft mein Ansatz ja dem einen oder anderen.
Auf jeden Fall, vielen Dank.

Derzeit habe ich nur im Bad einen Rohrmotor mit Rolloaktor; die anderen Räume haben noch elektrische Gurtwickler.
Das hat allerdings den Vorteil der Beschattung bei Sonne. Da sucher ich noch nach einer Möglichkeit, dass für fhem abzugreifen.
Da ich im Dachgeschoss wohne, fahre ich die Jalousien nur bei ganz warm oder ganz kalt; sonst bleiben die oben.
Insofern müsste man den Override noch um ein AUS erweitern.

Ich habe die Rollolaufzeit für "ganz offen bis ganz zu (wegen SommerSonnenHitzeEinstrahlung) gemessen.
Dementsprechend passen die 50% natürlich nicht und Deine Umrechnung ist dafür die Lösung. Baue ich ein  ;D


Deine Override-Prozedur sehe ich bei mir gerade noch ganz woanders...
die werde ich mal in meine Musik-Weck-Funktion einbauen.
Derzeit habe ich da nur Zeitauswahl und aktiv/deaktiviert, da ist Deins komfortabler und sicherer (man kann das Wiedereinschalten nicht vergessen).

Gruß,
Hollo
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Icinger

Dasu "Aus" ist ja ganz schnell integriert:

define nftJalousieOverride JalousieOverride { $a=Value("JalousieOverride");
                   fhem("attr AutoJalousie disable 0");
                   fhem("delete Ja_On") if (defined($defs{'Ja_On'}));
                   if ($a ne "Auto") {
                       if($a eq "Skip") {
                           my $diff=time_till_Reading(ReadingsVal("AutoJalousie","nextUpdate",localtime(time())));
                           my $time2=sprintf("%%02d:%%02d:%%02d",$diff->hours,$diff->minutes,$diff->seconds);
                           my $t2=$diff->add(minutes     => -2);
                           $time2=sprintf("%%02d:%%02d:%%02d",$t2->hours,$t2->minutes,$t2->seconds);
                           fhem "attr AutoJalousie disable 1";
                       fhem "define Ja_On at +$time2 attr AutoJalousie disable 0;;set JalousieOverride Auto"
                       } elsif ($a eq "Aus")
                      {
                           fhem "attr AutoJalousie disable 1";
                       } else
                       {
                       $a =~ s/\./:/;
                       fhem "attr AutoJalousie disable 1";
                           fhem "define Ja_On at $a set EG_SZ_Jalousie Offen;;attr AutoJalousie disable 0;;set JalousieOverride Auto"
                       }
                   
                   }
                 }{


lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

DJAlex

Könnte man den Aussperrschutz hier irgendiwe integrieren?
http://forum.fhem.de/index.php/topic,34848.0.html

Ansonsten find ich das echt super muss das heute gleich ausprobieren.

Icinger

Grundsätzlich ist hier schon ein Aussperrschutz integriert, da - wenn Fenster offen oder gekippt - die Jalousie nur auf 50% fährt und erst beim schließen des Fensters ganz runter fährt.

Die 50% sind in der Sub als "my $halb=54;" hinterlegt.

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Hollo

Ich bekomme das irgendwie noch nicht (testweise) umgesetzt.
Das "Override" funktioniert doch als Notify, oder irre ich mich da?
Irgendwie passt da die Syntax mit Klammern etc. nicht; oder ich bin gerade auf dem völlig falschen Weg.
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Icinger

Stimmt, ist ein Notify.

1) hab ich hier define nftJalousieOverride notify JalousieOverride blablabla das "notify" vergessen.

2) Aufpassen: Meine Codes nicht einfach in die config kopieren, sondern direkt in der Def bearbeiten!
Ansonsten müssts eigentlich passen, ich hab die direkt auf meinem funktionierendem System rauskopiert.

lg, Ici
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Hollo

Mein Fehler lag dann woanders...

Ich habe für meine Weck-Funktion keinen "Jalousie-Taster", sondern setze direkt den HomeStatus um.
Das hatte ich im Override-Notify falsch umgesetzt und deshalb passte das nicht.   ???
Dazu dann zwischendurch mal ein reread und schon ist ein temporäres at und disable weg; das übliche halt.   ;D

Jetzt scheint alles zu passen...
MusikWecker mit festgelegtem Wochenprofil inkl. variablen Einzeltagen; was man aus einer Jalousiesteuerung so machen kann.
Habe die Möglichkeiten mal in 1 Screenshot angehängt.

Vielen Dank für Deinen Beispiel-Code.

P.S.:  jetzt muss ich das nur mal für mein Badezimmer-Rollo einbauen
 
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

Icinger

Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Hollo

Kleine Ergänzung:

Mit dem aktuellen Stand des WeekDayTimer kann/sollte?/muss? man das disable/enable per set-Kommando durchführen.

statt attr AutoJalousie disable 1 also set AutoJalousie disable
und
statt attr AutoJalousie disable 0 also set AutoJalousie enable
FHEM 6.x auf RPi 3B Buster
Protokolle: Homematic, Z-Wave, MQTT, Modbus
Temp/Feuchte: JeeLink-Clone und LGW mit LaCrosse/IT
sonstiges: Linux-Server, Dreambox, "RSS-Tablet"

kvo1

Hi Ici,

danke für die sehr gute Beschreibung und das Du dies hier zur Verfügung stellst (bin eher per Zufall darauf gestoßen)

gruss
kvo1
RPi1: mit CUL: HM-CC-RT-DN,HM-ES-PMSw1-Pl,HM-LC-BL1-FM,HM-LC-Bl1PBU-FM,HM-LC-SW1-PL2,HM-SCI-3-FM,HM-SEC-SC-2,KFM-Sensor
RPi2: Viessmann(optolink) mit 99_VCONTROL.pm,
Cubietruck: Wheezy / Apache / Owncloud
Cubietruck: Armbian(Jessie) / fhem 5.7 / LMS 7.9
RPi3: (Test) mit 7" Touch  &  HM-MOD-RPI-PCB

DJAlex

Hab des jetzt mal getestet und krieg diese Fehlermeldung.

Weiß einer woran das liegen kann?

Global symbol "$lastState" requires explicit package name at ./FHEM/99_Fensteroeffner.pm line 44.
Global symbol "$lastState" requires explicit package name at ./FHEM/99_Fensteroeffner.pm line 45.

Puschel74

#12
Zitat von: DJAlex am 23 Juli 2015, 15:04:49
Weiß einer woran das liegen kann?
*Glaskugelpolier*
Vermutlich an einem Fehler im Code.
Leider hab ich das letzte Longtimeupgrade für meine Glaskugel nicht bezahlt oder du hast vergessen den verwendeten Code zu posten.

IdR genügt es VOR die Variable ein my zu schreiben - das aber nur ganz grob ins Blaue geraten.

Edith: Ich hab die sub aus dem 1. Beitrag mal mit meinen nicht vorhandenen Perl-Kenntnissen in Notepad++ angeschaut und die Variable $lastState wird meiner bescheidenen Ahnung nach nicht deklariert.
Oder sie wird in der 99_Utils.pm mir our deklariert, ich hab mir jetzt nicht alles durchgelesen.
Ein
my $lastState="";
irgendwo am Anfang der sub mit anschliessendem
reload 99_Fensteroeffner.pm
sollte Abhilfe schaffen.
Wenn du einen anderen Code genommen hast war meine Mühe umsonst  ;)
P.S.: Es kann auch sein das das .pm am Schluss weggelassen werden kann/muss.

Edith2: Warum hast nur du das Problem  ???
Ich werd mir doch alles durchlesen müssen  :-\
Zotac BI323 als Server mit DBLog
CUNO für FHT80B, 3 HM-Lan per vCCU, RasPi mit CUL433 für Somfy-Rollo (F2F), RasPi mit I2C(LM75) (F2F), RasPi für Panstamp+Vegetronix +SONOS(F2F)
Ich beantworte keine Supportanfragen per PM! Bitte im Forum suchen oder einen Beitrag erstellen.

DJAlex

#13
Super genaue das wars.

Jetzt hab ich mal die hälfte am laufen.

Jetzt bleibt noch folgendes Problem.

Steuere ich den Rolladen funktioniert alles super.
Öffne ich aber das Fenster tut sich nix, also der Rolladen fährt nicht hoch.

Die Lüftungsautomatik funktioniert also nur halb.
Diese Funktion geht nicht.
1) Wenn die Jalousie unter 50% ist, und das Fenster gekippt/geöffnet WIRD, fährt die J. auf 50% hoch und speichert die vorherige Position.

Fehlt da nicht irgendwo das notify das den Fenstersensor überwacht?


Hier mal meine Dummys:

define EG_SZ_Jalousie dummy
attr EG_SZ_Jalousie room Test Jalo
attr EG_SZ_Jalousie setList state:Offen,25,50,75,90,Zu
attr EG_SZ_Jalousie webCmd state
define JalousieOverride dummy


attr JalousieOverride room Test Jalo
attr JalousieOverride setList state:Auto,04:00,04:30,05:00,05:30,06:00,06:30,07:00,07:30,08:00,08:30,09:00,09:30,Skip,Aus
attr JalousieOverride webCmd state


Die notify's:

define ntf_EG_SZ_Jalousie notify EG_SZ_Jalousie:.* {my $r ;; my $dd = ReadingsVal("EG_SZ_Jalousie","state","Offen");; \
                   if ($dd eq "Offen") {$r=100}  \
                   elsif ($dd eq "25") {$r=80}  \
                   elsif ($dd eq "50") {$r=64}  \
                   elsif ($dd eq "75") {$r=42}  \
                   elsif ($dd eq "90") {$r=17}  \
                   elsif ($dd eq "Zu") {$r=0} \
                   else {$r=$dd};;\
                   Fensteroeffner "FensterWohnzimmer","RolloWohnzimmer",$r;;}
attr ntf_EG_SZ_Jalousie room Test Jalo


define AutoJalousie WeekdayTimer RolloWohnzimmer {sunset_abs(0,"17:00","22:00")}|Zu Mo,Di,Mi,Do,Fr|{sunrise_abs(0,"04:00","06:00")}|Offen Sa,So|07:30|65 { fhem("set EG_SZ_Jalousie %")}
attr AutoJalousie disable 1
attr AutoJalousie room Test Jalo


define nftJalousieOverride notify JalousieOverride { $a=Value("JalousieOverride");;\
                   fhem("set AutoJalousie disable 0");;\
                   fhem("delete Ja_On") if (defined($defs{'Ja_On'}));;\
                   if ($a ne "Auto") {\
                       if($a eq "Skip") {\
                           my $diff=time_till_Reading(ReadingsVal("AutoJalousie","nextUpdate",localtime(time())));;\
                           my $time2=sprintf("%%02d:%%02d:%%02d",$diff->hours,$diff->minutes,$diff->seconds);;\
                           my $t2=$diff->add(minutes     => -2);;\
                           $time2=sprintf("%%02d:%%02d:%%02d",$t2->hours,$t2->minutes,$t2->seconds);;\
                           fhem "set AutoJalousie disable 1";;\
                       fhem "define Ja_On at +$time2 attr AutoJalousie disable 0;;;;set JalousieOverride Auto"\
                       } elsif ($a eq "Aus") \
                      {\
                           fhem "set AutoJalousie disable 1";;\
                       } else\
                       {\
                       $a =~ s/\./:/;;\
                       fhem "set AutoJalousie disable 1";;\
                           fhem "define Ja_On at $a set EG_SZ_Jalousie Offen;;;;attr AutoJalousie disable 0;;;;set JalousieOverride Auto"\
                       }\
                    \
                   }\
                 }
attr nftJalousieOverride room Test Jalo


Und hier meine Sub:


sub Fensteroeffner
{
    my ( $fenstersensor, $taster, $option_param ,$force) = @_;
    my $curVal=int ReadingsVal($taster,"pct",0);
    my $halb=54;
    my $curState=ReadingsVal($fenstersensor,"state","closed");
    my $lastState="";
    $curState =~ s/tilted/open/g;
    Log 4,"Fensteröffner - Params: $fenstersensor, $taster, $option_param, $force";
    if (defined $option_param) {
        $curVal=$option_param;
        if($curState ne "closed")
        {
            if ($curVal <= $halb)
            {
            readingsSingleUpdate($defs{$taster},"lastPCT",$curVal,0);
                if (defind $force) { fhem "set $taster $option_param"; }
                              else { fhem "set $taster $halb",1; }
            } else
            {
                readingsSingleUpdate($defs{$taster},"lastPCT",-1,0);
                fhem "set $taster $curVal",1;
            }
        } else {
            {
                readingsSingleUpdate($defs{$taster},"lastPCT",-1,0);
                fhem "set $taster $curVal",1;
            }
        }
    } else {
        return 0 if ($lastState eq $curState);
        $lastState=$curState;
        Log 4,"Undefine pct.. v=$curVal";
        if ($curVal=~ /^[+-]?\d+$/)
        {
        if($curState ne "closed")
        {
                Log 4,"IsOpening v=$curVal";
            if ($curVal <= $halb)
            {
                readingsSingleUpdate($defs{$taster},"lastPCT",$curVal,0);
                fhem "set $taster $halb",1;
            }
        } else
        {
          my $v2=ReadingsVal($taster,"lastPCT",0);
                Log 4,"IsClosing v=$curVal, v2=$v2";
                if ($v2 ne "-1")
                {
                Log 4,"NE zugetroffen";
                  if ($curVal == $halb)
                  {
                    Log 4,"IsClosing";
                    readingsSingleUpdate($defs{$taster},"lastPCT",-1,0);
                    fhem "set $taster $v2",1;
                  }
                }
        }
      }
    }
}

DJAlex

#14
Habs hinbekommen hatte nen Tippfehler drin.

Ich würde gerne auf die Drei Stati des Fensterkontaktes verschiedene höhen legen. Also Tilted 50% open 100% hab schon versucht die If abfragen zu kopieren leider ohne erfolg könnt Ihr mir nen Tip geben wie ich das mache. Hab mit Perl nicht so

Grüße

Alex