Herstellerübergreifende Gruppenschaltung

Habe ein Script geschrieben, mit dem man verschiedene Hersteller per Script schalten kann.
Dieses gibt die Status Info an die Parents weiter. Siehe Bild.


Angelegt wird der Name, Getrennt mit einem @ Dann die Info ob Schalter / Dimmer RGB dann Hersteller und Ziel ID

Es kann beliebig tief verschachtelt werden.

Wichtig ist, dass die oberste und damit letzte Variable diese immer „Alle“ heist

Hier das Script function Gruppenschaltung

<?
// -----------------------------------------------------------------------------
// Die Hauptfunktion, die die unteren Funktionen aufruft
// by Thomas Pößnecker
// -----------------------------------------------------------------------------
function Schalten ($StartID, $ValueNew){

// Timeout setzen damit auch alle Lichter geschalten werden	
set_time_limit(200); //Timeout auf 80s setze	
	
// Webfront aktualisieren
setvalue($StartID, $ValueNew);
	NachUntenAktualisieren ($StartID, $ValueNew);
	NachObenAktualisieren  ($StartID);
	SchalterAbfrage ($StartID, $ValueNew);

}

// Schaltvorgänge
// -----------------------------------------------------------------------------
function SchaltenHersteller ($SchalterID, $ValueNew){
		$Bezeichnung = IPS_GetName ($SchalterID);
		list($Name, $Rest) = explode(" @ ", $Bezeichnung);
		list($Aktorart, $Hersteller, $ZielID) = explode(" - ", $Rest);



	// Je Nach Typ und Hersteller schalten
	switch ($Hersteller){
		case "HOMEMATIC":
		   $Wartezeit = 100;
			switch ($Aktorart){
			   case "SWITCH":
			   		if (getvalue (IPS_GetVariableIDByName("STATE", $ZielID)) == $ValueNew){goto Ueberspringen;}else{
			   			HM_WriteValueBoolean ($ZielID, "STATE", $ValueNew);
						}
					break;
			   case "DIMMER":                                                          								
			   		break;
			}
			break;

		case "HOMEMATICIP":
		   $Wartezeit = 50;
			switch ($Aktorart){
			   case "SWITCH":
			   		if (getvalue (IPS_GetVariableIDByName("STATE", $ZielID)) == $ValueNew){goto Ueberspringen;}else{
			   			HM_WriteValueBoolean ($ZielID, "STATE", $ValueNew);
						}
					break;
			   case "DIMMER":                                                          								
			   		break;
			}
			break;

		case "FS20":
		   $Wartezeit = 250;
			switch ($Aktorart){
			   case "SWITCH": 
			   		if (getvalue (IPS_GetVariableIDByName("Status", $ZielID)) == $ValueNew){goto Ueberspringen;}else{
						FS20_SwitchMode ($ZielID,$ValueNew);	
						FS20_SwitchMode ($ZielID,$ValueNew);							
						}
					break;
			   case "DIMMER":
			   		if (getvalue (IPS_GetVariableIDByName("Status", $ZielID)) == $ValueNew){goto Ueberspringen;}else{
			    		FS20_SwitchMode ($ZielID,$ValueNew);
						}														
					break;
			}
			break;

		case "PROJET":
		   $Wartezeit = 10;
			switch ($Aktorart){
			   case "RGB":
			   		//if (getvalue (IPS_GetVariableIDByName("White", $ZielID)) == $ValueNew){goto Ueberspringen;}else{		
			   			if ($ValueNew == true){$Farbe = 255;}else{$Farbe = 0;}
						PJ_SetRGBW ($ZielID, $Farbe, $Farbe, $Farbe, $Farbe); 
						//}
					break;
			}
			break;

		case "MILIGHT":
		   $Wartezeit = 200;
			switch ($Aktorart){
			   case "RGB":	
			   		if (getvalue (IPS_GetVariableIDByName("Brightness", $ZielID)) == $ValueNew){goto Ueberspringen;}else{		
			   			if ($ValueNew == true){$State = 2;}else{$State = 0;}
			   			MILIGHT_SetState ($ZielID, $State);
						} 															
					break;
			}
			break;

		}


	// Wartezeit zwischen den Befehlen
	IPS_Sleep ($Wartezeit);

	goto Ende;
	
Ueberspringen:
	// Wenn der Aktor schon den richtigen Zustand hat, dann wird dieser übersprungen.
	$Wartezeit = 20;	

Ende:
// Ende der Funktion	

}





// Abfrage ob, das Ziel ein Aktor ist.
// -----------------------------------------------------------------------------
function SchalterAbfrage ($SchalterID, $ValueNew){

//$Wartezeit = 300;

	// Bezeichnung auslesen
	$Bezeichnung = IPS_GetName ($SchalterID);
	$WertAktuell = getvalue ($SchalterID);

	// Abfrage ob Codezeichen @ vorhanden ist. Dieses Steht für einen Schalter
	if(preg_match("/@/",$Bezeichnung)) {

		// Trennen nach Bezeichnung und nach ID
		list($Name, $Rest) = explode(" @ ", $Bezeichnung);
		list($Art, $Hersteller, $ZielID) = explode(" - ", $Rest);

		SchaltenHersteller ($SchalterID, $ValueNew);
  	}

// Ende der Funktion
}




// Aktualisiert die Werte in der Baumstruktur nach unten
// -----------------------------------------------------------------------------
function NachUntenAktualisieren ($IDStart, $ValueNew){
	// Schaltet alle nach Unten
	foreach (IPS_GetChildrenIDs($IDStart) as &$Unterobjekt) {

		// Abfrage ob Unterobjekt ein Schalter ist
      SchalterAbfrage ($Unterobjekt, $ValueNew);

		// Setzt den neuen Wert an alle unterlegenen Values
		setvalue ($Unterobjekt, $ValueNew);

		// Ruft die Funktion in sich wieder auf bis es nichts mehr gibt
		NachUntenAktualisieren ($Unterobjekt, $ValueNew);

	}
}



// Aktualisiert die Werte in der Baumstruktur nach oben
// -----------------------------------------------------------------------------
function NachObenAktualisieren ($StartID){
	// Eltern IDs abfragen
	$Eltern   = IPS_GetParent ($StartID);
	$Nachbarn = IPS_GetChildrenIDs ($Eltern);
	$AnzahlAn = 0;

	// Wenn der Oberste Ebene geschalten wird, dann sofort beenden
	if (IPS_GetName ($StartID) == "Alle"){goto EndeFunktion;}else{}
//	if ($StartID == $ObereID){goto EndeFunktion;}else{}


	// Für jede Nachbar Variable abfragen ob diese true ist
	foreach ($Nachbarn as &$value) {
		if (getvalue ($value) == true){$AnzahlAn ++;}else{}
	}

	// Wenn Anzahl >0 ist dann die Übergeordnete Variable einschalten
	setvalue ($Eltern, $AnzahlAn);

	// Funktion wieder erneut aufrufen
   NachObenAktualisieren ($Eltern);

EndeFunktion:
}



?>

Anschließend noch das Schaltscript

<?
// Funktionen für Gruppenschaltung einbinden
include '14882 /*[Gruppenschaltung\function Gruppenschaltung]*/.ips.php';   // Funktionen

// Welche Gruppe geschalten werden soll
$ID 			= $_IPS['VARIABLE'];
$Schaltwert 	= $_IPS['VALUE'];

// Webfront aktualisieren
setvalue($ID, $Schaltwert);

// Schaltvorgang ausführen
Schalten ($ID, $Schaltwert);




?>

Dieses script muss bei jeder Variable vorhanden sein.
wie hier im Bild
BBB.png

Es funktioniert so, dass alle Childs übergeben werden.
Das script schaut nach ob Istzustand = sollzustand, wenn ja dann wird übersprungen zur nächsten.
Wenn nicht dann kommt der Schaltbefehl.
Zwischen den Befehlen ist noch eine kleine Wartezeit (abhängig vom Hersteller der geschalten wird)
Dann wird der Status der Variable an die Parents weitergegeben.

Zum Testen bitte über das Webfront schalten. Wenn ihr direkt die Variablen in der Console ändert, passiert nichts, wegen dem Actionscript

Ich nutze das Script bei mir seit über einem Jahr und habe ca. 50 Lichter.

Viele Grüße tommy86