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

C0mmanda

Hallo,

da ich den Ansatz der Rolladensteuerung sehr interessant finde wollte ich das direkt mal "nachbauen".

Ich habe hier aber scheinbar noch Probleme mit dem Verständnis... (bin erst seit 1 Woche mit FHEM beschäftigt).
Ich konnte alles einbauen und da ich keine Fehlermeldungen bekomme scheint auch erstmal alles soweit zu stimmen.... nur es bewegt sich nichts!

Darum die Frage: WO genau wird denn jetzt mein Rolladen-Aktor übergeben?

Außerdem: Wozu benötige ich den dummy: EG_SZ_Jalousie ?

Und zu guter letzt:
In deinem Screenshot hast du die Eingreifmöglichkeiten in einer Zeile. ("Jalousie -> Offen -> Auto").
Bei mir ist das getrennt in zwei Zeilen. Eine Zeile für den dummy, eine Zeile für den Override.
Wie bekomme ich das in eine Zeile so wie auf dem Screenshot?

Ich hoffe du kannst einem Neuling etwas auf die Sprünge helfen... :)
Vielen Dank im voraus.

Icinger

Hi Commanda,

1) Das EG_SZ_Jalousiedummy ist nur für die Anzeige und das Dropdown zuständig.
2) In dem Notify ("ntf_EG_SZ_Jalousie"), welches auf Änderungen des Dummys reagiert, wird die Sub aufgerufen:
Fensteroeffner "EG_SZ_Fenstersensor_li","SZ_JalousieTaster",$r;}
Das zweite Argument hier ("SZ_JalousieTaster") ist in diesem Fall der Aktor.

Die beiden Dropdowns nebeneinander sind deshalb möglich, weil das ganze eine ReadingsGroup ist. (siehe http://fhem.de/commandref.html#readingsGroup)

Hoffe, die Infos helfen dir weiter, falls nicht, einfach nochmal fragen :)

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

C0mmanda

Vielen Dank, jetzt funktioniert es.
Hatte nicht verstanden dass dort im notify die Sub aufgerufen wird und wie das alles zusammenhängt.

Aufgrund des (noch) fehlenden Fenstersensors kann ich die Lüftungsoption allerdings noch nicht testen.
Über einen dummy (testweise) geht es nicht...

Werde mich dann zunächst mal mit der readingsGroup beschäftigen. Nach einem Blick ins Wiki ist mir jetzt erst klar wie mächtig die ist...

Versuche erst einmal das selbst hinzubekommen, im Zweifel melde ich mich nochmal :)

Vielen Dank soweit!

C0mmanda

Ich brauche nun doch noch einmal Hilfe...

Die Sache mit der readingsGroup habe ich hinbekommen ;)
Nun ist jedoch der Fenstersensor da (Homematic Drehgriffsensor) und ich habe alles eingebaut etc. doch es funktioniert nicht wie erwartet.

Solange das Fenster geschlossen ist kann ich die Rolladen ganz normal bewegen, sobald das Fenster jedoch "open" oder "tilted" meldet, kann ich die Rollade überhaupt nicht steuern! Weder auf noch ab oder in sonst eine Richtung.
Schliesse ich das Fenster wieder kann ich die Rolladen wieder steuern....

Ich würde mich freuen wenn sich das mal jemand ansehen kann und einen Tip hat, ich gehe schon seit 1.5Std die settings durch aber ich finde den Fehler einfach nicht.. :(

Hier mal die Configs:

Der Rolladen-Aktor heißt bei mir: "eg_KUE_Rolladen"
Der Fenstersensor heißt "eg_KUE_Fenstersensor"

Dummy Rolladen:


define eg_KUE_Rolladen1 dummy
attr eg_KUE_Rolladen1 alias Küche Rolladen
attr eg_KUE_Rolladen1 room Kueche
attr eg_KUE_Rolladen1 setList state:Offen,25,50,75,90,Zu
attr eg_KUE_Rolladen1 webCmd state


Dummy JalousieOverride

define KUERolladenOverride dummy
attr KUERolladenOverride alias RolladenOverride Küche
attr KUERolladenOverride devStateIcon Auto:fts_shutter_automatic .Skip:general_aus_fuer_zeit
attr KUERolladenOverride group Tueren_und_Fenster
attr KUERolladenOverride icon fts_shutter_manual
attr KUERolladenOverride room Home,Kueche
attr KUERolladenOverride setList state:Auto,05:00,05:30,06:00,06:30,07:00,07:30,08:00,08:30,09:00,09:30,10:00,10:30,11:00,11:30,Skip
attr KUERolladenOverride webCmd state


Das notify für den Rolladen:

define ntf_eg_KUE_Rolladen1 notify eg_KUE_Rolladen1:.* {my $r ;; my $dd = ReadingsVal("eg_KUE_Rolladen1","state","Offen");; \
                   if ($dd eq "Offen") {$r=0}  \
                   elsif ($dd eq "25") {$r=15}  \
                   elsif ($dd eq "50") {$r=30}  \
                   elsif ($dd eq "75") {$r=60}  \
                   elsif ($dd eq "90") {$r=70}  \
                   elsif ($dd eq "Zu") {$r=100} \
                   else {$r=$dd};;\
                   Fensteroeffner "eg_KUE_Fenstersensor","eg_KUE_Rolladen",$r;;}


Das notify für den Override:

define nft_KUERolladenOverride notify KUERolladenOverride { $a=Value("KUERolladenOverride");;\
                   fhem("set AutoJalousie enable");;\
                   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";;\
                       fhem "define Ja_On at +$time2 set AutoJalousie enable;;;;set KUERolladenOverride Auto"\
                       } else\
                       {\
                       $a =~ s/\./:/;;\
                       fhem "set AutoJalousie disable";;\
                           fhem "define Ja_On at $a set eg_KUE_Rolladen1 Offen;;;;set AutoJalousie enable;;;;set KUERolladenOverride Auto"\
                       }\
                    \
                   }\
                 }


Und die sub:

sub Fensteroeffner
{
    my $lastState="";
    my ( $fenstersensor, $taster, $option_param ,$force) = @_;
    my $curVal=int ReadingsVal($taster,"pct",0);
    my $halb=60;
my $curState=ReadingsVal($fenstersensor,"state","closed");
    $curState =~ s/tilted/open/g;
    Log 4,"Fensteroeffner - 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;
                  }
                }
        }
      }
    }
}



Die sub habe ich in die "99_myUtils.pm" eingehangen. Das ist doch korrekt? 

Vielen Dank schonmal im voraus! Stehe echt total auf dem Schlauch :(

Icinger

Kann ich mir am Wochenende gern ansehen, falls du bis dahin noch nicht weitergekommen bist.

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

C0mmanda

Das wäre sehr nett.
Unterdessen versuche ich es weiter :)

Bis jetzt bin ich soweit das ich den Rolladen steuern kann bei offenem Fenster. Allerdings werden nur Fahrten akzeptiert die über dem Wert "$halb" aus der sub liegt.

Außerdem passiert weiterhin nichts wenn der Rolladen geschlossen ist und ich das Fenster öffne.


Was ich bisher herausgefunden habe:
In deinen Codes oben, genauer in der sub ist meiner bescheidenen Meinung nach ein Typo:


            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;
            }


Ich denke es muss "defined heissen. es fehlt also ein e.
Geholfen hat es mir jedoch noch nicht ;) Ich bleib am Ball.....

C0mmanda

#21
Ich bin jetzt soweit dass die Steuerung funktioniert wie sie soll, mit Ausnahme der Rücksichtnahme auf den Fensterdrehgriff-Sensor, aber auch nur bedingt.

Soll heißen:

Steuerung hoch/runter etc. geht einwandfrei.
Ist das Fenster geöffnet und der Rolladen wird herunter gefahren stoppt der Rolladen an der definierten Position.

Aber:
Wird das Fenster dann geschlossen fährt der Rolladen nicht in die Endposition. Er bleibt auf der definierten "$halb" Position.
Ist der Rolladen komplett geschlossen und das Fenster wird geöffnet fährt der Rolladen nicht hoch in die definierte "$halb" Position.

Ich suche weiter, wäre für Unterstützung aber weiterhin empfänglich. (Wenn sich die Zeit findet natürlich :) )

Vielen Dank im voraus!

EDIT:
Ich habe das Gefühl das noch irgendein notify fehlt welches der sub mitteilt: Fenster-Drehgriff wurde geschlossen, fahre Rollade runter.
Oder eben auch "Fenster wurde geöffnet, Rolladen sind unten, fahre Rolladen auf $halb.

Damu

Hallo

Habe das Beispiel gelesen.
Scheint ziemlich kompliziert und durch durchdacht zu sein.
Hut ab.

Kann man hier alle Storen einzeln, mit anderen Zeiten
anwählen?
Oder gehen immer alle zusammen?

Icinger

Grundsätzlich hab ich das auf ein Fenster und eine Jalousie ausgelegt.

Wenn du die Notifys usw. mehrfach anlegst, kannst du das für jede Jalousie getrennt steuern.
Wenn du mehrere Jalousien gleichzeitig ansteuern willst, ists wohl am leichtesten, wenn du sie in einer Structure zusammenfasst.

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

Damu

Hallo

Ich hab das mal versucht umzusetzen.
Erhalte bein versuch die Store über den Dummy "Store_Schlafzimmer_Auto" zu steuern eine Fehlermeldung:

Zitat2015.09.08 23:00:18 3: [AutoStore] set AutoStore enable
2015.09.08 23:00:25 3: ntf_Store_Schlafzimmer return value: Unknown command my, try help.
Unknown command my, try help.
Unknown command if, try help.
Unknown command Fensteroeffner, try help.
Unknown command }
, try help.

In der conf hab ich folgendes (Mit Word Koppiert)
Zitatdefine Store_Schlafzimmer_Auto dummy
attr Store_Schlafzimmer_Auto room Store_Test
attr Store_Schlafzimmer_Auto setList state:Offen,25,50,75,90,Zu
attr Store_Schlafzimmer_Auto webCmd state

define StoreOverride dummy
attr StoreOverride room Store_Test
attr StoreOverride 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 StoreOverride webCmd state

define ntf_Store_Schlafzimmer notify Store_Schlafzimmer_Auto:.* my $r ;; my $dd = ReadingsVal("Store_Schlafzimmer_Auto","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 "SE_Fenster_Schlafzimmer","Store_Schlafzimmer",$r;;}\

attr ntf_Store_Schlafzimmer room Store_Test

define AutoStore WeekdayTimer Store_Schlafzimmer {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 Store_Schlafzimmer_Auto %")}
attr AutoStore room Store_Test

define nftStoreOverride notify StoreOverride { $a=Value("StoreOverride");;\
                   fhem("set AutoStore enable");;\
                   fhem("delete Ja_On") if (defined($defs{'Ja_On'}));;\
                   if ($a ne "Auto") {\
                       if($a eq "Skip") {\
                           my $diff=time_till_Reading(ReadingsVal("AutoStore","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 AutoStore disable";;\
                           fhem "define Ja_On at +$time2 set AutoStore enable;;;;set StoreOverride Auto"\
                       } else\
                       {\
                          $a =~ s/\./:/;;\
                          fhem "set AutoStore disable";;\
                          fhem "define Ja_On at $a set Store_Schlafzimmer Offen;;;;set AutoStore enable;;;;set StoreOverride Auto"\
                       }\
                         \
                   }\
                 }\

attr nftStoreOverride room Store_Test


Damu

#25
Hallo

Habe einen Fehler gefunden:
Habe eine Klammer vergessen:
Zitatdefine ntf_Store_Schlafzimmer notify Store_Schlafzimmer_Auto:.* my $r ;; my $dd = ReadingsVal("Store_Schlafzimmer_Auto","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 "SE_Fenster_Schlafzimmer","Store_Schlafzimmer",$r;;}\

Zitatdefine ntf_Store_Schlafzimmer notify Store_Schlafzimmer_Auto:.* {my $r ;; my $dd = ReadingsVal("Store_Schlafzimmer_Auto","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 "SE_Fenster_Schlafzimmer","Store_Schlafzimmer",$r;;}\

Bei geöffnetem Fenster, wenn ich die Store schliessen möchte.
Erhalte ich diese Meldung:
Zitatntf_Store_Schlafzimmer return value: Can't call method "defind" on an undefined value at ./FHEM/99_Fensteroeffner.pm line 17.

Das Store geht so auch nicht runter.

C0mmanda

Schau dir mal mein Posting an http://forum.fhem.de/index.php/topic,34782.msg322367.html#msg322367

Es muss defined heißen, Icinger hat einen typo in der Sub, dann sollte es gehen.

Damu

#27
Ja Danke das hab ich auch eben gesehen.
Wenn ich das Fenster offen habe und die Store über die Automatic schliese, geht Sie auf 50 runter.
Beim Fenster schliessen passiert aber gar nichts.
Habe ein HM Drehgriffkontackt an dieser Store.

Genau wie Du es oben beschrieben hast.

Icinger

Habe grade das fehlende Notify und den Typo im ersten Post ausgebessert.

Viel Spass damit,

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

Damu

#29
Erstmals vielen Dank.

Die Store geht bei mir aber trotzdem neuen zusätzlichen notify nicht runter wenn ich das Fenster schliese.

Muss aber mal ales kontrollieren, ob noch alles gleich ist.

Doch nach einem Neustart scheint es zu gehen.

Danke

Damu

#30
Ich habe hür die Fensterautomatik einen Dummy gemacht.
Ich möchte das das Fenster nur hochgeht bei eingeschaltetem Dummy.
Zitatdefine ntf_Schlafzimmerfenster notify EG_SZ_Fenstersensor_li:.* {Fensteroeffner "EG_SZ_Fenstersensor_li","SZ_JalousieTaster"}

Vereinfacht mal so
Zitatdefine ntf_Schlafzimmerfenster notify Store_Aut:on if EG_SZ_Fenstersensor_li:.* {Fensteroeffner "EG_SZ_Fenstersensor_li","SZ_JalousieTaster"}

Mit einem schaff ich das aber nicht.

Habe nun versucht das Notify in ein DOIF umzuwandeln
Zitatdefine ntf_Schlafzimmerfenster DOIF ([SE_Fenster_Schlafzimmer]) (Fensteroeffner SE_Fenster_Schlafzimmer,Store_Schlafzimmer)

Geht auch nicht


Zitatdefine ntf_Schlafzimmerfenster DOIF ([SE_Fenster_Schlafzimmer]) ({Fensteroeffner SE_Fenster_Schlafzimmer,Store_Schlafzimmer})

So geht es aber



Damu

Hallo

Ich hab eine Storre mal so Automatisiert.
Ich möchte aber das die Store auch hoch geht wenn Sie ganz unten ist und das Fenster geöffnet wird.
Meine Frau möchte das aber auch ausschalten können.
Nun wäre es am einfachsten die Sub so zu ergänzen das das "my $halb=60;"

Zitatsub Fensteroeffner
{
    my $lastState="";
    my ( $fenstersensor, $taster, $option_param ,$force) = @_;
    my $curVal=int ReadingsVal($taster,"pct",0);
    my $halb=60;
   my $curState=ReadingsVal($fenstersensor,"state","closed");
    $curState =~ s/tilted/open/g;
    Log 4,"Fensteroeffner - 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;
                     }
                }
           }   
         }
    }
}

In etwa so

Zitat
    my $lastState="";
    my ( $fenstersensor, $taster, $Dummyhalb, $option_param ,$force) = @_;
my $curVal=int ReadingsVal($taster,"pct",0);
    my $halb=ReadingsVal($Dummyhalb,"state",0);
Zitat

Geht aber nicht. Habe keine Ahnung von Programmierungen

Icinger

So klappts:


sub Fensteroeffner
{
    my $halb=60;
    my $lastState="";
    my ( $fenstersensor, $taster, $_halb, $option_param ,$force) = @_;
    my $curVal=int ReadingsVal($taster,"pct",0);
    $halb=$_halb if (defined $_halb);


Dann kannst du das in einem Notify zB so aufrufen:

define ntf_Schlafzimmerfenster notify EG_SZ_Fenstersensor_li:.* {Fensteroeffner "EG_SZ_Fenstersensor_li","SZ_JalousieTaster",ReadingsVal("FensterDummy","Position",60)}


Wobei dann der Wert aus einem Dummy kommt, das du selbst anlegen/setzen kannst.

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

Damu

Danke für die Antwort.
Ich suche einen Weg den Wert von
Zitatmy $halb=60;
mit einem Dummy zu ubergeben.
Die Sub sollte die $halb von einem Dummy lesen.
Wenn der Dummy 100 hat fährt dann die Storre beim Fensteröffnen immer hoch.
Wenn aber der Dummy auf 0 steht bleibt die Storre beim Fensteröffnen unten.
Ich meine
Zitat$halb=state Dummy

Icinger

Genau das macht doch die geänderte Sub oben.

Mit dem >>ReadingsVal("FensterDummy","Position",60)<< holt er sich die "Halb"-Position aus einem Dummy.

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

Damu

#35
Wenn aber meine Store nun bei 05 steht und ich das Fenster öffne, geht die Store auf 60 und beim schließen des Fensters wieder auf 05 runter.
$halb und $_halb ist schon richtig?

Icinger

Hallo, sorry, hatte überlesen, dass du das ja ganz ausschalten willst.

Dann machen wirs einfach so:

sub Fensteroeffner
{
    my $halb=60;
    my $lastState="";
    my ( $fenstersensor, $taster, $_halb, $option_param ,$force) = @_;
    my $curVal=int ReadingsVal($taster,"pct",0);
    $halb=$_halb if (defined $_halb);
   my $curState=ReadingsVal($fenstersensor,"state","closed");
    $curState =~ s/tilted/open/g;
    if (defined $option_param) {
        $curVal=$option_param;
        if($curState ne "closed")
        {
            if ($curVal <= $halb && $halb>=0)
            {
               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;
        if ($curVal=~ /^[+-]?\d+$/)
        {
           if($curState ne "closed")
           {   
               if ($curVal <= $halb && $halb>=0)
               {
                   readingsSingleUpdate($defs{$taster},"lastPCT",$curVal,0);
                   fhem "set $taster $halb",1;
               }
           } else
           {
                my $v2=ReadingsVal($taster,"lastPCT",0);
                if ($v2 ne "-1")
                {
                     if ($curVal == $halb && $halb>=0)
                     {
                       Log 4,"IsClosing";
                       readingsSingleUpdate($defs{$taster},"lastPCT",-1,0);
                       fhem "set $taster $v2",1;
                     }
                }
           }   
         }
    }
}


Wenn du jetzt den Dummy auf zB -1 (egal was, einfach kleiner als 0) setzt, ist die Hochfahr-Automatik ausgeschaltet.
Setzt du den Dummy auf einen anderen Wert, fährt der Rolladen einfach auf diesen Wert hin.

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

Damu

#37
Ich hab einen Dummy, mit dem ich öffnen und schliessen der Store beim Fensteroeffene ein und auschalten kann.
Das heist 0 ist aus und 99 ist voll ein, mit 50 schliesst die Store erst wenn Sie min 50 unten Steht.
Zitatdefine Aut_Fensteroeffner Dummy
attr Aut_Fensteroeffner devStateIcon 99:general_an@green 0:general_aus@red
attr Aut_Fensteroeffner room Store_Test
attr Aut_Fensteroeffner setList state:99,0,25,50,75
attr Aut_Fensteroeffner webCmd state

Dann den Auf-Zu Dummy für die Store:
Zitatdefine Store_Kinderzimmer_AZ dummy
attr Store_Kinderzimmer_AZ room Store_Kinderzimmer
attr Store_Kinderzimmer_AZ setList state:Offen,25,50,75,90,Zu
attr Store_Kinderzimmer_AZ webCmd state

Das Notify dazu:
Zitatdefine ntf_Store_Kinderzimmer notify Store_Kinderzimmer_AZ:.* {my $r ;; my $dd = ReadingsVal("Store_Kinderzimmer_AZ","state","Offen");;\
if ($dd eq "Offen") {$r=100}\
elsif ($dd eq "25") {$r=75}\
elsif ($dd eq "50") {$r=50}\
elsif ($dd eq "75") {$r=25}\
elsif ($dd eq "90") {$r=10}\
elsif ($dd eq "Zu") {$r=0}\
else {$r=$dd};;\
Fensteroeffner "SE_Fenster_Kinderzimmer","Store_Kinderzimmer",ReadingsVal("Aut_Fenstreoeffner","Position",100),$r;;}

Nun noch das Notify der die öffnung und schliesseng triggert:
Zitatdefine ntf_Kinderzimmerfenster notify SE_Fenster_Kinderzimmer:.* {Fensteroeffner "SE_Fenster_Kinderzimmer","Store_Kinderzimmer",ReadingsVal("Aut_Fensteroeffner","Position",100)}

Dann noch die Sub:
Zitatsub Fensteroeffner
{
   
    my $lastState="";
    my ( $fenstersensor_a, $taster_a, $aufab_a, $option_param_a ,$force_a) = @_;
    my $curVal=int ReadingsVal($taster_a,"pct",0);
       my $curState=ReadingsVal($fenstersensor_a,"state","closed");
    $curState =~ s/tilted/open/g;
    Log 4,"Fensteroeffner - Params: $fenstersensor_a, $taster_a, $aufab_a, $option_param_a, $force_a";
    if (defined $option_param_a) {
        $curVal=$option_param_a;
        if($curState ne "closed")
        {
            if ($curVal <= $aufab_a)
            {
               readingsSingleUpdate($defs{$taster_a},"lastPCT",$curVal,0);
                if (defined $force_a) { fhem "set $taster_a $option_param_a"; }
                              else { fhem "set $taster_a $aufab_a",1; }
            } else
            {
                readingsSingleUpdate($defs{$taster_a},"lastPCT",-1,0);
                fhem "set $taster_a $curVal",1;
            }
        } else {
            {
                readingsSingleUpdate($defs{$taster_a},"lastPCT",-1,0);
                fhem "set $taster_a $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 <= $aufab_a)
               {
                   readingsSingleUpdate($defs{$taster_a},"lastPCT",$curVal,0);
                   fhem "set $taster_a $aufab_a",1;
               }
           } else
           {
                my $v2=ReadingsVal($taster_a,"lastPCT",0);
                Log 4,"IsClosing v=$curVal, v2=$v2";
                if ($v2 ne "-1")
                {
                   Log 4,"NE zugetroffen";
                     if ($curVal == $aufab_a)
                     {
                       Log 4,"IsClosing";
                       readingsSingleUpdate($defs{$taster_a},"lastPCT",-1,0);
                       fhem "set $taster_a $v2",1;
                     }
                }
           }   
         }
    }
}

Geht bei meinen Tests
Das einzige was ich gesehen habe ist, das die Befehle beim öffnen der Store nehrmals gegeben werden.
Zitat2015.09.20 18:49:44 3: CUL_HM set Store_Kinderzimmer 75
2015.09.20 18:50:13 3: CUL_HM set Store_Kinderzimmer 100
2015.09.20 18:50:13 3: CUL_HM set Store_Kinderzimmer 100
2015.09.20 18:50:13 3: CUL_HM set Store_Kinderzimmer 100
2015.09.20 18:50:13 3: CUL_HM set Store_Kinderzimmer 100
2015.09.20 18:50:13 3: CUL_HM set Store_Kinderzimmer 100
2015.09.20 18:50:28 3: CUL_HM set Store_Kinderzimmer 75

Die neue Sub werde ich dann an der nächsten Store mal testen.

Kann ich eine sub für alle Storen brauchen, oder braucht jede Store eine eigene Sub?
$r und $dd müssen in einem anderen notify anders heisen?


pnewman

Hallo,

vielen Dank für dieses Beispiel einer Rolladensteuerung.

Auch ich würde diese Steuerung gerne mal testen.

Leider komme ich nicht so ganz mit der Umstellung auf meine Bedürfnisse zurecht.
Mein Rolladenaktor heisst: EG.ku.RA.re
Mein Fensterkontakt heisst: EG.ku.FKre1

Wie muss ich die sub ändern?
sub Fensteroeffner
{
    my ( $fenstersensor, $taster, $option_param ,$force) = @_;


Hier ist von $fenstersensor und $taster die Rede.

Gruß
Ralf
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung

C0mmanda

Die sub müsstest du überhaupt nicht ändern, nur das notify in dem die sub aufgerufen wird:

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;}


In der letzten Zeile wird die sub aufgerufen.
Du müsstest die Zeile ändern in

Fensteroeffner "EG.ku.FKre1","EG.ku.RA.re",$r;}

dann sollte es funktionieren.

pnewman

Vielen Dank für die schnelle Antwort.

Wenn ich es richtig verstanden habe hat der text in der SUB
$fenstersensor, $taster, $option_param ,$force
nichts mit der Nomenklatur meiner Aktoren und Sensoren zu tun.

Dann werde ich es in den nächsten Tagen ausprobieren.


Gruß
Ralf
Raspberry Pi3B+ / Nano-Cul 868 - MAX!=Heizung, HM-Lan - Rollo+Licht, JeeLink-Clone 868 - LaCrosse, JeeLink-Clone 868 - PCA301, CUL 434 - IT-Steckdosen+Fernbedienung

M-1978

Hallo zusammen,

nachdem die aufgezeigte Lösung ziemlich genau das ist was ich auch umsetzen will, habe ich mich daran auch mal versucht, allerdings scheitere ich bei dem Thema (Syntax) "Mittels dem Override kann ich die Öffnungsautomatik aber ausser kraft setzen".

Die nachfolgenden Meldungen erscheinen sowohl wenn ich diese das Notify in die Config direkt eintrage als auch per DEF

Unknown command fhem("attr, try help.
Unknown command fhem("delete, try help.
Unknown command if, try help.
Unknown command my, try help.
Unknown command my, try help.
Unknown command $time2=sprintf("%%02d:%%02d:%%02d",$t2->hours,$t2->minutes,$t2->seconds), try help.
Unknown command fhem, try help.
Unknown command fhem, try help.
Unknown command }, try help.

Im Prinzip heissen meine Aktoren wie folgt: (Homematic Rolladenaktoren, Homematic Fensterkontakte)
- EG_WZ_Rolladen_Terrassentuere
- EG_WZ_Fenstersensor_Terrassentuere
- EG_KU_Rolladen
- EG_KU_Fenstersensor_Terrassentuere

Testweise habe ich mir auch mal die Dummys Analog zu den verwendeten Geräte aus dem Beispiel angelegt, aber auch hier die gleiche Problematik.

Wäre klasse wenn mir einer auf die Sprünge helfen könnte

Icinger

Sieht für mich so aus, als ob du die öffnende Klammer vergessen hättest.

Bei mir lässt sich das genauso anlegen, wies im ersten Beitrag steht. Habs extra grad nochmal in der Testumgebung probiert.

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

M-1978

Hallo nochmal,

konnte das Notify mittlerweile anlegen, es hat tatsächlich die "öffnende" Klammer gefehlt, zudem hatte ich wohl beim kopieren irgendwas mit eingefügt was nicht dazu gehört, nach einer erneuten, "manuellen" Eingabe gabs keine Fehler.
Leider funktioniert das Thema "Lüftungsautomatik" nicht, hier gibt es keine Reaktion. Bin im Moment völlig Ratlos, an welchen Stellen muss ich meine entsprechenden Aktoren eintragen? zunächst erstmal die beiden nachfolgenden:

- EG_KU_Rolladen
- EG_KU_Fenstersensor

Würde mich nochmals über etwas Hilfe freuen

lg
Martin

Icinger

define ntf_Küchenfenster notify EG_KU_Fenstersensor:.* {Fensteroeffner "EG_KU_Fenstersensor","EG_KU_Rolladen"}

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

Damu

Hab meine Steuerung wieder gelöscht.
Meine Frau kam damit gar nicht zurecht.
Hat bei mir auch nicht immer funktioniert.
Probleme gibt es, wenn Mann das Fenster öffnet und gleich wieder schliesst.
Dann geht die Store hoch und bleibt oben.
Bei einem Neustart von fhem geht sie dann plötzlich runter.
Ich hab es auch nicht geschaft die Öffnungsautomatik sicher auszuschalten.
Zudem hatte ich im Log immer 5 x den selben Befehl.


jsloot

Hallo Icinger,

kannst du folgenden WeekdayTimer erklären? Mir ist
Zitatfhem("set EG_SZ_Jalousie %")
nicht ganz klar.

Zitat von: Icinger am 08 März 2015, 09:40:32
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 %")}

In den Logfiles sehe ich folgendes bei mir:

Zitat2016.01.05 17:15:00 4: [AutoJalousie] Update   - timer seems to be active today: 0123456|{sunset_abs(0,"17:00","17:15")}|Zu
2016.01.05 17:15:00 4: [AutoJalousie] device type CUL_HM:HM-LC-Bl1PBU-FM recognized, setModifier:
2016.01.05 17:15:00 4: [AutoJalousie] aktParam: newParam:Zu - is  not disabled
2016.01.05 17:15:00 4: [AutoJalousie] command: { fhem("set grWohnzimmer_lFenster_Rollo_dummy %")} executed
2016.01.05 17:15:00 4: dummy set grWohnzimmer_lFenster_Rollo_dummy %
2016.01.05 17:15:00 4: ntf_grWohnzimmer_lFenster_Rollo_dummy exec {my $r ;; my $dd = ReadingsVal("grWohnzimmer_lFenster_Rollo_dummy","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 "grWohnzimmer_lFenster","grWohnzimmer_lFenster_Rollo",$r;;}
2016.01.05 17:15:00 4: Fensteröffner - Params: grWohnzimmer_lFenster, grWohnzimmer_lFenster_Rollo, %,
2016.01.05 17:15:00 3: ntf_grWohnzimmer_lFenster_Rollo_dummy return value: Unknown argument %, choose one of assignHmKey clear:readings,trigger,register,oldRegs,rssi,msgEvents,attack,all deviceRename down fwUpdate getConfig getDevInfo getRegRaw getSerial getVersion inhibit:on,off off on pair pct:slider,0,1,100 peerBulk peerIODev press raw regBulk regSet reset sign:on,off statusRequest stop toggle toggleDir unpair up

Mach ich was falsch? Mein Dummy heisst bei mir grWohnzimmer_lFenster_Rollo_dummy, der Rolloaktor grWohnzimmer_lFenster_Rollo und der Fensterkontakt grWohnzimmer_lFenster.

Gruß Jörn
Ein FHEM-Raspi mit HM-CFG-USB-2. 9 HM Heizthermostate, 9 HM Temperatursensoren, 22 HM Fensterkontakte, 7 Rolloaktoren, 17 HM Unterputz-Aktoren

Icinger

Hi,

ist klar, seit dem Versionssprung auf .7 gibt es "%" nicht mehr, somit musst du den WeekdayTimer wie folgt ändern:

define AutoJalousie WeekdayTimer SZ_JalousieTaster  {sunset_abs(0,"17:00","22:00")}|90 Mo,Di,Mi,Do,Fr|{sunrise_abs(0,"05:30","06:00")}|Offen Sa,So|07:30|65 Sa,So|10:00|Offen { fhem("set grWohnzimmer_lFenster_Rollo $EVENT")}

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

Homalix99

Hallo,

bin vor kurzem auf die Jalousiesteuerung  gestoßen und finde das wirklich klasse, möchte dies aber etwas anders gestalten. Wenn nämlich ein skip ausgeführt werden soll, will ich nicht erst im Web auswählen, sondern ich steh vor der Tür bzw. dem Fenster mit dem Rollo und möchte fhem mittels kurzen Druck auf den HM Rollo-Aktor signalisieren, dass die Automatik einmalif ausgesetzt wird, soweit meine Idee. Nun habe ich zwei Fragen:
1. Was ist die time_till_Reading sub, die im nftJalousieOverride notify steht, wo finde ich die und berechnet diese die Differenzzeit zwischen now und next update?
2. Was macht
"fhem("delete Ja_On") if (defined($defs{'Ja_On'}));"  ?
, kenne ich so nicht.
Vielen Dank im voraus.

Gruß

Alex
- RPI 4 fhem in Docker, 2 x Arduino Uno, HM-GW, HM-Dev. (Fensterkontakte, HK-Thermostate, div. Aktoren), JeeLink,
- GPIOs, HM-LAN, ESPs (MQTT2)
-Überwachung Fenster/Türen/Licht, HK-Thermostatregelung, Rollosteuerung, Überw. Betriebstemperaturen Heizung, Erfassung Gas/Wasser, PV-Anl., Wetter (WS1600)

Icinger

Hi Homalix99,

1) Die time_till_reading macht genau das, was der Name schon sagt: Berechnet die bis zum nächsten Zeitpunkt, der in einem Reading steht.
     Du findest die in der 99_TimeUtils.pm (siehe http://forum.fhem.de/index.php/topic,14449.msg101224.html#msg101224

2) fhem("delete Ja_On") if (defined($defs{'Ja_On'})) löscht das bestehende at "Ja_On", aber eben nur, wenn es schon angelegt ist, ansonsten gäbs nen unschönen Fehler.

Das "mit kurzen Druck auf den HM Rollo-Aktor signalisieren, dass die Automatik einmalif ausgesetzt wird" könntest du durch ein zusätzliches notify auf den Aktor erreichen, in welchem du den letzten Stand und den aktuellen der Jalousie überprüfst. Wenn sich die Jalousie weniger als zB 5% oder so bewegt hat (also wirklich nur kurz gedrückt wurde), dann einfach ein "set JalousieOverride skip" ausführen.

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

Homalix99

Hallo Stefan,

also ich hab mir die 99_TimeUtils.pm in mein fhem mit reingeladen.
Dort ist eine sub namens 'TU_Get_Difference($time1,$time2)' drinnen, die mit Deiner time_till_Reading() nicht übereinstimmt (anderer Name, zwei Rückgabewerte [$succes,$result ] und keine Datumsübergreifende Zeitdifferenzberechnung).
1. Wo kann ich dann die Routine, die Du verwendest finden (sie ist auch nicht in der 99_Utils.pm drinnen). Fhem findet Deine Sub nicht
Zitat2016.01.07 18:50:26.250 3: ntf_Rollo_Taster_AZ return value: Undefined subroutine &main::time_till_Reading called at (eval 3672) line 30.

2. Wenn Du die zwei Zeiten übergibst müsste es statt:
my $diff=time_till_Reading(ReadingsVal("AutoJalousie","nextUpdate",localtime(time())));
doch so heißen:
my $diff=time_till_Reading(ReadingsVal("AutoJalousie","nextUpdate",""), localtime(time()));
oder liege ich da falsch?

3. Wen ich Deinen Sub-Aufruf gegen

my $res = true;
my $diff = "";
($res, $diff) =TU_Get_Difference(ReadingsVal("AutoJalousie_AZ","nextUpdate",""),localtime(time()));
if($res == false ) {
    Log 1, "Fehler Rückgabewert Timediff";
}

ersetze, kommen im weiteren Verlauf Fehler im Log, dass hours, minutes, etc. nicht gefunden werden. Habe ich da vergessen, irgend welche weiteren xx_Utils zu laden, oder was kann das sein?

lg

Alex

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"
                       }
                   
                   }
                 }
- RPI 4 fhem in Docker, 2 x Arduino Uno, HM-GW, HM-Dev. (Fensterkontakte, HK-Thermostate, div. Aktoren), JeeLink,
- GPIOs, HM-LAN, ESPs (MQTT2)
-Überwachung Fenster/Türen/Licht, HK-Thermostatregelung, Rollosteuerung, Überw. Betriebstemperaturen Heizung, Erfassung Gas/Wasser, PV-Anl., Wetter (WS1600)

Icinger

Hi,

hmmm, dass ich das selbst hinzugefügt habe? Kann mich zwar nimmer erinnern, wird aber wohl so sein 8)

Hier also mal die Sub:
sub time_till_Reading($) {
my ($mydatetime) = @_;
# Log 3,$mydatetime;
my ($mydate,$mytime) = split(" ",$mydatetime);
my ($myyear,$mymonth,$myday) = split(/\-/,$mydate);
my ($myhour,$myminute,$mysecond) = split(/:/,$mytime);
# Log 3,"$myyear - $mymonth - $myday - $myminute - $mysecond";
my $dt2 = DateTime->new(
                       year   => $myyear,
                       month  => $mymonth,
                       day    => $myday,
                       hour   => $myhour,
                       minute => $myminute,
                       second => $mysecond,
                     );
my $dt1 = DateTime->now();#time_zone => 'Europe/Vienna' );
$dt1 = $dt1->subtract_datetime($dt2);
#return $duration->hours().' Stunden '.$duration->minutes().' Minuten';
return $dt1;
}


Was auch noch geändert gehört, sind die Maskierungen in dem Notify, seit FHEM5.7 sind die hinfällig:
sprintf("%%02d:%%02d:%%02d",
gehört auf
sprintf("%02d:%02d:%02d",
geändert.
Verwende deine Zeit nicht mit Erklärungen. Die Menschen hören (lesen) nur, was sie hören (lesen) wollen. (c) Paulo Coelho

Homalix99

Hi,

ok, nachdem ich das Module DateTime nachinstallert habe und Deine Routine in die 99_MyUtils.pm kopiert hatte, sowie
use DateTime; angegeben habe,
kommt aber immer noch folgende Fehlermsg.


2016.01.07 21:35:12.981 3: ntf_Rollo_Taster_AZ return value: The 'hour' parameter ("Jan") to DateTime::new did not pass the 'an integer between 0 and 23' callback
at /usr/lib/perl5/DateTime.pm line 199
        DateTime::new(undef, 'year', 'Thu', 'month', undef, 'day', undef, 'hour', 'Jan', ...) called at ./FHEM/99_myUtils.pm line 531
        main::time_till_Reading('Thu Jan  7 21:35:12 2016') called at (eval 10348) line 30
        eval '{
fhem("attr AutoJalousie_AZ disable 0");
- RPI 4 fhem in Docker, 2 x Arduino Uno, HM-GW, HM-Dev. (Fensterkontakte, HK-Thermostate, div. Aktoren), JeeLink,
- GPIOs, HM-LAN, ESPs (MQTT2)
-Überwachung Fenster/Türen/Licht, HK-Thermostatregelung, Rollosteuerung, Überw. Betriebstemperaturen Heizung, Erfassung Gas/Wasser, PV-Anl., Wetter (WS1600)

Homalix99

Hallo Stefan,

also die Steuerung der Rollos funktioniert jetzt, hatte meine übergebenen Variablen versehentlich vertauscht und das attr. nextUpdate kommt halt mal nicht aus dem Aktor:-))
Nochmal vielen Dank für Deine Hilfe.
lg

Alex

PS: Das skip wird bei mir durch kurze Betätigung des Aktors in die "falsche Richtung" ausgelöst. Also z. B. Rollo oben, Druck auf up und im Dummy Rollo_Automatik signalisiert.
Ich habe die Steuerung eh komplett anders gelöst, habe also nur die Skip-Routine benötigt.
- RPI 4 fhem in Docker, 2 x Arduino Uno, HM-GW, HM-Dev. (Fensterkontakte, HK-Thermostate, div. Aktoren), JeeLink,
- GPIOs, HM-LAN, ESPs (MQTT2)
-Überwachung Fenster/Türen/Licht, HK-Thermostatregelung, Rollosteuerung, Überw. Betriebstemperaturen Heizung, Erfassung Gas/Wasser, PV-Anl., Wetter (WS1600)

Icinger

Na, das hört man gerne, freut mich, dass ich helfen konnte.

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