erstmal vielen Dank an die vielen aktiven Helfer, mit deren Hilfe ich allein durch Forumssuche und Beispiele schon viele Problem lösen konnte.
Ich habe mir eine Rolladensteuerung inklusive Beschattungsssteuerung programmiert, die ich jetzt noch etwas verfeinern möchte. Dazu möchte ich wissen, welches Fenster offen ist, da dann abends die Rolladen nicht geschlossen werden sollen (wegen Lüftung). Da es aber Räume mit mehren Fenstern gibt, ist die Auswahl des passenden Fensterkontakts über den Raum nicht möglich. Also das Ziel ist herauszufinden, welcher Fensterkontakt und welches Rollo zu welchem Fenster gehören. Meine Fensterkontakte sind nach dem Schema "Fenster Arbeitszimmer vorn:1" benannt (hier also Kanal 1 des entsprechenden Fensterkontakts). Das Rollo dazu heisst: "Rolladen Arbeitszimmer vorn:1". Alle Rolladenaktoren gehören zum Gewerk "Rolladen", die übere eine Schleife abgefragt werden, um je nach Variable die betroffenen Rolladen zu öffen, zu schliessen oder in Beschattungsstellung zu bringen. Die Frage ist, ob es eine elegante Lösung für das genannte Problem gibt. Ich hatte schon daran gedacht die Fensterkontakte und die Aktoren gleich zu benennen (also "Fenster Arbeitszimmer vorn:1"), aber soweit ich das bisher verstanden habe, ist das wohl keine so brilliante Idee, da es keine doppelte Namen geben sollte.
Vielleicht sollte ich noch erwähnen, dass ich kein gelernter Informatiker bin, sondern reiner Autodidakt. Also seht es mir bitte nach, wenn das script für die echten cracks etwas unbeholfen ist.
Anbei der aktuelle Arbeitsstand des scriptes:
Code: Alles auswählen
! Script zum setzen der verschiedenen variablen, die für Beschattung benötigt werden
! Skript wird durch Timer getriggert,
! Variablen initialisieren
boolean DEBUG = false; ! true/false zusaetzliche Ausgabe des Scriptes auf dem Monitor und im Syslog
string sysvarOut = "SYS:Log";
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("Debug True") };
boolean rollo_morgens;
boolean rollo_abends;
boolean rollo_schatten_Garten;
boolean rollo_schatten_Seite;
boolean rollo_schatten_Strasse;
boolean rollo_beschattung;
!boolean rollo_variable_current_state;
!integer rollo_ankleidezimmer_stand;
integer aussenTemp = dom.GetObject("HmIP-RF.xxxxxxxxx:1.ACTUAL_TEMPERATURE").Value(); !aktuelle Aussentemperatur
if ( DEBUG) { WriteLine ("Aussentemperatur: " # aussenTemp ) };
integer helligkeit = dom.GetObject("HmIP-RF.xxxxxxxx:1.ILLUMINATION").Value(); !aktuelle Helligkeit
!- helligkeit = 100;
if ( DEBUG) { WriteLine ("Helligkeit: " # helligkeit ) };
integer elevation = system.SunAltitude().Round(2);
if ( DEBUG) { WriteLine ("Sonnenstand elevation: " # elevation ) }; !Sonnenhöhe
integer azimut =system.SunAzimuth().Round(2);
if ( DEBUG) { WriteLine ("Sonnenstand azimut: " # azimut ) }; !Sonnenstand (Gradzahl)
dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Helligkeit: " # helligkeit # " Aussentemperatur: " # aussenTemp # " Sonnenstand elevation: " # elevation # " Sonnenstand azimut: " # azimut ) ;
!- !- globale hoch / runter variablen setzen
!- if(system.Date("%H:%M") > "10:00") {
!- boolean rollo_hoch = true;
!- }
if(helligkeit > 200) {
rollo_morgens = true;
rollo_abends = false;
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: (helligkeit: " # helligkeit # "->rollo_morgens = true") };
}
if ( DEBUG) { WriteLine ("roll_morgen: " # rollo_morgens ) };
!- bei Dämmerung Rollos herunterfahren
if(helligkeit < 130) {
rollo_abends = true;
rollo_morgens = false;
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: (helligkeit < 130) ->rollo_abends = true") };
}
if ( DEBUG) { WriteLine ("rollo_abends: " # rollo_abends ) };
!- Festlegen, ob Beschattung notwendig ist
if ( (aussenTemp > 20) && (helligkeit > 4000) ) {
rollo_beschattung = true;
} else {
rollo_beschattung = false;
}
!- Beschattung Garten
if((azimut > 60) && (azimut < 180) && (elevation > 10) && (rollo_beschattung) ) {
rollo_schatten_Garten = true;
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Garten = true") };
} else {
rollo_schatten_Garten = false;
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Garten = false") };
}
if ( DEBUG) { WriteLine ("rollo_schatten_Garten: " # rollo_schatten_Garten ) };
!- Beschattung Seite
if((azimut > 100) && (azimut < 240) && (elevation > 10) && (rollo_beschattung) ) {
rollo_schatten_Seite = true;
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Seite = true") };
} else {
rollo_schatten_Seite = false;
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Seite = false") };
}
if ( DEBUG) { WriteLine ("rollo_schatten_Seite: " # rollo_schatten_Seite ) };
!- Beschattung Strasse
if((azimut > 160) && (azimut < 350) && (elevation > 10) && (rollo_beschattung) ) {
rollo_schatten_Strasse = true;
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Strasse = true") };
} else {
rollo_schatten_Strasse = false;
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("GlobaleVariablen: Beschattung Strasse = false") };
}
if ( DEBUG) { WriteLine ("rollo_schatten_Strasse: " # rollo_schatten_Strasse ) };
!- hier fangen die eigentlichen Rollos an
!- Behanghöhe ist ein wert zwischen 0 (ganz zu) und 1 (ganz auf)
!- 0.25 wäre z.b ein viertel herunter
!- Behanghöse lesen über Kanal 3, setzen über Kanal 4
!- Rollos sollen nur fahren, wenn sich der Wert der Variable verändert hat
!- ansonsten wurde manuell betätigt und erst bei der nächsten Änderung soll gefahren werden.
!- aktuellen Stand der Rollos (sollzustand) holen um mit Ist zu vergleichen und manuelle Änderung zu detektieren
!- integer value_rollo_ankleidezimmer = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Roll_Ankleidezimmer").Value();
!- integer last_value_rollo_ankleidezimmer = dom.GetObject(ID_SYSTEM_VARIABLES).Get("Roll_Ankleidezimmer").LastValue();
var rollo = dom.GetObject("Rolladen");
string rolloID;
foreach(rolloID, rollo.EnumUsedIDs()) {
! Gerät zum Kanal holen
var device = dom.GetObject(dom.GetObject(rolloID).Device());
! Kanal 4 vom Gerät holen
var channel = dom.GetObject(rolloID);
! Datenpunkt mit gesuchter Information vom Kanal
var dp = channel.DPByHssDP("LEVEL");
! Name des Gerätes
var rollo_name = device.Name();
string sysvar = "Behang_" # rollo_name;
if (! dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar)) {
if ( DEBUG) { WriteLine ("Systemvariable nicht definiert: " # sysvar) };
dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("Systemvariable nicht definiert: " # sysvar);
continue;
}
integer last_value = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).LastValue();
integer current_value = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).Value();
! Raum des Gerätes
var RaumNamen = "";
string rid;
foreach(rid, channel.ChnRoom()) {
var Raum = dom.GetObject(rid);
RaumNamen = RaumNamen # Raum.Name();
}
if ( DEBUG) { WriteLine ("device: " # device) };
if ( DEBUG) { WriteLine ("kanal: " # channel) };
if ( DEBUG) { WriteLine ("datenpunkt: " # dp) };
if ( DEBUG) { WriteLine ("Name: " # rollo_name) };
if ( DEBUG) { WriteLine ("Raum: " # Raum) };
if ( DEBUG) { WriteLine ("Raum des Kanals: " # RaumNamen) };
if ( DEBUG) { WriteLine ("SystemVariable Behang: " # sysvar) };
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("ForEachRollo: " # rollo_name # " current_value: " # current_value # " last_value: " # last_value # " datenpunkt: " # dp # " Raum: " # Raum ) };
if ( DEBUG) { WriteLine ("rollo: " # rollo_name) };
if (rollo_morgens) {
!-if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo morgens = true") };
integer behang = 1; ! setze value zum öffnen
! wenn behang <> last value, wurde der Rolladen manuell geändert -> nicht fahren
if ( (behang <> current_value) && (!rollo_beschattung) ) {
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("RolloName " # rollo_name # " Variablen: behang " # behang # " current_value: " # current_value # " rollo_beschattung: " # rollo_beschattung ) };
!- Systemvariable setzen
dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
!- Wert wurde gerade geändert, Rolladen fahren
dp.State(behang);
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_morgens " # rollo_name # " rollo_beschattung " # rollo_beschattung # " Wert behang hat sich geändert ->rollo sollte aufgehen") };
} else {
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_morgens " # rollo_name # " Wert behang hat sich NICHT geändert ->bleibt wie es ist") };
}
}
if (rollo_abends) {
!-if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo abends = true") };
integer behang = 0; ! setze value zum schliessen
!- rollo nur fahren, wenn nicht zum lüften geöffnet
!- hier muss nioch der Raum ausgelesen werden und der passende Fensterkontakt
if ((behang <> current_value) && (dom.GetObject("HmIP-RF.00109A49A44C1C:1.STATE").Value() == 0)) {
!- Systemvariable setzen
dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
!- Wert wurde gerade geändert, Rolladen fahren
dp.State(behang);
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_abends " # rollo_name # " Wert behang hat sich geändert Und Fenster ist nicht offen ->Rollo geht zu") };
} else {
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_abends " # rollo_name # " Wert behang hat sich NICHT geändert ->bleibt wie es ist") };
}
}
if (rollo_schatten_Garten) {
!-if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo_schatten_Garten = true") };
! dom.GetObject(ID_SYSTEM_VARIABLES).Get("Roll_Schlafzimmer_links").State("Schatten");
! dom.GetObject(ID_SYSTEM_VARIABLES).Get("Roll_Schlafzimmer_rechts").State("Schatten");
}
if (rollo_schatten_Seite && (rollo_name == "Rolladen_Arbeitszimmer_links") ) {
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo_schatten_Seite: " # rollo_schatten_Seite ) };
integer behang = 0.25;
if (behang <> current_value) {
!- Systemvariable setzen
dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
!- Wert wurde gerade geändert, Rolladen fahren
dp.State(behang);
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Seite " # rollo_name # " Wert behang hat sich geändert Und Fenster ist nicht offen ->Fenster geht zu") };
} else {
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Seite " # rollo_name # " Wert behang hat sich NICHT geändert ->bleibt wie es ist") };
}
} elseif ((!rollo_schatten_Seite) && (rollo_name == "Rolladen_Arbeitszimmer_links") ) {
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo_schatten_Seite: " # rollo_schatten_Seite ) };
integer behang = 1;
if (behang <> current_value) {
!- Systemvariable setzen
dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
!- Wert wurde gerade geändert, Rolladen fahren
dp.State(behang);
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Seite " # rollo_name # " Wert behang hat sich geändert") };
} else {
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Seite " # rollo_name # " Wert behang hat sich NICHT geändert ->bleibt wie es ist") };
}
}
if (rollo_schatten_Strasse && ((rollo_name == "Rolladen_Arbeitszimmer_vorn") || (rollo_name == "Rolladen_Ankleidezimmer") )) {
!-if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo_schatten_Strasse = true") };
integer behang = 0.25;
if (behang <> current_value) {
!- Systemvariable setzen
dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("Rollo: " # rollo_name # " sysvar_behang: " # behang # " sysvar_lastValue: " # last_value # " current_value: " # dp.Value() ) };
!- Wert wurde gerade geändert, Rolladen fahren
dp.State(behang);
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Strasse " # rollo_name # " Wert behang hat sich geändert Und Fenster ist nicht offen ->Fenster geht zu") };
} else {
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Strasse " # rollo_name # " Wert behang hat sich NICHT geändert ->bleibt wie es ist") };
}
} elseif ( (!rollo_schatten_Strasse) && ((rollo_name == "Rolladen_Arbeitszimmer_vorn") || (rollo_name == "Rolladen_Ankleidezimmer") )) {
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("if rollo_schatten_Strasse: " # rollo_schatten_Strasse ) };
integer behang = 1;
if (behang <> current_value) {
!- Systemvariable setzen
dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(behang);
!- Wert wurde gerade geändert, Rolladen fahren
dp.State(behang);
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Strasse " # rollo_name # " Wert behang hat sich geändert") };
} else {
if ( DEBUG) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvarOut).State("rollo_schatten_Strasse " # rollo_name # " Wert behang hat sich NICHT geändert ->bleibt wie es ist") };
}
}
}
!-- Ende