Stern inaktivStern inaktivStern inaktivStern inaktivStern inaktiv
 

Herausforderung: insgesamt 7 Jalousien mit einem 6-fach Funktaster steuern:

  • zwei von den sieben Jalousien sollen parallel (wie eine) angesteuert werden
  • sechs Jalousien solle separat steuerbar sein
  • jede der sechs Tasten steht für eine Jalousie
  • kurzer Tastendruck fährt die Jalousie nach unten, wenn sie oben ist, nach oben, wenn sie unten ist, und ansonsten in die Gegenrichtung zur zuletzt genutzten Fahrtrichtung
  • falls die Jalousie aktuell noch fährt, wird sie gestoppt
  • sechs weitere lange Tastendrücke können mit Funktionen wie "alle Jalousien hoch", "alle Jalousien runter" belegt werden

Homematic-Programm:

Wenn-Bedingung geht auf eine ODER-Verknüpfung von allen sechs Tasten, sowohl kurz als auch langer Tastendruck, und DANN wird das unten angegebene Script gestartet:

Wichtig: die Namen der Kanäle müssen EXAKT in dem Format "Taste x yyy" vorliegen, wobei x die Ziffer 1 bis 6 ist und den Tasten 1 bis 6 auf dem Taster entspricht.

Programmlogik:

  • über das $src$-Objekt die Taste herausfinden, die das Programm getriggert hat (welche Taste und ob es ein kurzer oder langer Tastendruck war)
  • die zugeordnete Jalousie und die vorherige Fahrtrichtung ermitteln
  • kurzer Tastendruck:
    • wenn die Jalousie noch fährt, dann stoppen
    • wenn die Jalousie oben (oder fast oben) ist, dann herunterfahren
    • wenn die Jalousie unten (oder fast unten) ist, dann hochfahren
    • ansonsten die Jalousie in die Gegenrichtung zur letzten Fahrtrichtung fahren
  • langer Tastendruck:
    • in dieser Version noch nicht implementiert

     

Konfiguration: Die Zeichenkette "BlindList" muss sechs mit Semikolon getrennte Konfigurationen haben (für jede Taste der Fernbedienung eine):

  • kann entweder leer sein = es passiert nichts beim entsprechenden Tastendruck
  • oder Angabe eines oder mehrere mit Komma getrennter Namen von Jalousieaktoren (alle werden dann gleichzeitig angesteuert)

 

! React to different devices' PRESS_SHORT and PRESS_LONG events

! Check if called by a real event. Exit, if not.
var source = dom.GetObject("$src$");
if (!source) { quit; }

! determine source channel ("Taste 6 WOZI") and datapoint names ("PRESS_LONG")
string src_channel = dom.GetObject((source.Channel())).Name();
string src_dp=source.Name().StrValueByIndex(".",2);
! if ((src_dp<>"PRESS_SHORT") && (src_dp<>"PRESS_LONG")) { quit; }

string BlindList =
  "Jalousie WOZI Terrasse 1,Jalousie WOZI Terrasse 2;" #
  ";" #
  ";" #
  ";" #
  "Jalousie WOZI Freisitz 1;" #
  "Jalousie WOZI Freisitz 2";
  
! if (src_channel.Substr(0,6) <> "Taste ") { quit; }
integer key_num = src_channel.Substr(6,1).ToInteger();

string PrevDirVarName = "Jal_" # (key_num.ToString()) # "_PrevDir";
object PrevDirVar = dom.GetObject(PrevDirVarName);
integer PrevDir;
if (!PrevDirVar) { PrevDir = 1; PrevDirVar.State(1); } else { PrevDir = PrevDirVar.Value(); }

string BlindName;
object Blind;
boolean Working;
real Direction;
object LevelObj;
real Level;

foreach (BlindName, BlindList.StrValueByIndex(";",key_num-1).Split(",")) {
  Blind = dom.GetObject(BlindName);

  if (src_dp == "PRESS_SHORT") {
    ! Working: herausfinden, ob die Jalousie gerade läuft
    Working = Blind.DPByHssDP("WORKING").State();

    if (Working) {
    
      ! Direction: 0=NONE, 1=UP, 2=DOWN, 3=UNDEFINED
      Direction = Blind.DPByHssDP("DIRECTION").Value();

      Blind.DPByHssDP("STOP").State(1);

      if ((Direction <> 1.0) && (Direction <> 2.0)) { Direction = 2.0; }
      PrevDirVar.State(Direction);

    } else { ! Not Working
      
      LevelObj = Blind.DPByHssDP("LEVEL");
      Level = LevelObj.State();

      if ((Level >= 0.9) || (PrevDir == 1)) {
        LevelObj.State(0.0);
        PrevDirVar.State(2);

      } else {
        if ((Level <= 0.1) || (PrevDir == 2)) {
          LevelObj.State(1.0);
          PrevDirVar.State(1);
          
        } else {
          LevelObj.State(0.0);
          PrevDirVar.State(2);
        }
      }
    }
  }
}

 

Ergänzung: falls sich bei zwei parallel gesteuerten Jalousien durch den Zeitversatz der Schaltsignale unterschiedliche Endpositionen ergeben, lässt sich das mit folgendem Script korrigieren. Einfach mit z. B. 30 Sekunden Verzögerung nach dem Tastendruck starten:

! set Blind2 to Blind1 Level if not working and if different
string Jalousie1Name = "Jalousie WOZI Terrasse 1";
object Jalousie1 = dom.GetObject(Jalousie1Name);
if (!Jalousie1) { quit; }
boolean Working = Jalousie1.DPByHssDP("WORKING").State();
if (Working) { quit; }
real Level1 = Jalousie1.DPByHssDP("LEVEL").Value();

string Jalousie2Name = "Jalousie WOZI Terrasse 2";
object Jalousie2 = dom.GetObject(Jalousie2Name);
if (!Jalousie2) { quit; }
real Level2 = Jalousie2.DPByHssDP("LEVEL").Value();

if (Level1 == Level2) { quit; }

Jalousie2.DPByHssDP("LEVEL").State(Level1);