Status einer untergeordneten Struktur

Hallo,

Ich wuerde gerne folgendes darstellen (im WebFront, aber das ist im Prinzip unabhaengig, sobald es in einer Variable ist):

Licht EG: An/Aus
Licht OG: An/Aus

Allerdings soll sich das jeweils nicht auf ein einzelnes Licht beziehen, sondern auf alle Lichter des betreffenden Geschosses. Licht EG soll also An sein, sobald irgendein beliebiges (oder auch alle) Lichter im EG angeschalten sind. Selbiges fuer OG. Anders gesagt, der Status soll nur dann Aus sein, wenn alle Lichter auch aus sind.

Die Lichter sind jeweils KNX Instanzen, und im IPS in einer entsprechenden Baumstruktur durch Kategorien angelegt.

Was mir nun fehlt ist eine gute Idee wie ich das realisieren koennte? Pro Geschoss sind das so 10-15 Lichter/Instanzen, und das wird etwas muehsam wenn ich bei jedem einzelnen Licht einen Trigger-Event machen muss, der dann ein Script aufruft, dass den Status aller Lichter des jeweiligen Geschosses abruft und daraufhin die Statusvariable setzt.

Vielleicht hat ja jemand dafuer eine bessere Loesung/Idee zur Realisierung?

Meine Idee das zu lösen wäre:

1 x Skript für Aktionsskript und Eventauswertung je Geschoss
1 x Variable mit Profil für das AN/AUS
n x Ereignisse auf Änderung erstellen (Jeweils pro Instanzvariable klemmen in dem Geschoss zu dem Skript oben)

Im Skript dann je nach $_IPS[‚SENDER‘] arbeiten:

WebFront

-> An/Aus über alle unter dem Skript liegenden Ereignisse, und deren Variablen und dann deren Parents senden

Ereignis

-> Aktuellen Wert über alle unter den Skript liegenden Ereignisse und deren Variablen verknüpfen

Execute

-> Falls du Faul sein willst, lässt du per „Installer“ die notwendigen Ereignisse einfach an alle Instanzen unter Kategorie X erstellen

paresy

Moin…

… ich hätte auch noch was. Du könntest Dir mit folgendem Skript anzeigen lassen wie viel Lampen pro Etage an sind und diesen Wert für Deine MASTER-VARIABLE nehmen. Ist der Wert >0 schaltest Deine EG / OG Variable auf EIN… <0 auf FALSE.

Du kannst dazu für jede BOOL-Variabel eine Ereignis auf Änderung nehmen zum triggern des Skriptes oder das Skript z.B alle 2 Sekunden ausführen.
So mache ich das. Das Skript so läuft bei mir 8ms … also nix.

Gruß,
Peter

PS: Aber bitte nicht über das Skript lachen, bin ein PHP-MONGO ( siehe Profil ) ! :smiley:


<?

$badL1 = 49410 /*[EIB/KNX\EG GÄSTEBAD\BAD Deckenlampe (L1)\Value]*/;
$badL2 = 45258 /*[EIB/KNX\EG GÄSTEBAD\BAD Wandlampe (L2)\Value]*/;
$badL3 = 11170 /*[EIB/KNX\EG GÄSTEBAD\BAD Duschspots (L3)\Value]*/;

$flurL1 = 22740 /*[EIB/KNX\EG FLUR\LICHT\FLUR Deckenlampe Garderobe (L1)\Value]*/;
$flurL2 = 28626 /*[EIB/KNX\EG FLUR\LICHT\FLUR Wandlampe Garderobe (L2)\Value]*/;
//$flurL3 =
$flurL4 = 24443 /*[EIB/KNX\EG FLUR\LICHT\FLUR Eingang Wandlampe (L4)\Value]*/;
$flurL6 = 45662 /*[EIB/KNX\EG FLUR\LICHT\FLUR Wandlampe Treppe (L6)\Value]*/;
//$wohnzL1 =
//$wohnzL2 =
$wohnzL3 = 28406 /*[EIB/KNX\EG WOHNZIMMER\WOHNZIMMER WANDLAMPEN\Value]*/;

$kuecheL4  = 36365 /*[EIB/KNX\EG KÜCHE\LICHT\LICHT/KÜCHE/KICKER/DECKE L4\Value]*/;
$kuecheL6 = 32279 /*[EIB/KNX\EG KÜCHE\LICHT\Kickertisch Wand (L6)\Value]*/;
$kuecheL7 = 32992 /*[EIB/KNX\EG KÜCHE\LICHT\Kochinsel (L7)\Value]*/;
$kuecheL8 = 34646 /*[EIB/KNX\EG KÜCHE\LICHT\Durchgang (L8)\Value]*/;
$kuecheL9 = 13967 /*[EIB/KNX\EG KÜCHE\LICHT\Arbeitsfläche (L9)\Value]*/;

$essbL11 = 51342 /*[EIB/KNX\EG ESSBEREICH\ESSBEREICH Deckenlampe (L11)\Value]*/;
$essbL13 = 19821 /*[EIB/KNX\EG ESSBEREICH\ESSBEREICH Wandlampe (L13)\Value]*/;
$essbL14 = 50184 /*[EIB/KNX\EG ESSBEREICH\ESSBEREICH Bodenstrahler\Value]*/;
$essbS153 = 41069 /*[EIB/KNX\EG ESSBEREICH\SCHUKO\ESSBEREICH SCHUKO S15.3 Bogenlampe\Value]*/;

$BoolVariablen = array ($badL1,$badL2,$badL3,$flurL1,$flurL2,$flurL4,$flurL6,$wohnzL3,$kuecheL4,$kuecheL6,$kuecheL7,$kuecheL8,$kuecheL9,$essbL11,$essbL13,$essbL14,$essbS153);  //ID's der Boolvariablen
$Zaehler = 0;

foreach ($BoolVariablen as $ID)
	{
  		if (GetValue($ID)) $Zaehler++; //wenn true eins hochzählen
	}
$zaehler_alt = GetValue(53885 /*[SKRIPTE\LICHT COUNTER 2.0\EG LICHT EIN (Anzahl)]*/);
if ($zaehler_alt!==$Zaehler)
	{
		SetValue(53885 /*[SKRIPTE\LICHT COUNTER 2.0\EG LICHT EIN (Anzahl)]*/, $Zaehler);
	}

//print_r ($BoolVariablen);

?>

IPSLight von Brownson :cool:

Teil der IPSLibrary

Gruß
Bruno

Ich bin zwar auch nur Hobbyscripter, aber ich bring mal mein Script. Das habe ich jeweils pro Ebene.

<?
$debug = false;
$Events = IPS_GetScriptEventList($_IPS['SELF']);
if ($debug)
  print_r($Events);

for ($number= 0;$number < count($Events);$number++) {
  foreach(IPS_GetEvent($Events[$number]) as $key => $element) {
    if ($key == 'TriggerVariableID') {
      $type = IPS_GetVariableType($element);
      switch ($type) {
        case "Boolean": $result = GetValueBoolean($element);        break;
        case "Integer": $result = GetValueInteger($element);        break;
      }
      if ($debug)
		  echo "Event: ".$key." -> ".$element ." : " . $result . "
";
      if ($result) {
        SetValueBoolean(15794 /*[Visualisierung\LichtAnEG\LichtAnEG]*/, True);
        return;
      }
    }
  }
}
SetValueBoolean(15794 /*[Visualisierung\LichtAnEG\LichtAnEG]*/, False);

?>