Meine Jalousie-Steuerung

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

Vorheriges Thema - Nächstes Thema

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