Drucken
Stern inaktivStern inaktivStern inaktivStern inaktivStern inaktiv
 

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

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:

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

 

! 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);
Zugriffe: 2937