Foreach Frage

Einrichtung, Anschluss und Programmierung der HomeMatic CCU

Moderator: Co-Administratoren

Gofel
Beiträge: 58
Registriert: 17.01.2015, 15:30

Foreach Frage

Beitrag von Gofel » 17.01.2015, 15:36

Ich möchte ein paar meiner Skripte mit foreach Schleifen versehen um sie kürzer/übersichtlicher zu gestallten. Leider hampel ich in der Praxis jetzt schon eine gute Stunde an folgendem Problem rum:

Code: Alles auswählen

string Rollo1 = "UP Rollo Küche";
string Rollo2 = "UP Rollo Wohnzimmer Ost";

var i = 1;

foreach(i , 2){WriteLine("Rollo" # i);}
WriteLine liefert "Rollo1" und nicht "UP Rollo Küche". Kann mir mal bitte jemand das Brett vom Kopf nehmen? :roll:

DrTob
Beiträge: 3426
Registriert: 29.10.2010, 08:24
Danksagung erhalten: 5 Mal

Foreach Frage

Beitrag von DrTob » 17.01.2015, 16:20

Gofel hat geschrieben:Ich möchte ein paar meiner Skripte mit foreach Schleifen versehen um sie kürzer/übersichtlicher zu gestallten. Leider hampel ich in der Praxis jetzt schon eine gute Stunde an folgendem Problem rum:

Code: Alles auswählen

string Rollo1 = "UP Rollo Küche";
string Rollo2 = "UP Rollo Wohnzimmer Ost";

var i = 1;

foreach(i , 2){WriteLine("Rollo" # i);}
WriteLine liefert "Rollo1" und nicht "UP Rollo Küche". Kann mir mal bitte jemand das Brett vom Kopf nehmen? :roll:
Eine Foreach Schleife ist keine "normale" FOR-Schleife. Sie dient zum Durchlaufen einer Liste. (Für jedes Listenelement mache xxx)
Lies dir dazu am besten die Script-Doku durch.

Gofel
Beiträge: 58
Registriert: 17.01.2015, 15:30

Re: Foreach Frage

Beitrag von Gofel » 17.01.2015, 16:39

Ich hab mir die Doku schon mehrfach durchgelesen, verstanden habe ich sie nicht vollumfänglich, sonst würde ich ja nicht so doof fragen ;)
Mein Problem ist hier glaube ich nicht welche Schleife ich wähle, sondern wie ich meine selbst erstellten Variablen mit Zähler darin wieder abrufen kann.
In anderen Programmiersprachen würde ich hier einfach ein Array wählen:

Code: Alles auswählen

Rollo[1] = "UP Rollo Küche"
Rollo[2] = "UP Rollo Wohnzimmer Ost"
For $i = 1 To 2
     Rollo[$i] mach was
Next
Hier habe ich aber kein Array zur Verfügung, aber es gibt doch sicherlich trotdem die möglichkeit meine durchnummerierten Variablen einzeln wieder abzurufen, oder?
Oder noch anders gefragt, was würdet ihr mir empfehlen um diesen Skript Teil in eine Schleife zu packen:

Code: Alles auswählen

var WriteTime = 1; !Aktuelle Zeit in Variable speichern. Nicht zwingend erforderlich

var Nachsteuern1 = 1;
var Nachsteuern2 = 1;

string iAus1 = "22:45";
string iAus2 = "01:30";

object Rollo1 = dom.GetObject("UP Rollo Küche:1");
object FensterRollo1 = dom.GetObject("Fenster Küche").State();
string ZoneRollo1 = 1;

object Rollo2 = dom.GetObject("UP Rollo Wohnzimmer Ost:1");
object FensterRollo2 = dom.GetObject("Fenster Wohn Ost").State();
string ZoneRollo2 = 1;

object Rollo3 = dom.GetObject("UP Rollo Wohnzimmer Süd links:1");
object FensterRollo3 = dom.GetObject("Fenster Wohn Süd links").State();
string ZoneRollo3 = 2;

object Rollo4 = dom.GetObject("UP Rollo Wohnzimmer Süd rechts:1");
object FensterRollo4 = dom.GetObject("Fenster Wohn Süd rechts").State();
string ZoneRollo4 = 2;

object Rollo5 = dom.GetObject("UP Rollo Gäste WC:1");
object FensterRollo5 = dom.GetObject("Fenster Gäste WC").State();
string ZoneRollo5 = 1;

object Rollo6 = dom.GetObject("UP Rollo Badezimmer:1");
object FensterRollo6 = dom.GetObject("Fenster Badezimmer").State();
string ZoneRollo6 = 1;
!----------------------------------------------------------



if (Nachsteuern1 == 1) {iAus1 = iAus1.ToString(2) + " Uhr";}
if (Nachsteuern2 == 1) {iAus2 = iAus2.ToString(2) + " Uhr";}

!----------------Aktuelle Zeit ermitteln-------------------
string Uhrzeit = system.Date("%H:%M").ToString() + " Uhr";
if (WriteTime == 1){dom.GetObject("Aktuelle Zeit").State(Uhrzeit);}


!----- Prüfen ob Sonnenaufgangzeitszeit erreicht ist ----    !SCHLEIFE HIER IRGENDWIE!
!---------------Zone 1 Rollos hochfahren-------------------
if (dom.GetObject("Rollo Zone 1 Sonnenaufgang").State() == Uhrzeit) {
	if (ZoneRollo1 == 1) {if (Rollo1.State() <> 1) {Rollo1.State(1.0);}}
	if (ZoneRollo2 == 1) {if (Rollo2.State() <> 1) {Rollo2.State(1.0);}}
	if (ZoneRollo3 == 1) {if (Rollo3.State() <> 1) {Rollo3.State(1.0);}}
	if (ZoneRollo4 == 1) {if (Rollo4.State() <> 1) {Rollo4.State(1.0);}}
	if (ZoneRollo5 == 1) {if (Rollo5.State() <> 1) {Rollo5.State(1.0);}}
	if (ZoneRollo6 == 1) {if (Rollo6.State() <> 1) {Rollo6.State(1.0);}}	
}
!---------------Zone 2 Rollos hochfahren-------------------    !SCHLEIFE HIER IRGENDWIE!
if (dom.GetObject("Rollo Zone 2 Sonnenaufgang").State() == Uhrzeit) {
	if (ZoneRollo1 == 2) {if (Rollo1.State() <> 1) {Rollo1.State(1.0);}}
	if (ZoneRollo2 == 2) {if (Rollo2.State() <> 1) {Rollo2.State(1.0);}}
	if (ZoneRollo3 == 2) {if (Rollo3.State() <> 1) {Rollo3.State(1.0);}}
	if (ZoneRollo4 == 2) {if (Rollo4.State() <> 1) {Rollo4.State(1.0);}}
	if (ZoneRollo5 == 2) {if (Rollo5.State() <> 1) {Rollo5.State(1.0);}}
	if (ZoneRollo6 == 2) {if (Rollo6.State() <> 1) {Rollo6.State(1.0);}}	
}...

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Foreach Frage

Beitrag von Familienvater » 17.01.2015, 16:54

Hi,

neben dem was DrTob geschrieben hat, kannst Du in einer "normalen" Programmiersprache auch nicht einfach einen Variablennamen zusammenbauen, um dann den Wert daraus zu holen.
Klar gibt es Ausnahmen, wie z.B. Reflektion in C#, aber das sind spezielle Mechanismen...


Der Familienvater

Gofel
Beiträge: 58
Registriert: 17.01.2015, 15:30

Re: Foreach Frage

Beitrag von Gofel » 17.01.2015, 17:09

Heißt das jetzt also wirklich das ich keine Möglichkeit habe das in eine Schleife zu packen?
Wenn ich nicht 6 sondern 106 Rollos hätte wäre mein Skript dadurch 600 Zeilen länger. Rauf/Runter in 2 Zonen, Nachsteuern1/2

Hier nochmal das komplette Skript:

Code: Alles auswählen

var WriteTime = 1;
var Nachsteuern1 = 1;
var Nachsteuern2 = 1;

string iAus1 = "22:45";
string iAus2 = "01:30";


object Rollo1 = dom.GetObject("UP Rollo Küche:1");
object FensterRollo1 = dom.GetObject("Fensterkontakt Küche:1");
string ZoneRollo1 = 1;

object Rollo2 = dom.GetObject("UP Rollo Wohnzimmer Ost:1");
object FensterRollo2 = dom.GetObject("Fensterdrehgriff Wohnzimmer Ost:1");
string ZoneRollo2 = 1;

object Rollo3 = dom.GetObject("UP Rollo Wohnzimmer Süd links:1");
object FensterRollo3 = dom.GetObject("Fensterdrehgriff Wohnzimmer Süd links:1");
string ZoneRollo3 = 2;

object Rollo4 = dom.GetObject("UP Rollo Wohnzimmer Süd rechts:1");
object FensterRollo4 = dom.GetObject("Fensterdrehgriff Wohnzimmer Süd rechts:1");
string ZoneRollo4 = 2;

object Rollo5 = dom.GetObject("UP Rollo Gäste WC:1");
object FensterRollo5 = dom.GetObject("Fensterkontakt Gäste WC:1");
string ZoneRollo5 = 1;

object Rollo6 = dom.GetObject("UP Rollo Badezimmer:1");
object FensterRollo6 = dom.GetObject("Fensterdrehgriff Badezimmer:1");
string ZoneRollo6 = 1;

!------------------------------------------------------------------------

if (Nachsteuern1 == 1) {iAus1 = iAus1.ToString(2) + " Uhr";}
if (Nachsteuern2 == 1) {iAus2 = iAus2.ToString(2) + " Uhr";}

string Uhrzeit = system.Date("%H:%M").ToString() + " Uhr";
if (WriteTime == 1){dom.GetObject("Aktuelle Zeit").State(Uhrzeit);}


!---------------------------- Sonnenaufgang ----------------------------
!------------------------------- Zone 1 --------------------------------
if (dom.GetObject("Rollo Zone 1 Sonnenaufgang").State() == Uhrzeit) {
	if (ZoneRollo1 == 1) {if (Rollo1.State() <> 1) {Rollo1.State(1.0);}}
	if (ZoneRollo2 == 1) {if (Rollo2.State() <> 1) {Rollo2.State(1.0);}}
	if (ZoneRollo3 == 1) {if (Rollo3.State() <> 1) {Rollo3.State(1.0);}}
	if (ZoneRollo4 == 1) {if (Rollo4.State() <> 1) {Rollo4.State(1.0);}}
	if (ZoneRollo5 == 1) {if (Rollo5.State() <> 1) {Rollo5.State(1.0);}}
	if (ZoneRollo6 == 1) {if (Rollo6.State() <> 1) {Rollo6.State(1.0);}}	
}
!------------------------------- Zone 2 --------------------------------
if (dom.GetObject("Rollo Zone 2 Sonnenaufgang").State() == Uhrzeit) {
	if (ZoneRollo1 == 2) {if (Rollo1.State() <> 1) {Rollo1.State(1.0);}}
	if (ZoneRollo2 == 2) {if (Rollo2.State() <> 1) {Rollo2.State(1.0);}}
	if (ZoneRollo3 == 2) {if (Rollo3.State() <> 1) {Rollo3.State(1.0);}}
	if (ZoneRollo4 == 2) {if (Rollo4.State() <> 1) {Rollo4.State(1.0);}}
	if (ZoneRollo5 == 2) {if (Rollo5.State() <> 1) {Rollo5.State(1.0);}}
	if (ZoneRollo6 == 2) {if (Rollo6.State() <> 1) {Rollo6.State(1.0);}}	
}
!------------------------------------------------------------------------

!--------------------------- Sonnenuntergang ----------------------------
!------------------------------- Zone 1 --------------------------------
if (dom.GetObject("Rollo Zone 1 Sonnenuntergang").State() == Uhrzeit) {
	if (ZoneRollo1 == 1) {
		if (FensterRollo1.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo1.State() == false) {if (Rollo1.State() <> 0) {Rollo1.State(0.0);}} !Geschlossen
			if (FensterRollo1.State() == true) {if (Rollo1.State() <> 0.2) {Rollo1.State(0.2);}} !Geöffnet
		}
		if (FensterRollo1.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo1.State() == 0) {if (Rollo1.State() <> 0) {Rollo1.State(0.0);}} !Geschlossen
			if (FensterRollo1.State() == 1) {if (Rollo1.State() <> 0.2) {Rollo1.State(0.2);}} !Gekippt
		}	
	}
	if (ZoneRollo2 == 1) {
		if (FensterRollo2.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo2.State() == false) {if (Rollo2.State() <> 0) {Rollo2.State(0.0);}} !Geschlossen
			if (FensterRollo2.State() == true) {if (Rollo2.State() <> 0.2) {Rollo2.State(0.2);}} !Geöffnet	
		}
		if (FensterRollo2.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo2.State() == 0) {if (Rollo2.State() <> 0) {Rollo2.State(0.0);}} !Geschlossen
			if (FensterRollo2.State() == 1) {if (Rollo2.State() <> 0.2) {Rollo2.State(0.2);}} !Gekippt
		}
	}
	if (ZoneRollo3 == 1) {
		if (FensterRollo3.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo3.State() == false) {if (Rollo3.State() <> 0) {Rollo3.State(0.0);}} !Geschlossen
			if (FensterRollo3.State() == true) {if (Rollo3.State() <> 0.2) {Rollo3.State(0.2);}} !Geöffnet		
		}
		if (FensterRollo3.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo3.State() == 0) {if (Rollo3.State() <> 0) {Rollo3.State(0.0);}} !Geschlossen
			if (FensterRollo3.State() == 1) {if (Rollo3.State() <> 0.2) {Rollo3.State(0.2);}} !Gekippt
		}
	}
	if (ZoneRollo4 == 1) {
		if (FensterRollo4.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo4.State() == false) {if (Rollo4.State() <> 0) {Rollo4.State(0.0);}} !Geschlossen
			if (FensterRollo4.State() == true) {if (Rollo4.State() <> 0.2) {Rollo4.State(0.2);}} !Geöffnet		
		}
		if (FensterRollo4.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo4.State() == 0) {if (Rollo4.State() <> 0) {Rollo2.State(0.0);}} !Geschlossen
			if (FensterRollo4.State() == 1) {if (Rollo4.State() <> 0.2) {Rollo2.State(0.2);}} !Gekippt
		}
	}
	if (ZoneRollo5 == 1) {
		if (FensterRollo5.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo5.State() == false) {if (Rollo5.State() <> 0) {Rollo5.State(0.0);}} !Geschlossen
			if (FensterRollo5.State() == true) {if (Rollo5.State() <> 0.2) {Rollo5.State(0.2);}} !Geöffnet		
		}
		if (FensterRollo5.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo5.State() == 0) {if (Rollo5.State() <> 0) {Rollo5.State(0.0);}} !Geschlossen
			if (FensterRollo5.State() == 1) {if (Rollo5.State() <> 0.2) {Rollo5.State(0.2);}} !Gekippt
		}
	}
	if (ZoneRollo6 == 1) {
		if (FensterRollo6.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo6.State() == false) {if (Rollo6.State() <> 0) {Rollo6.State(0.0);}} !Geschlossen
			if (FensterRollo6.State() == true) {if (Rollo6.State() <> 0.2) {Rollo6.State(0.2);}} !Geöffnet		
		}
		if (FensterRollo6.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo6.State() == 0) {if (Rollo6.State() <> 0) {Rollo6.State(0.0);}} !Geschlossen
			if (FensterRollo6.State() == 1) {if (Rollo6.State() <> 0.2) {Rollo6.State(0.2);}} !Gekippt
		}
	}
}
!------------------------------- Zone 2 --------------------------------
if (dom.GetObject("Rollo Zone 2 Sonnenuntergang").State() == Uhrzeit) {
	if (ZoneRollo1 == 2) {
		if (FensterRollo1.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo1.State() == false) {if (Rollo1.State() <> 0) {Rollo1.State(0.0);}} !Geschlossen
			if (FensterRollo1.State() == true) {if (Rollo1.State() <> 0.2) {Rollo1.State(0.2);}} !Geöffnet
		}
		if (FensterRollo1.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo1.State() == 0) {if (Rollo1.State() <> 0) {Rollo1.State(0.0);}} !Geschlossen
			if (FensterRollo1.State() == 1) {if (Rollo1.State() <> 0.2) {Rollo1.State(0.2);}} !Gekippt
		}	
	}
	if (ZoneRollo2 == 2) {
		if (FensterRollo2.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo2.State() == false) {if (Rollo2.State() <> 0) {Rollo2.State(0.0);}} !Geschlossen
			if (FensterRollo2.State() == true) {if (Rollo2.State() <> 0.2) {Rollo2.State(0.2);}} !Geöffnet		
		}
		if (FensterRollo2.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo2.State() == 0) {if (Rollo2.State() <> 0) {Rollo2.State(0.0);}} !Geschlossen
			if (FensterRollo2.State() == 1) {if (Rollo2.State() <> 0.2) {Rollo2.State(0.2);}} !Gekippt
		}
	}
	if (ZoneRollo3 == 2) {
		if (FensterRollo3.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo3.State() == false) {if (Rollo3.State() <> 0) {Rollo3.State(0.0);}} !Geschlossen
			if (FensterRollo3.State() == true) {if (Rollo3.State() <> 0.2) {Rollo3.State(0.2);}} !Geöffnet		
		}
		if (FensterRollo3.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo3.State() == 0) {if (Rollo3.State() <> 0) {Rollo3.State(0.0);}} !Geschlossen
			if (FensterRollo3.State() == 1) {if (Rollo3.State() <> 0.2) {Rollo3.State(0.2);}} !Gekippt
		}
	}
	if (ZoneRollo4 == 2) {
		if (FensterRollo4.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo4.State() == false) {if (Rollo4.State() <> 0) {Rollo4.State(0.0);}} !Geschlossen
			if (FensterRollo4.State() == true) {if (Rollo4.State() <> 0.2) {Rollo4.State(0.2);}} !Geöffnet		
		}
		if (FensterRollo4.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo4.State() == 0) {if (Rollo4.State() <> 0) {Rollo2.State(0.0);}} !Geschlossen
			if (FensterRollo4.State() == 1) {if (Rollo4.State() <> 0.2) {Rollo2.State(0.2);}} !Gekippt
		}
	}
	if (ZoneRollo5 == 2) {
		if (FensterRollo5.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo5.State() == false) {if (Rollo5.State() <> 0) {Rollo5.State(0.0);}} !Geschlossen
			if (FensterRollo5.State() == true) {if (Rollo5.State() <> 0.2) {Rollo5.State(0.2);}} !Geöffnet		
		}
		if (FensterRollo5.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo5.State() == 0) {if (Rollo5.State() <> 0) {Rollo5.State(0.0);}} !Geschlossen
			if (FensterRollo5.State() == 1) {if (Rollo5.State() <> 0.2) {Rollo5.State(0.2);}} !Gekippt
		}
	}
	if (ZoneRollo6 == 2) {
		if (FensterRollo6.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo6.State() == false) {if (Rollo6.State() <> 0) {Rollo6.State(0.0);}} !Geschlossen
			if (FensterRollo6.State() == true) {if (Rollo6.State() <> 0.2) {Rollo6.State(0.2);}} !Geöffnet		
		}
		if (FensterRollo6.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo6.State() == 0) {if (Rollo6.State() <> 0) {Rollo6.State(0.0);}} !Geschlossen
			if (FensterRollo6.State() == 1) {if (Rollo6.State() <> 0.2) {Rollo6.State(0.2);}} !Gekippt
		}
	}
}
!------------------------------------------------------------------------


!------------Nachsteuern in Abhängigkeit der Fensterkontakte-------------
if (Nachsteuern1 == 1) {
	if (iAus1 == Uhrzeit) {
		if (FensterRollo1.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo1.State() == false) {if (Rollo1.State() <> 0) {Rollo1.State(0.0);}} !Geschlossen
			if (FensterRollo1.State() == true) {if (Rollo1.State() <> 0.2) {Rollo1.State(0.2);}} !Geöffnet
		}
		if (FensterRollo1.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo1.State() == 0) {if (Rollo1.State() <> 0) {Rollo1.State(0.0);}} !Geschlossen
			if (FensterRollo1.State() == 1) {if (Rollo1.State() <> 0.2) {Rollo1.State(0.2);}} !Gekippt
		}
		if (FensterRollo2.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo2.State() == false) {if (Rollo2.State() <> 0) {Rollo2.State(0.0);}} !Geschlossen
			if (FensterRollo2.State() == true) {if (Rollo2.State() <> 0.2) {Rollo2.State(0.2);}} !Geöffnet
		}
		if (FensterRollo2.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo2.State() == 0) {if (Rollo2.State() <> 0) {Rollo2.State(0.0);}} !Geschlossen
			if (FensterRollo2.State() == 1) {if (Rollo2.State() <> 0.2) {Rollo2.State(0.2);}} !Gekippt
		}
		if (FensterRollo3.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo3.State() == false) {if (Rollo3.State() <> 0) {Rollo3.State(0.0);}} !Geschlossen
			if (FensterRollo3.State() == true) {if (Rollo3.State() <> 0.2) {Rollo3.State(0.2);}} !Geöffnet
		}
		if (FensterRollo3.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo3.State() == 0) {if (Rollo3.State() <> 0) {Rollo3.State(0.0);}} !Geschlossen
			if (FensterRollo3.State() == 1) {if (Rollo3.State() <> 0.2) {Rollo3.State(0.2);}} !Gekippt
		}		
		if (FensterRollo4.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo4.State() == false) {if (Rollo4.State() <> 0) {Rollo4.State(0.0);}} !Geschlossen
			if (FensterRollo4.State() == true) {if (Rollo4.State() <> 0.2) {Rollo4.State(0.2);}} !Geöffnet
		}
		if (FensterRollo4.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo4.State() == 0) {if (Rollo4.State() <> 0) {Rollo4.State(0.0);}} !Geschlossen
			if (FensterRollo4.State() == 1) {if (Rollo4.State() <> 0.2) {Rollo4.State(0.2);}} !Gekippt
		}		
		if (FensterRollo5.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo5.State() == false) {if (Rollo5.State() <> 0) {Rollo5.State(0.0);}} !Geschlossen
			if (FensterRollo5.State() == true) {if (Rollo5.State() <> 0.2) {Rollo5.State(0.2);}} !Geöffnet
		}
		if (FensterRollo5.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo5.State() == 0) {if (Rollo5.State() <> 0) {Rollo5.State(0.0);}} !Geschlossen
			if (FensterRollo5.State() == 1) {if (Rollo5.State() <> 0.2) {Rollo5.State(0.2);}} !Gekippt
		}		
		if (FensterRollo6.HssType() == "SHUTTER_CONTACT") {
			if (FensterRollo6.State() == false) {if (Rollo6.State() <> 0) {Rollo6.State(0.0);}} !Geschlossen
			if (FensterRollo6.State() == true) {if (Rollo6.State() <> 0.2) {Rollo6.State(0.2);}} !Geöffnet
		}
		if (FensterRollo6.HssType() == "ROTARY_HANDLE_SENSOR") {
			if (FensterRollo6.State() == 0) {if (Rollo6.State() <> 0) {Rollo6.State(0.0);}} !Geschlossen
			if (FensterRollo6.State() == 1) {if (Rollo6.State() <> 0.2) {Rollo6.State(0.2);}} !Gekippt
		}		
	}
}
!------------------------------------------------------------------------	

!---------------------- Nachsteuern Kompromisslos -----------------------
if (Nachsteuern2 == 1) {
	if (iAus2 == Uhrzeit) {
		if (Rollo1.State() <> 0) {Rollo1.State(0.0);}
		if (Rollo2.State() <> 0) {Rollo2.State(0.0);}
		if (Rollo3.State() <> 0) {Rollo3.State(0.0);}
		if (Rollo4.State() <> 0) {Rollo4.State(0.0);}
		if (Rollo5.State() <> 0) {Rollo5.State(0.0);}
		if (Rollo6.State() <> 0) {Rollo6.State(0.0);}
	}
}
!------------------------------------------------------------------------
Zuletzt geändert von Gofel am 18.01.2015, 16:50, insgesamt 6-mal geändert.

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Foreach Frage

Beitrag von Familienvater » 17.01.2015, 17:17

Hi,

ich bin defintiv kein Kenner von HM-Script, aber Du kannst z.B. mit foreach-Schleife über ein Gewerk alle darin enthaltenen Aktoren "ablaufen"... Zur Such mal nach "alle Lichter aus" oder so, da wird soetwas glaube ich gemacht...

Hast Du Dir mal die 4 PDFs der HMScript-Doku auf der EQ3-Homepage durchgelesen?

Der Familenvater

Gofel
Beiträge: 58
Registriert: 17.01.2015, 15:30

Re: Foreach Frage

Beitrag von Gofel » 17.01.2015, 17:28

Das "alle Lichter aus" Script hier im Forum hab ich mir vorhin als Vorlage nehmen wollen als ich auf die Idee mit der Schleife kam. Aber wie du schon schreibst, darin wird das Komplette Gewerk durchlaufen. In Kombination mit meinen 2 Zonen die ich beibehalten will und die Abhängigkeit der Fenster verstärkt das noch meinen Knoten im Kopf :) Jedes Rollo hat einen Fensterkontakt dessen Stellung entscheidend für das fahren der Rollos ist. Keine Idee wie ich das zusammenführen soll. Ich bin kein gelernter ITler, beschäftige mich privat etwas mit niederen Programmiersprachen. Das lesen der Dokus verursacht bei mir daher oft Unverständnis, auch wenn ich mich schon mehrfach dazu gezwungen habe.
Ich denke mein Script kann dann auch erstmal so bleiben, auch wenn in Zukunft noch ein paar Rollos dazukommen, 106 werden es nie ;)

Lampi
Beiträge: 42
Registriert: 07.03.2011, 11:48
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal

Re: Foreach Frage

Beitrag von Lampi » 18.01.2015, 10:05

Hallo,

vielleicht hift dir das etwas weiter

Code: Alles auswählen

string vFenster;
string vListe = "Kueche;Terrassentuer;Esszimmer;Wohnzimmer";
integer vStatusSoll = 0;

foreach(vFenster, vListe.Split(";")){
  if (dom.GetObject("FDK " # vFenster # ":1")){ ! pruefen, ob FDK existiert
    if (dom.GetObject("FDK " # vFenster # ":1").DPByHssDP("STATE").Value() > 0){ ! Kippstellung oder offen
      vStatusSoll = 1;
    }
  }
}
damit frage ich ab, ob min. einer der Drehkriffkontakte offen oder gekippt meldet.
Gruß

Familienvater
Beiträge: 7151
Registriert: 31.12.2006, 15:18
System: Alternative CCU (auf Basis OCCU)
Wohnort: Rhein-Main
Danksagung erhalten: 34 Mal

Re: Foreach Frage

Beitrag von Familienvater » 18.01.2015, 10:35

Hi,

ich habe mir jetzt Dein Script mit den 6 Rolläden mal angeschaut...

Warum brichst Du das ganze in 2 Zonen auf, die soweit ich das richtig aus dem Code verstehe, doch eh alle zur gleichen Zeit fahren?
Apropos zur gleichen Zeit fahren:
Hast Du Probleme mit nicht fahrenden Rolläden bzw. Kommunikationsstörungen, gerade am morgen? Du schickst "zeitgleich" den Befehl zum Öffnen an 6 Rolläden, deren Quittungen müssten sich eigentlich gegenseitig in die Quere kommen...

Führst Du das Script jede Minute aus, oder nur zu Sonnenaufgang, Sonnenuntergang und den zwei Nachsteuerzeitpunkten?

Ich habe wie schon erwähnt von HM-Script nicht die Ahnung, ich habe meine ganze Rolladen-Geschichte mit Homeputer CL gemacht, z.B. auch das verzögerte Runterfahren wenn ein Fenster offen ist, oder wenn es gekippt ist nur auf 25%. Allerdings steuert bei mir dann der Fenstergriff nach, wenn das Fenster geschlossen wird.
Da bei mir auch Balkon/Terrassentüren betroffen sind, käme bei mir ein hartes "egal ob Du auf bist, jetzt Rolladen runter!" nicht in Frage, dann wäre nämlich im dümmsten Fall jemand ausgesperrt, bzw. an einer Türe könnte auch die Fliegengittertür offen sein, und dann würde es Rolladenpanzerstau geben.

Aber nochmal zu Deinem Problem zurück:
Du könntest in der Liste auch Beziehungen mit einem anderen Trennzeichen speichern:

Code: Alles auswählen

    string vFenster;
    string vRolladen;
    string vZone;
    string vTemp;
    string vListe = "Rolladen 1;Fenster 1;Zone 1|Rolladen 2;Fenster 2;Zone 2|Rolladen 3;Fenster 3;Zone 1";
    integer vStatusSoll = 0;

    foreach(vTemp, vListe.Split("|")){
      vRolladen=vTemp.StrValueByIndex(";",0);
      vFenster=vTemp.StrValueByIndex(";",1);
      vZone=vTemp.StrValueByIndex(";",2);
      ! ......
    }
Der Familienvater

Gofel
Beiträge: 58
Registriert: 17.01.2015, 15:30

Re: Foreach Frage

Beitrag von Gofel » 18.01.2015, 16:15

ich habe mir jetzt Dein Script mit den 6 Rolläden mal angeschaut...
ich hoffe nicht zu genau, da waren noch ein paar copy and paste Fehler drin, hab oben jetzt noch mal die Fehlerfrei Version gepostet
Warum brichst Du das ganze in 2 Zonen auf, die soweit ich das richtig aus dem Code verstehe, doch eh alle zur gleichen Zeit fahren?
Nein, die Uhrzeiten für die beiden Zonen kommen aus einem anderen Skript was einmal täglich ausgeführt wir und die Zeiten berechnet. Diese 4 Zeiten werden dann in Systemvariablen gespeichert.
Hast Du Probleme mit nicht fahrenden Rolläden bzw. Kommunikationsstörungen, gerade am morgen? Du schickst "zeitgleich" den Befehl zum Öffnen an 6 Rolläden, deren Quittungen müssten sich eigentlich gegenseitig in die Quere kommen...
Führst Du das Script jede Minute aus, oder nur zu Sonnenaufgang, Sonnenuntergang und den zwei Nachsteuerzeitpunkten?
Von Kommunikationsstörungen von zu vieler gleichzeitiger Komandos hab ich hier zwar schonmal was gelesen, in der Praxis aber nie Probleme gehabt. Allerdings werden die Rollos die gleichzeitig fahren nach und nach immer mehr, das Problem wird irgendwann kommen. Dieses riesen Script wird leider jede Minute ausgeführt, mit ein Grund warum ich es optimieren möchte
Allerdings steuert bei mir dann der Fenstergriff nach, wenn das Fenster geschlossen wird.
Das macht bei mir ein zusätzliches Script auch noch on Top. Das "Nachsteuern2" in diesem Script ist nur für den unwahrscheinlichen Fall gedacht das ein Fenster die ganze Nacht aufsteht weil es vergessen wurde, dann wird ohne Rücksicht auf den Fensterkontakt nachgesteuert
Da bei mir auch Balkon/Terrassentüren betroffen sind, käme bei mir ein hartes "egal ob Du auf bist, jetzt Rolladen runter!" nicht in Frage, dann wäre nämlich im dümmsten Fall jemand ausgesperrt
Die Terrassentüre hat außen einen Schlüsselschalter um das Aussperren abzufangen
string vListe = "Rolladen 1;Fenster 1;Zone 1|Rolladen 2;Fenster 2;Zone 2|Rolladen 3;Fenster 3;Zone 1";
Das sieht doch ziemlich genau nach einer Array aus die ich gestern gesucht habe. Ich dachte sowas geht hier nicht, das schau ich mir mal genauer an, danke.
@Lampi ebenfalls danke, das könnte mir weiterhelfen

Antworten

Zurück zu „HomeMatic Zentrale (CCU / CCU2 / CCU3 / Charly)“