Meine Jalousie-Steuerung

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

Vorheriges Thema - Nächstes Thema

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