Die Anfangsanforderung war:
- per Knopfdruck speichern des Zustandes
- Kanäle werden alle an oder umgeschalten durch was auch immer.
- per Knopfdruck wird der "alte " Zustand wiederhergestellt
Mal sehen,was da noch daraus wird.
Zu den Scripten als Voraberklärung:
Teil 1 liest den Status der Kanäle in dem Gewerk aus und speichert diesen in der Systemvariable
Teil 2 liest den Sollstatus aus der Systemvariable aus, vergleicht diesen mit dem Status des Kanals zur Laufzeit des Scriptes und schaltet bei Bedarf dann den Kanal um.
Voraussetzungen:
Gehen wir davon aus, das man ein Gewerk oder Favoriten anlegt, welcher den ein oder anderen Aktor beinhaltet.
Im Beispiel ist es der Favorit mit dem Namen: Lichter
Gehen wir weiter davon aus, das der geneigte User eine Systemvariable Typ Zeichenkette in der CCU anlegt
Im Beispiel ist der Name: Name deiner Speichervariable
Damit sind die Vorrausetzungen eigentlich schon erfüllt.
Anwendunsgfälle:
da gibt es massig Anwendungsfälle, die ich mir vorstellen kann oder könnte.
- Lichter im Haus sind an, per Knopfdruck werden ALLE Lichter eingeschalten, danach soll der "alte Zustand wiederhergestellt werden.
- Rolläden sind zumindest theoretisch auch integriert. Man fährt abends alle Rollos runter und will morgens den Zustand vom "vor dem Runterfahren" wiederherstellen.
Ergo abends Teil ! laufen lassen, morgens Teil 2. - ihr lasst das Script auf eine Raum laufen. Stellt also das ein, was ihr immer so haben wollt, z.B. zum Fernsehschauen. Rollo runter, Dimmer Stehleuchte 20%, Aktor Fernseher ein....
Teil 1 speichert die Szene in der Variable, Teil 2 würde die Aktoren dann per Tastendruck wieder herstellen wenn Ihr z.B. die Systemvariable Fernsehen auf true setzt......
Bitte beachten: Das Script ist strikt - Was an Kanälen im Gewerk enthalten ist, wird mit Teil 1 gescannt und gespeichert und mit Teil 2 wieder geschalten.
IHR müsst dafür sorgen,das auch nur das im Gewerk enthalten ist, was ihr auch gescannt und geschalten haben wollt.
Dafür könnt ihr es aber (UND das solltet ihr im Bedarfsfall auch machen) es vielfach anwenden. Ein Gewerk mit Lichtern, eines mit Rollos usw.
Dazu einfach eben mehrere Kopien des Scriptes benutzen mit unterschiedlichen Systemvariablen.
Beide Scripte arbeiten zu ihrer Laufzeit!
Ein Programm könnt ihr euch selber ausdenken, spielt keine Rolle.
Am Anfang macht es einfach mal Sinn zu schauen, was passiert und die Scripte jewels im Scriptexecuter oder unter Script testen auszuführen.
Es wird selbsterklärender Text auf dem Bildschirm ausgegeben.
Kurzanleitung
- Gewerk / Favoriten / Raum ... anlegen & Kanäle zuordnen
- Systemvariable anlegen
- Kanäle irgendwie schalten
- Script1 ausführen - Bildschirmausgabe beachten
- Kanäle irgendwo anders hinschalten
- Script 2 ausführen
Falls etwas unklar ist melden.
Falls Fehler keine Funktion usw. >> Fehlerprotokoll << posten mit Angabe der Schaltzeit.
Script Teil 1:
Code: Alles auswählen
! Szenensteuerung Teil 1 durch Auslesen des Zustandes der Kanäle eines Gewerkes oder Favoriten und speichern in Systemvariable
! v 0.6 (c) by Alchy
string liste = "Licht"; ! Name des Gewerkes, Favoriten usw. auch mehrere Möglich dann trennen mit \t
string sysvar = "Name deiner Speichervariable"; ! Name deiner Speichervariable Typ Zeichenkette welche die ISE_IDs der Datenpunkte enthalten soll
! Dont touch behind this Line
string index;string slist;var status = "";integer an = 0;integer aus = 0;integer counter = 0;
foreach (index, liste) {
object sec = dom.GetObject(index);
string itemId;
foreach(itemId, sec.EnumUsedIDs()) {
object item = dom.GetObject(itemId);
if (item.IsTypeOf(OT_CHANNEL)) {
object device = dom.GetObject(item.Device());
string hssType = item.HssType();
! Schalter
if ( (hssType == "SWITCH") && (item.DPByHssDP("STATE")) ) {
status = item.DPByHssDP("STATE").Value();
slist = slist# (item.DPByHssDP("STATE")).ID()#"="#status#" ";
if(status){ an = an+1; }else{ aus = aus+1;}}
!Dimmer
if ( (hssType == "DIMMER") && (item.DPByHssDP("LEVEL")) ) {
status = item.DPByHssDP("LEVEL").Value();
slist = slist# (item.DPByHssDP("LEVEL")).ID()#"="#status#" ";
if(status){ an = an+1; }else{ aus = aus+1;}
}
!RGBW_COLOR
if ( (hssType == "RGBW_COLOR") && (item.DPByHssDP("COLOR")) ) {
status = item.DPByHssDP("COLOR").Value();
slist = slist# (item.DPByHssDP("COLOR")).ID()#"="#status#" ";
if(status){ an = an+1; }else{ aus = aus+1;}
}
!IP Schalter
if ( (hssType == "SWITCH_VIRTUAL_RECEIVER") && (item.DPByHssDP("STATE")) ) {
status = item.DPByHssDP("STATE").Value();
slist = slist# (item.DPByHssDP("STATE")).ID()#"="#status#" ";
if(status){ an = an+1; }else{ aus = aus+1;}
}
!Rolloaktoren
if ( (hssType == "BLIND") && (item.DPByHssDP("LEVEL")) ) {
status = item.DPByHssDP("LEVEL").Value();
slist = slist# (item.DPByHssDP("LEVEL")).ID()#"="#status#" ";
if(status){ an = an+1; }else{ aus = aus+1;}
}
counter = an + aus;
}}
}
if (counter > 0) {
WriteLine("von "#counter #" gescannten Kanälen, sind "#an #" Kanäle an und "#aus#" Kanäle aus" );
slist = slist.Substr(0, slist.Length()-1);
WriteLine("\tDatenpunkt IDs "#slist #" aufgenommen");
if ( (dom.GetObject(ID_SYSTEM_VARIABLES)).Get(sysvar) ) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(slist); WriteLine("\t\tgespeichert")}else{WriteLine("Speichervariable nicht vorhanden");}
} else{
WriteLine ("Keine berücksichtigten Kanäle gescannt");
if ( (dom.GetObject(ID_SYSTEM_VARIABLES)).Get(sysvar) ) { dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).State(""); WriteLine("Speichervariable zurückgesetzt")}else{WriteLine("Speichervariable nicht vorhanden");}
}
Script Teil 2
Code: Alles auswählen
! Szenensteuerung Teil 2 Auslesen des Sollzustandes von Kanälen und Umschalten bei Bedarf
! v 0.5 (c) by Alchy
string sysvar = "Name deiner Speichervariable"; ! Name deiner Speichervariable Typ Zeichenkette welche die Ausgabe aus Teil 1 enthält
! Dont touch behind this Line
string liste = dom.GetObject(ID_SYSTEM_VARIABLES).Get(sysvar).Value();
string index;string dpID;string dpsSTATE;string slist;
foreach(index, liste.Split(" ")) {
dpID = index.StrValueByIndex("=",0);
dpsSTATE = index.StrValueByIndex("=",1);
object dp = (dom.GetObject(ID_DATAPOINTS)).Get(dpID);
if (dp){
var state = dp.Value();
slist = slist #"Datenpunkt "#dp.Name() #" Sollwert: "#dpsSTATE;
if (!dpsSTATE == state) {
dp.State(dpsSTATE);
slist = slist #" Istwert: "#state #" nicht o.k. geschalten\n";
}else{slist = slist #" Istwert: "#state #" in Ordnung\n";}
}else{WriteLine("Datenpunkt falsch");}
}
WriteLine(slist);
Es werden noch nicht alle möglichen Geräte unterstützt. Wenn wer eine Integration wünscht, dann bitte melden.