Jalousiescript - Beta-Version (2)
Moderator: Co-Administratoren
Jalousiescript - Beta-Version (2)
Dieser Beitrag wurde durch den Autor entfernt.
Zuletzt geändert von teddy278 am 12.06.2011, 01:10, insgesamt 2-mal geändert.
Re: Jalousiescript - Beta-Version
Hallo.
VIelen teddy - klingt nach einem sehr sinnvollen Skript 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
Gruß,
- kaju
VIelen teddy - klingt nach einem sehr sinnvollen Skript 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
Gruß,
- kaju
HomeMatic-INSIDE: http://www.homematic-inside.de
Re: Jalousiescript - Beta-Version
Dieser Beitrag wurde durch den Autor entfernt.
Zuletzt geändert von teddy278 am 12.06.2011, 01:10, insgesamt 1-mal geändert.
Re: Jalousiescript - Beta-Version
Wo lebst DU denn?? Polarkreis?konsequent um 14 Uhr runter, obwohl es erst 3 Stunden später da hell wird.
HomeMatic-INSIDE: http://www.homematic-inside.de
Re: Jalousiescript - Beta-Version
Ich tippe eher auf Fenster in Richtung Nord-West
Grüße
Marc
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.
Rechtschreibfehler sind durchaus beabsichtigt und Ausdruck meiner Kreativität.
Re: Jalousiescript - Beta-Version
Dieser Beitrag wurde durch den Autor entfernt.
Zuletzt geändert von teddy278 am 12.06.2011, 01:10, insgesamt 1-mal geändert.
- 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)
Hallo.
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;)):
Danke!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:
Was macht das 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); }
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
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-Hilfe • erweiterter Skript-Parser
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-Hilfe • erweiterter Skript-Parser