Etagenlicht

Da ich das Script nie komplett gepostet hatte, sondern immer nur Auszüge, gibt es das jetzt mit Erklärungen hier im Thema.

Dieses Script ist universell und braucht nicht zu verändert werden.
Es bezieht alle Informationen aus den zugehörigen Ereignissen und Namen der Objekte.
Hintergrund war eine wartungsarme Umsetzung, so das einfach durch hinzufügen von Ereignissen neue Aktoren mit in eine Etage / Gruppe aufgenommen sind.


<?php
/*
Einmalig:
----------
Kategorie erzeugen, Script anlegen und diesen Inhalt einfügen.
Script verstecken.
Kategorie beliebig verlinkten, oder später die Etagenvariablen verlinken, für die Visualisierung im WebFront.


Pro Etage:
----------
Variable in IPS vom Typ bool anlegen.
Namen für Etage/Gruppe vergeben. z.B. 'Keller'
Profil ~Switch eintragen.
Dieses Script hier als Aktionsskript auswählen.

Pro Gerät:
----------
Auslösendes Ereignis in IPS anlegen.
Auslösen bei Wertänderung der Variable vom Gerät.
Als Ziel dieses Script eintragen. 
Ereignis dem Namen von der Etage geben. z.B. Keller
*/
if ($_IPS['SENDER']=="WebFront" || $_IPS['SENDER']=="RunScript" || $_IPS['SENDER']=="Action") // Nur über WebFront, IPS_RunScriptEx oder RequestAction
{
	if (!$_IPS['VALUE']) // nur ausschalten erlauben
	{
		SetValue($_IPS['VARIABLE'], $_IPS['VALUE']); // Variable Etage aktualisieren
		$EtagenNamen=IPS_GetName($_IPS['VARIABLE']);
		$Events=array();
		foreach (IPS_GetChildrenIDs($_IPS['SELF']) as $ObjectID) // Alle Unterobjekte
		{
			if ((IPS_GetName($ObjectID)==$EtagenNamen) && (IPS_GetObject($ObjectID)['ObjectType']==4)) // Wenn Objekt Ereignis ist und den Namen von der Etage hat
			{
				$TriggerVariableID = IPS_GetEvent($ObjectID)['TriggerVariableID']; // VariableID vom Ereignis holen
				IPS_SetEventActive($ObjectID,false); // Ereignis deaktivieren, damit Teil 2 nicht ausgeführt wird
				$Events[]=$ObjectID;
				switch (IPS_GetVariable($TriggerVariableID)['VariableType']) // Typ der Variable
				{
					case 0: //bool
						$Value = false;	 
					break;
					case 1: // int
					case 2: //float
						$Value = 0;
					break;
					case 3: // string
						die ('String nicht unterstützt');
					break;
				}
				RequestAction($TriggerVariableID,$Value);
			}
		}
		IPS_Sleep(1000); // Kurz warten
		foreach ($Events as $ObjectID)
		{
			IPS_SetEventActive($ObjectID,true); // Ereignis wieder aktivieren
		}
	}
}
elseif ($_IPS['SENDER']=="Variable") // Wenn sich ein Licht in der Etage ändert (auslösendes Ereignis
{
	$EtagenNamen=IPS_GetName($_IPS['EVENT']); // Name vom Ereignis
	$EtagenVariableID= IPS_GetObjectIDByName($EtagenNamen,IPS_GetParent($_IPS['SELF']));
	$NewValue=false; // Variable vorbelegen mit false (oder Verknüpfung im switch)
	foreach (IPS_GetChildrenIDs($_IPS['SELF']) as $ObjectID)
	{
		if ((IPS_GetName($ObjectID)==$EtagenNamen) && (IPS_GetObject($ObjectID)['ObjectType']==4))  // Wenn Objekt Ereignis ist und den Namen von der Etage hat
		{
			$TriggerVariableID = IPS_GetEvent($ObjectID)['TriggerVariableID']; // VariableID vom Ereignis holen
			switch (IPS_GetVariable($TriggerVariableID)['VariableType']) // Typ der Variable
			{
				case 0: //bool
					if (GetValueBoolean($TriggerVariableID)) $NewValue=true;
				break;
				case 1: // int
				case 2: //float
					if (GetValue($TriggerVariableID) > 0) $NewValue=true;
				break;
				case 3: // string
					die ('String nicht unterstützt');
				break;
			}
		}
	}
	SetValueBoolean($EtagenVariableID,$NewValue); //Etagenvariable setzen
}

Michael

Hi Michael,

das ist ne feine Lösung, die richtig gut funktioniert. Ich hatte nur mehrere Probleme mit der WebKonsole. Da hatte ich diverse Fehler.
Bin dann auf die alte Konsole und dann hatte ich keine Fehler mehr.

Vielen Dank für die schnelle und hervorragende Hilfe

Gesendet von iPhone XS mit Tapatalk

Hallo Michael,

ich habe dein Etagenlicht nach Anleitung (Variable Bool + ~switch + Actionsscript) eingerichtet. Wenn ich ein Licht in einer Etage anschalte springt der Switch von off auf on und umgedreht beim ausschalten.
Sollten alle Lichter einer Etage auch über den Switch ausgeschalten werden, wenn ich im Webfront „Off“ drücke?. kommt nämlich immer nur " X Fehler".

Gruß

Oliver

Mal ausprobiert. Hab nen paar locken wegen Eltako Unzulänglichkeiten (da müsste ich was ändern) aber sonst geht es.

Ich hatte mir auch sowas gebastelt. Mein Ansatz war mit Link der Lampen in einer Kategorie. Mein Script hat dann eine Summen variable aktualisiert (Anzahl eingeschalteter Lampen) bzw. die Links dann zum gezielten Schalten ein geblendet wenn sie noch eingeschaltet sind.

Vielleicht könnte man mit dem Pop-Up Modul was machen damit es bei mir kompakter wäre. Aber das Modul hat keine Variable. Schade eigentlich.

Hi,

danke erstmal für das Script. Ich spiele gerade damit herum und wirft mein gesamtes Konzept über den Haufen … :slight_smile:

Meine Frage ist, wie wäre der Ansatz wenn ich zu einem meine Bewegungsmelder zusammen fassen würde
und entsprechende Lichtaktoren damit Ein.-/Ausschalten möchte.

Mein Gedanke wäre unter dem Script als Ereignis alle BWM darunter anzulegen und dann ??
Ein weiteres Etagen Lichtscript anlegen was durch das Etagen BWM-Script aufgerufen wird und den Ein bzw. Ausschaltwert
mit übergeben wird ???

Ich hab da gerade keine Sinnvolle Idee dazu ?

Gruß
MacToolz

Ja, das sollte funktionieren.
Kann es sein das vor oder nach den PHP-Tag noch Leerzeilen sind? Dann lösch die bitte raus.

Das Script ist ursprünglich nur dafür gedacht bequem im WebFront einen Überblick und eine Summenvariable pro Etage zu bekommen.
Die Basis kannst du natürlich auch zum ein und ausschalten durch andere Ereignisse wie die Bewegungsmelder nutzen.

Würde ich dazu aber unabhängig von dem obigen Script in IPS umsetzen.

Im Prinzip brauchst du auch nur die Verknüpfung in Richtung Bewegungsmelder (Name vom Ereignis) zum Aktor. Bei dem Script oben wird es ja in beide Richtungen benutzt (Aktionsvariable zu allen Aktoren und Ereignisse der Aktoren zu Aktionsvariable).
Michael

Da kann ich leider nicht folgend, hab nicht verstanden was du damit genau meinst ?

Gruß
MacToolz

@Nall-chan
Einfach mal Danke für dieses super einfache und sehr nützliche Script, einfacher Lichtergruppen zu regeln geht wohl nicht. :slight_smile:

@mactoolz
Willst du das einfache deaktivieren der Bewegungsmelder erreichen ?

Hi,

also mein aktuelles Script hat einiges an Funktionen schon mehr im gesamten Umfang als gedacht.
Momentan bin ich aber noch an den Feinheiten dran.

Danke der Nachfrage …

Gruß

Da ich mittlerweile Shellys(RGBW2) für meine LEDs verwende (anstatt zuvor HM-Steckdosen), funktionierte das Etagenscript leider nicht für die Shelly-LEDs.

Nun gut ich verwende anstatt die 4 Kanäle/Variablen(bool) einzeln zu schalten, eine eigene Zustands Variable(int) für verschiedene Beleuchtungsstufen.

Somit musste ich die [case 1: // int] Zeilen anpassen, und außerdem wechseln von:

                #IPS_RequestAction(IPS_GetParent($TriggerVariableID),IPS_GetObject($TriggerVariableID)['ObjectIdent'],$Value

auf:

                RequestAction($TriggerVariableID,$Value);

da ein [IPS_RequestAction] hier nicht funktioniert (auch wenn manuell ein IDENT der Variable hinzugefügt wurde).

Sehe bis jetzt zumindest keine Nachteile, außer das die LEDs nun auch mit abschalten.

Danke für den Hinweis mit dem RequestAction, das hatte ich zu Zeitpunkt gar nicht bedacht und ist natürlich viel sinnvoller.
Muss ich morgen nachher mal korrigieren.
Michael

Ist es nicht exakt dasselbe wie das Modul „Aktivliste“ aus dem Modulstore?

Keine Ahnung, das Script habe ich ursprünglich zu IPS 2.7/3.1 daheim eingerichtet. Und halt nie wieder angefasst oder etwas vergleichbares gesucht.
Michael

Hi Michael,

vielen Dank für das schöne Skript. Wäre es möglich, es so zu erweitern, dass auch HM-Aktoren gesteuert werden könnten und man (ggf. über einen Namenszusatz - z.B. „rev“ oä) dafür sorgen könnte, dass ein Aktor „anders herum“ schaltet (HM-Rolladenaktoren haben die „Level“-Variable (Float), die auf 100 ist, wenn der Rolladen eingefahren ist, und auf <100, wenn der Rolladen nicht eingefahren ist)?

Dann könnten Jalousien gruppenweise entsprechend angesteuert werden (z.B. wenn sie bei automatischer Beschattung z.T. ausgefahren sind und alle eingefahren werden sollen…).

Vielen Dank und Grüße, Götz

Ich nutze es mit Homematic, da muss nichts angepasst werden.
Es geht mit jeder Schaltbaren Variable, dafür habe ich das Script auf den Befehl RequestAction(VarId,Value) umgebaut.

Da dieses Script explizit als Etagenlicht gedacht ist, werde ich da bestimmt Rollläden mit steuern :smiley:
Zumal das Script auch nur eine ‚Alles aus‘ aber keine ‚Alles an‘ Funktion hat.

Dafür gibt es von bumaas ein tolles ‚Blind Control‘ Modul im Store :slight_smile:
[Modul] Rollladensteuerung (BlindControl)
Michael

PS: Invertierung funktioniert bei den Icon, den Sprachassistenten und dem Blind-Control über das VariablenProfil.
Link 1: Icons — IP-Symcon :: Automatisierungssoftware (Abschnitt IconTyp)
Link 2: GitHub - bumaas/BlindControl: Steuerungsmodul für Rollläden

Vielen Dank für die hilfreichen Hinweise, Michael! Dann schaue ich mal mit dem Modul… :slight_smile: