Script anlegen mit Namen „function Gruppenschaltung“
<?
// -----------------------------------------------------------------------------
// Die Hauptfunktion, die die unteren Funktionen aufruft
// by Thomas Pößnecker
// -----------------------------------------------------------------------------
function Schalten ($StartID, $ValueNew){
set_time_limit(200); // Timeout setzen damit auch alle Lichter geschalten werden
setvalue($StartID, $ValueNew);
// Debug Zeit
//$beginn = microtime(true);
NachUntenAktualisieren ($StartID, $ValueNew);
IPS_Sleep(0);
SchalterAbfrage ($StartID, $ValueNew);
IPS_Sleep(0);
NachObenAktualisieren ($StartID);
// Nochmal aktualisieren wegen überschneidungen
IPS_Sleep (100);
setvalue($StartID, $ValueNew);
//NachObenAktualisieren ($StartID);
// Debug Zeit
//$dauer = round(((microtime(true) - $beginn) * 1000),2);
//setvalue (13655 /*[System Dienste\Debug Varialben Info\Debug Variable]*/, "$dauer ms");round($VorgabeID / 100 * 255 , 0)
}
// Schaltvorgänge
// -----------------------------------------------------------------------------
function SchaltenHersteller ($SchalterID, $ValueNew){
$Bezeichnung = IPS_GetName ($SchalterID);
list($Name, $Rest) = explode(" @ ", $Bezeichnung);
list($Aktorart, $Hersteller, $ZielID) = explode(" - ", $Rest);
// Zusätzliche Aufteilung, wenn die Lampe eine RGB Lampe ist dann Zustätzlich schauen, welche Einschaltfarbe
if ($Aktorart == "RGBW" or $Aktorart == "RGBC") {list($ZielID, $VorgabeID) = explode(" | ", $ZielID);}else{}
// Je Nach Typ und Hersteller schalten
switch ($Hersteller){
case "HOMEMATIC":
$Wartezeit = 5;
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 = 5;
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 "SHELLY":
$Wartezeit = 0;
switch ($Aktorart){
case "PLUG":
if (getvalue (IPS_GetVariableIDByName("Status", $ZielID)) == $ValueNew){goto Ueberspringen;}else{}
Shelly_SwitchMode ($ZielID, 0, $ValueNew);
break;
case "SWITCH":
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);
FS20_SwitchMode ($ZielID,$ValueNew);
break;
}
break;
case "PROJET":
$Wartezeit = 0;
switch ($Aktorart){
case "RGBC":
$White = getvalue (IPS_GetVariableIDByName("White", $ZielID));
$Color = getvalue (IPS_GetVariableIDByName("Color", $ZielID));
if ($ValueNew == true){
// Einschaltfarbe aus Variable lesen umrechnen und dann setzen
$zahl = dechex(getvalue ($VorgabeID));
$zahl = str_pad($zahl, 6 ,'0', STR_PAD_LEFT);
$r = hexdec(substr($zahl, 0, 2));
$g = hexdec(substr($zahl, 2, 2));
$b = hexdec(substr($zahl, 4, 2));
PJ_SetRGBW ($ZielID, $r, $g, $b, $White);
}
if ($ValueNew == false) {
PJ_SetRGBW ($ZielID, 0, 0, 0, $White);
}
break;
case "RGBW":
// Bei Weis warten bis Farbe erstmal fertig ist
IPS_Sleep(100);
$White = getvalue (IPS_GetVariableIDByName("White", $ZielID));
$Color = getvalue (IPS_GetVariableIDByName("Color", $ZielID));
if ($ValueNew == false) {
$zahl = dechex($Color);
$r = hexdec(substr($zahl, 0, 2));
$g = hexdec(substr($zahl, 2, 2));
$b = hexdec(substr($zahl, 4, 2));
PJ_SetRGBW ($ZielID, $r, $g, $b, 0);
}
if ($ValueNew == true){
$zahl = dechex($Color);
$r = hexdec(substr($zahl, 0, 2));
$g = hexdec(substr($zahl, 2, 2));
$b = hexdec(substr($zahl, 4, 2));
PJ_SetRGBW ($ZielID, $r, $g, $b, round(getvalue($VorgabeID) / 100 * 255 , 0));
}
break;
}
break;
case "MAGICHOME":
$Wartezeit = 0;
switch ($Aktorart){
case "RGB":
if (getvalue (IPS_GetVariableIDByName("Aktiv", $ZielID)) == $ValueNew){goto Ueberspringen;}else{}
if ($ValueNew == true){
MHC_SetPower($ZielID, true);
}
if ($ValueNew == false){
MHC_SetPower($ZielID, false);
}
break;
}
break;
}
goto Ende;
Ueberspringen:
// Wenn der Aktor schon den richtigen Zustand hat, dann wird dieser übersprungen.
$Wartezeit = 0;
Ende:
IPS_Sleep ($Wartezeit);
// Ende der Funktion
}
// Abfrage ob, das Ziel ein Aktor ist.
// -----------------------------------------------------------------------------
function SchalterAbfrage ($SchalterID, $ValueNew){
// 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:
}
?>
Script anlegen mit dem Namen „schalter script“
!! Achtung: include ID muss angepasst werden an die vom Script „function Gruppenschaltung“ !!
// Funktionen für Gruppenschaltung einbinden
include '35953 /*[System Dienste\Globale Funktionen\globale Functionen]*/.ips.php'; // Globale Funktionen einbinden
// Welche Gruppe geschalten werden soll
$ID = $_IPS['VARIABLE'];
$Schaltwert = $_IPS['VALUE'];
// Schaltvorgang ausführen
Schalten ($ID, $Schaltwert);
Baum anlegen:
oberste Bool Variable muss „Alle“ heißen. Damit ist das Obere Ende benannt.
in der Variable bei eigene Aktion das script mit dem Namen „schalter script“ auswählen.
diese Variable kann nun einfach kopiert werden und dann nach belieben verschachtelt werden. Keine weitere Begrenzung.
Benennen kann man diese auch wie man will.
Damit sind die Gruppen angelegt.
Will man ein Gerät schalten auch einfach die Variable kopieren und am Ende des Namen folgendes Anhängen
@ Aktorart - Hersteller - ID
Welche es gibt findet man ganz einfach im ersten Script.
Dies kann auch ganz einfach für andere Hersteller und Typen erweitert werden.
Leider kann ich kein Modul schreiben. Würde mich aber freuen wenn jemand das kann. Bzw über Änderungen und Optimierungen freue ich mich auch.
Wer will kann es einfach mal ausprobieren.