Jalousiescript - Beta-Version (2)

Problemlösungen und Hinweise von allgemeinem Interesse zur Haussteuerung mit HomeMatic

Moderator: Co-Administratoren

Antworten
teddy278

Jalousiescript - Beta-Version (2)

Beitrag von teddy278 » 09.04.2010, 20:58

Dieser Beitrag wurde durch den Autor entfernt.
Zuletzt geändert von teddy278 am 12.06.2011, 01:10, insgesamt 2-mal geändert.

Benutzeravatar
kaju74
Beiträge: 2050
Registriert: 06.03.2007, 13:14
Danksagung erhalten: 19 Mal
Kontaktdaten:

Re: Jalousiescript - Beta-Version

Beitrag von kaju74 » 12.04.2010, 13:09

Hallo.

VIelen teddy - klingt nach einem sehr sinnvollen Skript :D :D :D Habe gerade daheim das Problem, dass die
Rolläden nicht so fahren, wie sie eigentlich sollten....werde es asap mal ausprobieren. Und wie immer: Ich
nehm's mal in meine Lib auf, und ja: es kann sich jeder anschauen ohne anzumelden :wink:

Gruß,
- kaju

teddy278

Re: Jalousiescript - Beta-Version

Beitrag von teddy278 » 12.04.2010, 16:19

Dieser Beitrag wurde durch den Autor entfernt.
Zuletzt geändert von teddy278 am 12.06.2011, 01:10, insgesamt 1-mal geändert.

Benutzeravatar
kaju74
Beiträge: 2050
Registriert: 06.03.2007, 13:14
Danksagung erhalten: 19 Mal
Kontaktdaten:

Re: Jalousiescript - Beta-Version

Beitrag von kaju74 » 12.04.2010, 17:02

konsequent um 14 Uhr runter, obwohl es erst 3 Stunden später da hell wird.
Wo lebst DU denn?? Polarkreis?

mmg
Beiträge: 86
Registriert: 04.11.2009, 11:04

Re: Jalousiescript - Beta-Version

Beitrag von mmg » 12.04.2010, 17:10

Ich tippe eher auf Fenster in Richtung Nord-West :roll:

Grüße
Marc
Wo kämen wir denn hin, wenn alle sagten "Wo kämen wir denn hin" und niemand ginge um zu sehen, wohin wir kämen, wenn wir gingen!?!

Rechtschreibfehler sind durchaus beabsichtigt und Ausdruck meiner Kreativität.

teddy278

Re: Jalousiescript - Beta-Version

Beitrag von teddy278 » 12.04.2010, 22:41

Dieser Beitrag wurde durch den Autor entfernt.
Zuletzt geändert von teddy278 am 12.06.2011, 01:10, insgesamt 1-mal geändert.

teddy278

Re: Jalousiescript - Beta-Version (2)

Beitrag von teddy278 » 19.04.2010, 18:46

Dieser Beitrag wurde durch den Autor entfernt.

Benutzeravatar
anli
Beiträge: 4326
Registriert: 10.06.2009, 14:01
Wohnort: 20 Min. nördlich von Hannover und bei Bremen
Hat sich bedankt: 1 Mal
Danksagung erhalten: 23 Mal
Kontaktdaten:

Re: Jalousiescript - Beta-Version (2)

Beitrag von anli » 16.06.2011, 10:15

Hallo.
teddy278 hat geschrieben:Hallo allerseits,

nachdem ich meinen Jalousien Antriebe verpaßt hatte, wollte ich natürlich auch die Sonne aussperren. Problem: 6 Fenster in 3 Himmelsrichtungen auf 3 Ebenen mit schattenspendenden Bäumen und Nachbarhäusern, und eine Wetterstation, bei der Helligkeit "20" düsterstes Regenwetter bedeuten kann oder eklige Blendung beim Fernsehen.

Änderungen in Beta2 sind mit "Beta2" unten im Text eingefügt.

Also habe ich mal ein kleines Script programmiert ... Die Funktion ist folgende: Das Script "merkt" sich, welche Jalousien bei welcher Helligkeit zu welcher Uhrzeit "offen" oder "geschlossen" sein sollen, und das macht es dann nach. Die Daten werden gespeichert, wenn man auf einen Fernbedienungsknopf drückt (Anlernfunktion). Sommer/Winterzeit sollten egal sein. Und wenn ich die Jalousien zum Schlafen zumache, soll Ruhe herrschen. Uff!

Beta2: Keine Interpolation mehr: Wenn keine Daten zur Verfügung stehen, bewegt das Script die Jalousien nicht.

Voraussetzungen:

- Kombisensor für die Helligkeit
- Funk-Jalousieaktoren
- irgendeine freie Taste auf einer Fernbedienung (Beta2: Fernbedienung nicht mehr zwingend erforderlich)

Installation:

Man erstellt ein WebUI-Programm, das so aussieht:

Unter "Wenn" alles im ersten Block und alles mit "oder" verknüpft:

- der Kombisensor: bei Helligkeit >= 0 bei Aktualisierung (also immer, wenn das Ding was sendet - alle ca. 2,5 Minuten)
- die Jalousien: Bedingung egal, wichtig: "nur prüfen" (löst das Script also nie aus, muß aber vorhanden sein - die Kanäle, die hier angegeben sind, werden vom Script bearbeitet; Beta2: wenn hier "bei Aktualisierung" ausgewählt wird, lernt das Script automatisch - näheres unten)
- die Taste: irgendeine Fernbedienung bei "Tastendruck" oder "Tastendruck lang" (damit lernt man dann die Positionen an).

Unten abgeschnitten kommt noch folgendes:

... und als Script:

Code: Alles auswählen

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !    Script zur Protokollierung der    !
    ! Jalousie-Stellungen bei Sonnenschein !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !          (c) 2010 teddy278           !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


    !!!!!!!!!!!!!!!!!!!!!!!!
    ! DEBUG INITIALISIEREN !
    !!!!!!!!!!!!!!!!!!!!!!!!

    ! Systemvariable
    ! Name: "..debug"
    ! Typ: String

    object o_debug=dom.GetObject ("..debug");

    string s_debug = "debug" # "\r" # "start " # system.Date("%H:%M:%S") # "\r";


    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ! BASISWERTE INITIALISIEREN !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    real c_zeit =
      ((1.0 / 60) * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger();
    real c_tagesbeginn =
      ((1.0 / 60) * system.SunriseTime("%M").ToInteger()) + system.SunriseTime("%H").ToInteger();
    real c_tagesende =
      ((1.0 / 60) * system.SunsetTime("%M").ToInteger()) + system.SunsetTime("%H").ToInteger();
    real c_mittag = 
      0.5 * (c_tagesbeginn + c_tagesende);
    real c_timestamp =
      c_zeit - c_mittag;

    s_debug = s_debug # "timestamp: " # c_timestamp # "\r";

    real r_threshold = 0.7;

    !!!!!!!!!!!!!!!!!!
    ! OBJEKTE SUCHEN !
    !!!!!!!!!!!!!!!!!!

    string s_blinds = "";
    string s_weather = "";

    object o_prg = dom.GetObject($this$);
    integer i_count = 0;
    object o_chn;
    object o_dp =
      dom.GetObject(o_prg.Rule().RuleCondition(0).CndSingleCondition(i_count).LeftVal());
    while (o_dp) {
      o_chn = dom.GetObject(o_dp.Channel());
      if (o_chn.HssType() == "WEATHER") {
        s_weather = o_chn.Address();
      }
      if (o_chn.HssType() == "BLIND") {
        s_blinds = s_blinds # o_chn.Address() # "\t";
      }
      i_count = i_count + 1;
      o_dp =
        dom.GetObject(o_prg.Rule().RuleCondition(0).CndSingleCondition(i_count).LeftVal());
    } ! Geräte suchen


    !!!!!!!!!!!!!!!!!!!!!!
    ! PROGRAMM AUSFÜHREN !
    !!!!!!!!!!!!!!!!!!!!!!


    object o_quelle = dom.GetObject ("$src$");

    ! Programm wird nur ausgeführt, wenn es von einem Objekt aufgerufen wurde

    if (o_quelle) {

      object o_kanal = dom.GetObject(o_quelle.Channel());

      ! Update = Programm wird von Taste oder Aktor aufgerufen
      ! Key = Programm wird von Taste aufgerufen

      boolean key = (o_kanal.HssType() == "KEY");
      boolean update = ((o_kanal.HssType() == "BLIND") || key);

      if ((update) && (!key)) {
        s_blinds = o_kanal.Address();
      }

      s_debug = s_debug # "Update: " # update # "\r";
      s_debug = s_debug # "Key: " # key # "\r";

      ! Wetterdaten auswählen

      object o_kanal = dom.GetObject ("BidCos-RF." # s_weather # ".BRIGHTNESS");
      if (o_kanal.Value() > o_kanal.LastValue()) {
        integer i_brightness_high = o_kanal.Value();
        integer i_brightness_low = o_kanal.LastValue();
      } else {
        integer i_brightness_high = o_kanal.LastValue();
        integer i_brightness_low = o_kanal.Value();
      }

      s_debug = s_debug # "Brightness high " # i_brightness_high # "\r";
      s_debug = s_debug # "Brightness low " # i_brightness_low # "\r";


      ! durch Jalousien iterieren

      string idx_blinds;
      foreach (idx_blinds, s_blinds) {

        s_debug = s_debug # "\r" # "Work on " # idx_blinds # "\r";

        ! Daten der Jalousie einlesen

        object o_level = dom.GetObject ("BidCos-RF." # idx_blinds # ".LEVEL");
        object o_working = dom.GetObject ("BidCos-RF." # idx_blinds # ".WORKING");
        object o_kanal = dom.GetObject (o_level.Channel());

        s_debug = s_debug # "Kanal " # o_kanal.Name() # "\r";
        s_debug = s_debug # "Level: " # o_level.Value() # "\r";
        s_debug = s_debug # "Working: " # o_working.Value() # "\r";

        ! Basiswerte für die Jalousie initialisieren

        boolean b_open = false;
        boolean b_close = false;
        boolean b_opened = (o_level.Value() > r_threshold) && ((o_level.Value() < 1.0) || (key));
        boolean b_closed = (o_level.Value() > 0.0) && (o_level.Value() < r_threshold);

        ! Werteliste erstellen, wenn noch nicht vorhanden

        string s_list = o_kanal.Name() # ".Steuerung";
        object o_list = dom.GetObject (s_list);
        if (!o_list) {
          s_debug = s_debug # s_list # " erstellen\r";
          string s_uniquename;
          object o_SysVars = dom.GetObject (ID_SYSTEM_VARIABLES);
          if ((o_SysVars) && (dom.CheckName (s_list, &s_uniquename, ID_SYSTEM_VARIABLES))) {
            o_list = dom.CreateObject (OT_VARDP);
            o_list.Name (s_list);
            o_SysVars.Add (o_list.ID());
            o_list.DPInfo ("");
            o_list.ValueType (ivtString);
            o_list.ValueSubType (istGeneric);
            o_list.State("");
          }
        } ! Liste erstellen

        s_debug = s_debug # s_list # ": " # o_list.Value() # "\r";

        ! Liste abarbeiten

        string idx_list;
        integer i_separator;
        integer i_bright_temp;
        real r_time_temp;
        string s_list_open = "";
        string s_list_close = "";
        string s_list_temp = "";
        boolean b_list_update = false;

        integer i_open = 0;
        integer i_close = 256;

        real r_lastclose = -255.0;

        foreach (idx_list, o_list.Value()) {
          i_separator = idx_list.Find (":");
          if (i_separator < 0) {
            r_lastclose = idx_list.ToFloat();
            if (r_lastclose > c_timestamp) {
              r_lastclose = c_timestamp;
              b_list_update = true;
            }
          } else {
            r_time_temp = idx_list.Substr (0, i_separator).ToFloat();
            i_bright_temp = idx_list.Substr (i_separator + 1, idx_list.Length() - i_separator - 1).ToInteger();
            if (!update) {
              if (i_bright_temp == 1) {
                i_bright_temp = i_brightness_low;
                r_time_temp = c_timestamp;
                b_list_update = true;
                s_debug = s_debug # "new brightness value " # i_bright_temp # "\r";
              }
              if (i_bright_temp == -254) {
                i_bright_temp = -1 * i_brightness_high;
                r_time_temp = c_timestamp;
                b_list_update = true;
                s_debug = s_debug # "new brightness value " # i_bright_temp # "\r";
              }
            }
            if ((0.25 * (r_time_temp * 4).ToInteger()) == (0.25 * (c_timestamp * 4).ToInteger())) {
              if (i_bright_temp > 1) {
                i_open = i_bright_temp;
                s_list_open = r_time_temp # ":" # i_bright_temp # "\t";
              }
              if (i_bright_temp < 1) {
                i_close = -1 * i_bright_temp;
                s_list_close = r_time_temp # ":" # i_bright_temp # "\t";
              }
            } else {
              s_list_temp = s_list_temp # r_time_temp # ":" # i_bright_temp # "\t";
            }
          } ! if i_seperator > 0
        } ! for idx_list

        s_debug = s_debug # "r_lastclose " # r_lastclose # "\r";
        s_debug = s_debug # "s_list_temp " # s_list_temp # "\r";
        s_debug = s_debug # "s_list_open " # s_list_open # "\r";
        s_debug = s_debug # "s_list_close " # s_list_close # "\r";

        ! Öffnen oder schließen

        b_open = (i_brightness_low <= i_open);
        s_debug = s_debug # "open " # i_brightness_low # " <= " # i_open # ": " # b_open # "\r";
        b_close = (i_brightness_high >= i_close);
        s_debug = s_debug # "close " # i_brightness_high # " >= " # i_close # ": " # b_close # "\r";

        ! bereinigen

        if (b_open && b_close) {
          s_list_open = "";
          s_list_close = "";
          b_open = false;
          b_close = false;
          s_debug = s_debug # "conflict - remove all values\r";
        }

        ! Werteliste aktualisieren

        if ((update) && (!o_working.Value())) {
          if ((b_closed) && (!b_close)) {
            s_list_close = c_timestamp # ":-254" # "\t";
            b_list_update = true;
            s_debug = s_debug # "add new value to close list\r";
            if (b_open) {
              s_list_open = "";
              s_debug = s_debug # "remove conflicting value from open list\r";
           }
          }
          if ((b_opened) && (!b_open)) {
            s_list_open = c_timestamp # ":1" # "\t";
            b_list_update = true;
            s_debug = s_debug # "add new value to open list\r";
            if (b_close) {
              s_list_close = "";
              s_debug = s_debug # "remove conflicting value from close list\r";
           }
          }
        }   

        s_list_temp = s_list_temp # s_list_close # s_list_open;
        s_debug = s_debug # "adding open/close lists\r";


        ! Jalousien bewegen, wenn NICHT gelernt wurde und die Jalousie
        ! nicht vollständig geschlossen ist

        if ((!update) && (o_level.Value() != 0.0)) {

          ! anderer Timestamp...

          time t_timestamp = o_level.Timestamp();
          time t_now = system.Date("%Y-%m-%d %H:%M:%S").ToTime();
          integer i_diff = t_now.ToInteger() - t_timestamp.ToInteger();

          if ((b_close) && (!b_open) && (o_level.Value() != 0.4) && (i_diff > 1800)) {
            s_debug = s_debug # "closing blind\r";
            o_level.State(0.4);
            b_closed = true;
          }
          if ((b_open) && (!b_close) && (o_level.Value() != 1.0) && (i_diff > 2700) &&
            (c_timestamp > r_lastclose + 0.25)) {
            s_debug = s_debug # "opening blind\r";
            o_level.State(1.0);
          }
        }

        if ((b_closed) && (b_close)) {
          b_list_update = true;
          r_lastclose = c_timestamp;
          s_debug = s_debug # "update r_lastclose\r";
        }

        s_list_temp = r_lastclose # "\t" # s_list_temp;

        ! Werteliste aktualisieren

        if (b_list_update) {
          o_list.State (s_list_temp);
          s_debug = s_debug # "save list\r";
        }
        s_debug = s_debug # s_list # ": " # o_list.Value() # "\r";

      } ! Jalousien bearbeiten

    }


    !!!!!!!!!!!!!!!!!!!!!!
    ! DEBUG ABSCHLIESSEN !
    !!!!!!!!!!!!!!!!!!!!!!

    s_debug = s_debug # "\rdone " # system.Date("%H:%M:%S") # "\r";
    if (o_debug) {
      o_debug.State (s_debug);
    }

Was macht das Script?

Direkt nach Eingabe erstmal - gar nichts. Wenn dann der Kombisensor das erste Mal das Script anstößt, wird für jede Jalousie eine Zeichenketten-Systemvariable angelegt, in der später die Werte gespeichert werden. Ebenso, wenn man die Anlerntaste drückt.

Beta2: Wenn man - bevor der Kombisensor anspringt - eine der Jalousien bewegt, und diese auf "Aktualisierung" stehen, wird für die betreffende Jalousie ebenfalls eine Variable angelegt.

Jetzt geht's los: Immer, wenn die Jalousien irgendwie falsch stehen, einfach die Jalousien in die richtige Position fahren und die Anlerntaste der Fernbedienung drücken. Immer, wenn die Jalousien gerade alle richtig stehen und man dran denkt, kann man auch draufdrücken. ;)

Beta2: Wenn bei den Jalousien "bei Aktualisierung" ausgewählt wird, dann wird automatisch die Korrektur angelernt. Beispiel: Es ist hell, also fährt man die Jalousie runter -> Script merkt sich "bei Helligkeit x oder heller soll Jalousie y runtergefahren werden".

Das Script merkt sich die Positionen und lernt daraus, wann man es wo gerne abgedunkelt haben möchte. Nicht wundern: Am Anfang macht das Script ziemlichen Blödsinn und fährt die Jalousien gerne mal zu früh runter oder gar nicht oder zu spät. In so einem Fall: Jalousien korrigieren, Anlerntaste drücken. Es braucht mindestens ein paar Tage Sonne und ein paar Tage Wolken, bis es halbwegs geht.

Beta2: Der Blödsinn hat sich jetzt stark verringert, weil das Programm nicht mehr interpoliert. Andererseits muß man nun natürlich für jeden Schaltzeitpunkt die Jalousie anlernen. Das ist nur bei wechselndem Wetter ein Problem - wenn von morgens bis abends die Sonne scheint, reichen eigentlich zwei Punkte (einmal hoch, einmal runter). Sofern man für den ersten Punkt früh genug aufsteht.

Beta2: Das Script unterscheidet zwischen Anlernen über Anlerntaste und automatischem Anlernen. Beim Anlernen über die Anlerntaste gilt: geschlossen = 0% < x < 70%, offen = 70% < x <= 100%. Beim automatischen Anlernen fast genauso: geschlossen = 0% < x < 70%, offen 70% < x < 100%. Also: komplett geschlossen wird nie als "geschlossen" gelernt, komplett geöffnet wird als "offen" gelernt, wenn man über die Anlerntaste lernt, und der Grenzwert liegt immer 70%.

Beim Antrieb wird diverse Trägheit eingerechnet, beispielsweise muß es mindestens 15 Minuten am Stück "nicht sonnig" sein, bevor die Jalousien wieder aufgehen. Vorbeiziehende Wolken: kein Problem. (Beta2: An der Stelle muß ich nochmal drüber nachdenken :)). Wenn die Jalousien komplett geschlossen sind, werden sie vom Script ignoriert. Mittagsschlaf: kein Problem. In jedem Fall wartet das Script mindestens 30 Minuten, bevor Jalousien geschlossen werden, und 45 vor dem Öffnen, damit der Motor nicht heißläuft. Kurzes Sonnenbad: kein Problem.

Das war's in Kürze - würde mich freuen, wenn das jemand mal mit austestet. Das Script ist unter 1.403 leidlich getestet, ich lerne noch an. ;) Wäre interessiert, ob es auch unter anderen Versionen funktioniert.

Ach ja, eins noch: Wenn man eine Zeichenkette "..debug" anlegt, speichert das Script dort ab, was es tut. Auf jeden Fall hilfreich bei der Fehlersuche.


Grüße!
teddy
Danke!

Eventuell benötigen einige von Euch die debug-Funktion nicht (aufgrund exzessiver String-Benutzung kann die CCU stehen bleiben) - daher hier mal obiges Skript angepasst (Debug-Funktion an- und abschaltbar gemacht (b_debug = true/false;)):

Code: Alles auswählen

    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !    Script zur Protokollierung der    !
    ! Jalousie-Stellungen bei Sonnenschein !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    !          (c) 2010 teddy278           !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!


    !!!!!!!!!!!!!!!!!!!!!!!!
    ! DEBUG INITIALISIEREN !
    !!!!!!!!!!!!!!!!!!!!!!!!

    ! Debug aktiv: boolean b_debug = true;
    ! Debug inaktiv: boolean b_debug = false;
    ! Nur im Notfall aktivieren, da intensive String-Verarbeitung die CCU lahmlegen kann
    boolean b_debug = false;

    ! Systemvariable
    ! Name: "..debug"
    ! Typ: String

    object o_debug=dom.GetObject ("..debug");

    string s_debug = "";
    if (b_debug) {
        s_debug = "debug" # "\r" # "start " # system.Date("%H:%M:%S") # "\r";
    }


    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ! BASISWERTE INITIALISIEREN !
    !!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    real c_zeit =
      ((1.0 / 60) * system.Date("%M").ToInteger()) + system.Date("%H").ToInteger();
    real c_tagesbeginn =
      ((1.0 / 60) * system.SunriseTime("%M").ToInteger()) + system.SunriseTime("%H").ToInteger();
    real c_tagesende =
      ((1.0 / 60) * system.SunsetTime("%M").ToInteger()) + system.SunsetTime("%H").ToInteger();
    real c_mittag = 
      0.5 * (c_tagesbeginn + c_tagesende);
    real c_timestamp =
      c_zeit - c_mittag;

    if (b_debug) {
        s_debug = s_debug # "timestamp: " # c_timestamp # "\r";
    }

    real r_threshold = 0.7;

    !!!!!!!!!!!!!!!!!!
    ! OBJEKTE SUCHEN !
    !!!!!!!!!!!!!!!!!!

    string s_blinds = "";
    string s_weather = "";

    object o_prg = dom.GetObject($this$);
    integer i_count = 0;
    object o_chn;
    object o_dp =
      dom.GetObject(o_prg.Rule().RuleCondition(0).CndSingleCondition(i_count).LeftVal());
    while (o_dp) {
      o_chn = dom.GetObject(o_dp.Channel());
      if (o_chn.HssType() == "WEATHER") {
        s_weather = o_chn.Address();
      }
      if (o_chn.HssType() == "BLIND") {
        s_blinds = s_blinds # o_chn.Address() # "\t";
      }
      i_count = i_count + 1;
      o_dp =
        dom.GetObject(o_prg.Rule().RuleCondition(0).CndSingleCondition(i_count).LeftVal());
    } ! Geräte suchen


    !!!!!!!!!!!!!!!!!!!!!!
    ! PROGRAMM AUSFÜHREN !
    !!!!!!!!!!!!!!!!!!!!!!


    object o_quelle = dom.GetObject ("$src$");

    ! Programm wird nur ausgeführt, wenn es von einem Objekt aufgerufen wurde

    if (o_quelle) {

      object o_kanal = dom.GetObject(o_quelle.Channel());

      ! Update = Programm wird von Taste oder Aktor aufgerufen
      ! Key = Programm wird von Taste aufgerufen

      boolean key = (o_kanal.HssType() == "KEY");
      boolean update = ((o_kanal.HssType() == "BLIND") || key);

      if ((update) && (!key)) {
        s_blinds = o_kanal.Address();
      }

      if (b_debug) {
        s_debug = s_debug # "Update: " # update # "\r";
        s_debug = s_debug # "Key: " # key # "\r";
      }

      ! Wetterdaten auswählen

      object o_kanal = dom.GetObject ("BidCos-RF." # s_weather # ".BRIGHTNESS");
      if (o_kanal.Value() > o_kanal.LastValue()) {
        integer i_brightness_high = o_kanal.Value();
        integer i_brightness_low = o_kanal.LastValue();
      } else {
        integer i_brightness_high = o_kanal.LastValue();
        integer i_brightness_low = o_kanal.Value();
      }

      if (b_debug) {
        s_debug = s_debug # "Brightness high " # i_brightness_high # "\r";
        s_debug = s_debug # "Brightness low " # i_brightness_low # "\r";
      }


      ! durch Jalousien iterieren

      string idx_blinds;
      foreach (idx_blinds, s_blinds) {

        if (b_debug) {
           s_debug = s_debug # "\r" # "Work on " # idx_blinds # "\r";
        }

        ! Daten der Jalousie einlesen

        object o_level = dom.GetObject ("BidCos-RF." # idx_blinds # ".LEVEL");
        object o_working = dom.GetObject ("BidCos-RF." # idx_blinds # ".WORKING");
        object o_kanal = dom.GetObject (o_level.Channel());

        if (b_debug) {
           s_debug = s_debug # "Kanal " # o_kanal.Name() # "\r";
           s_debug = s_debug # "Level: " # o_level.Value() # "\r";
           s_debug = s_debug # "Working: " # o_working.Value() # "\r";
        }

        ! Basiswerte für die Jalousie initialisieren

        boolean b_open = false;
        boolean b_close = false;
        boolean b_opened = (o_level.Value() > r_threshold) && ((o_level.Value() < 1.0) || (key));
        boolean b_closed = (o_level.Value() > 0.0) && (o_level.Value() < r_threshold);

        ! Werteliste erstellen, wenn noch nicht vorhanden

        string s_list = o_kanal.Name() # ".Steuerung";
        object o_list = dom.GetObject (s_list);
        if (!o_list) {
          if (b_debug) {
             s_debug = s_debug # s_list # " erstellen\r";
          }
          string s_uniquename;
          object o_SysVars = dom.GetObject (ID_SYSTEM_VARIABLES);
          if ((o_SysVars) && (dom.CheckName (s_list, &s_uniquename, ID_SYSTEM_VARIABLES))) {
            o_list = dom.CreateObject (OT_VARDP);
            o_list.Name (s_list);
            o_SysVars.Add (o_list.ID());
            o_list.DPInfo ("");
            o_list.ValueType (ivtString);
            o_list.ValueSubType (istGeneric);
            o_list.State("");
          }
        } ! Liste erstellen

        if (b_debug) {
           s_debug = s_debug # s_list # ": " # o_list.Value() # "\r";
        }

        ! Liste abarbeiten

        string idx_list;
        integer i_separator;
        integer i_bright_temp;
        real r_time_temp;
        string s_list_open = "";
        string s_list_close = "";
        string s_list_temp = "";
        boolean b_list_update = false;

        integer i_open = 0;
        integer i_close = 256;

        real r_lastclose = -255.0;

        foreach (idx_list, o_list.Value()) {
          i_separator = idx_list.Find (":");
          if (i_separator < 0) {
            r_lastclose = idx_list.ToFloat();
            if (r_lastclose > c_timestamp) {
              r_lastclose = c_timestamp;
              b_list_update = true;
            }
          } else {
            r_time_temp = idx_list.Substr (0, i_separator).ToFloat();
            i_bright_temp = idx_list.Substr (i_separator + 1, idx_list.Length() - i_separator - 1).ToInteger();
            if (!update) {
              if (i_bright_temp == 1) {
                i_bright_temp = i_brightness_low;
                r_time_temp = c_timestamp;
                b_list_update = true;
                if (b_debug) {
                    s_debug = s_debug # "new brightness value " # i_bright_temp # "\r";
                }
              }
              if (i_bright_temp == -254) {
                i_bright_temp = -1 * i_brightness_high;
                r_time_temp = c_timestamp;
                b_list_update = true;
                if (b_debug) {
                    s_debug = s_debug # "new brightness value " # i_bright_temp # "\r";
                }
              }
            }
            if ((0.25 * (r_time_temp * 4).ToInteger()) == (0.25 * (c_timestamp * 4).ToInteger())) {
              if (i_bright_temp > 1) {
                i_open = i_bright_temp;
                s_list_open = r_time_temp # ":" # i_bright_temp # "\t";
              }
              if (i_bright_temp < 1) {
                i_close = -1 * i_bright_temp;
                s_list_close = r_time_temp # ":" # i_bright_temp # "\t";
              }
            } else {
              s_list_temp = s_list_temp # r_time_temp # ":" # i_bright_temp # "\t";
            }
          } ! if i_seperator > 0
        } ! for idx_list

        if (b_debug) {
           s_debug = s_debug # "r_lastclose " # r_lastclose # "\r";
           s_debug = s_debug # "s_list_temp " # s_list_temp # "\r";
           s_debug = s_debug # "s_list_open " # s_list_open # "\r";
           s_debug = s_debug # "s_list_close " # s_list_close # "\r";
        }

        ! Öffnen oder schließen

        b_open = (i_brightness_low <= i_open);
        if (b_debug) {
           s_debug = s_debug # "open " # i_brightness_low # " <= " # i_open # ": " # b_open # "\r";
        }
        b_close = (i_brightness_high >= i_close);
        if (b_debug) {
           s_debug = s_debug # "close " # i_brightness_high # " >= " # i_close # ": " # b_close # "\r";
        }

        ! bereinigen

        if (b_open && b_close) {
          s_list_open = "";
          s_list_close = "";
          b_open = false;
          b_close = false;
          if (b_debug) {
              s_debug = s_debug # "conflict - remove all values\r";
          }
        }

        ! Werteliste aktualisieren

        if ((update) && (!o_working.Value())) {
          if ((b_closed) && (!b_close)) {
            s_list_close = c_timestamp # ":-254" # "\t";
            b_list_update = true;
            if (b_debug) {
               s_debug = s_debug # "add new value to close list\r";
            }
            if (b_open) {
              s_list_open = "";
              if (b_debug) {
                 s_debug = s_debug # "remove conflicting value from open list\r";
              }
           }
          }
          if ((b_opened) && (!b_open)) {
            s_list_open = c_timestamp # ":1" # "\t";
            b_list_update = true;
            if (b_debug) {
               s_debug = s_debug # "add new value to open list\r";
            }
            if (b_close) {
              s_list_close = "";
              if (b_debug) {
                 s_debug = s_debug # "remove conflicting value from close list\r";
              }
           }
          }
        }   

        s_list_temp = s_list_temp # s_list_close # s_list_open;
        if (b_debug) {
            s_debug = s_debug # "adding open/close lists\r";
        }


        ! Jalousien bewegen, wenn NICHT gelernt wurde und die Jalousie
        ! nicht vollständig geschlossen ist

        if ((!update) && (o_level.Value() != 0.0)) {

          ! anderer Timestamp...

          time t_timestamp = o_level.Timestamp();
          time t_now = system.Date("%Y-%m-%d %H:%M:%S").ToTime();
          integer i_diff = t_now.ToInteger() - t_timestamp.ToInteger();

          if ((b_close) && (!b_open) && (o_level.Value() != 0.4) && (i_diff > 1800)) {
            if (b_debug) {
               s_debug = s_debug # "closing blind\r";
            }
            o_level.State(0.4);
            b_closed = true;
          }
          if ((b_open) && (!b_close) && (o_level.Value() != 1.0) && (i_diff > 2700) &&
            (c_timestamp > r_lastclose + 0.25)) {
            if (b_debug) {
                s_debug = s_debug # "opening blind\r";
            }
            o_level.State(1.0);
          }
        }

        if ((b_closed) && (b_close)) {
          b_list_update = true;
          r_lastclose = c_timestamp;
          if (b_debug) {
             s_debug = s_debug # "update r_lastclose\r";
          }
        }

        s_list_temp = r_lastclose # "\t" # s_list_temp;

        ! Werteliste aktualisieren

        if (b_list_update) {
          o_list.State (s_list_temp);
          if (b_debug) {
             s_debug = s_debug # "save list\r";
          }
        }
        if (b_debug) {
            s_debug = s_debug # s_list # ": " # o_list.Value() # "\r";
        }

      } ! Jalousien bearbeiten

    }


    !!!!!!!!!!!!!!!!!!!!!!
    ! DEBUG ABSCHLIESSEN !
    !!!!!!!!!!!!!!!!!!!!!!

    if (b_debug) {
       s_debug = s_debug # "\rdone " # system.Date("%H:%M:%S") # "\r";
       if (o_debug) {
         o_debug.State (s_debug);
       }
    }
Herzliche Grüße, anli

Alle Angaben ohne Gewähr und Haftung meinerseits. Verwendung der von mir zur Verfügung gestellten Downloads auf eigene Gefahr. Ich bitte um Verständnis, dass ich aus zeitlichen Gründen keine unaufgeforderte Hilfestellung per PN/Mail geben kann. Bitte allgemeine Fragen ins Forum stellen, hier können viele fähige User viel schneller helfen.

Homematic-Manager v2: einfaches Tool zum Erstellen von Direktverknüpfungen und Bearbeiten von Gerätenamen, -parametern etc. für Homematic und HomematicIP (Alternative diesbzgl. zur WebUI)

Einsteiger-Hilfeerweiterter Skript-Parser

Antworten

Zurück zu „HomeMatic Tipps & Tricks - keine Fragen!“