Eingeschaltete Lampen ermitteln und zählen

Hallo zusammen,

ich habe eine Frage, gibt es eine relativ einfache Möglichkeit eingeschaltete Lampen zu ermitteln und diese zu zählen?
Könnte man z.B. alle Lampen unterhalb einer Kategorie verlinken und diese dann zählen, kann man da den Status auch irgendwie ermitteln?

Das wäre halt der einfachste Weg wie ich die verschiedensten Lampen die mit unterschiedlicher Hardware gesteuert werden zusammenfassen könnte.

Nur weiß ich nicht ob das überhaupt geht. Hat jemand hier schon andere Ansätze?

Vielen Dank und Grüße
Stephan

du könntest beim STatus ein Ereignis anhängen und beim einschalten eine Variable hochzählen und beim ausschalten wieder runter zählen… nur wenn es mal „unsyncron“ wird ist doof… oder pro Lampe eine Variable und die dann addieren… aber schön ist auch anders. Wenn alle den selben Status-Namen haben könnte man ein Script schreiben.

Da kommst du an einem Skript wohl nicht vorbei.

Ich würde mir in einem Skript pro Hardwareausprägung ein Array mit den zu überprüfenden IDs der Statusvariablen machen und dann einfach durchgehen, auswerten und aufaddieren.

Das ist sicherlich der einfachste Weg. Er ist nicht high sophisticated, aber praktikabel :slight_smile:

eine Kategorie mit Links auf den Status aller zu zählenden Lampen, vorrausgesetzt sie haben alle True für AN , dann ein Script dazu, das wäre komfortabler… kommt eine Lampe hinzu, einfach nur einen Link in die Kategorie

Vielen Dank für die Antworten.

Habe den schon etwas in die Jahre gekommenen Thread gefunden.

Der Vorschlag hier ist mir nicht ganz klar wie das funktionieren soll.

foreach(IPS_GetInstanceList() as $item){   // alle Unterobjekte
	$M = IPS_GetInstance($item);
   $MInfo = $M['ModuleInfo'];
	if ($MInfo['ModuleName'] == "FS20") {
   	$O = IPS_GetObject($item);
      //print_r(IPS_GetChildrenIDs($item));
      foreach(IPS_GetChildrenIDs($item) as $item_2){
         $name = IPS_GetName($item_2);
	   	//echo "Name: ".$name."
";
	   	if ($name == "StatusVariable"){
	   	   if (GetValue($item_2) == True){
	   			echo "ID: " . $item .  " " . $O['ObjectName'] . "
";
				}
			}
 	   }
   }
}

Oder ich verwende das von hier, da muss ich halt alle ID´s manuell eintragen:

<?
$BoolVariablen = array (53178,58423,12521,40145 ,32406,12001);  //ID's der Boolvariablen
$Zaehler = 0;

foreach ($BoolVariablen as $ID){
  if (GetValue($ID)) $Zaehler++; //wenn true eins hochzählen
}

echo $Zaehler
?>

Du kannst das hier benutzen, und musst nur mitzählen (bei $NewValue=true) :slight_smile:

Michael

mach es einfach so:
image
Inhalt vom Zähler-Script ist

<?
$zaehlerstand = 0;
$Kinder     = IPS_GetChildrenIDs(IPS_GetParent($_IPS['SELF']) ); ;
foreach ($Kinder as $kind) {
    $objekt = IPS_GetObject($kind);
    verarbeiteObject($objekt);

}
SetValueInteger(34499,$zaehlerstand);
function verarbeiteObject($ZObjekt)
{
    global $zaehlerstand;
    if ($ZObjekt["ObjectType"] == 6) // Wenn Link hole Original-Objekt
        { 
		  $newObjID = IPS_GetLink($ZObjekt["ObjectID"])["TargetID"];
		  $newobj = IPS_GetObject($newObjID);
        if ($newobj["ObjectType"] == 2) // Ziel war Variable
        {
            if (GetValueBoolean($newObjID)) {$zaehlerstand++;}
     	  }
        }
    
    
}
?>

und in die selbe Kategorie linkst du alle „Status“-Variablen der Lampen

Jetzt gilt es nur den richtigen Zeitpunkt rauszufinden, wann du zählen willst :wink:

Hi Michael,

vielen Dank für deinen Link, habe ich probiert und klappt super. Etwas aufwändig zwar mit den ganzen Ereignissen aber es erfüllt seinen Zweck. Wirklich super.

@Hagbard235

An sich gefällt mir das sehr gut, ist ja in etwa das was ich im ersten Beitrag gesucht habe.

Ich müsste also jede gewünschte Status Variable in diese Kategorie verlinken. Was den Zeitpunkt deds zählens betrifft, könnte ich ja auch zyklisch machen, oder? Also jede Minute das Skritpt ausführen, richtig?

Grüße
Stephan

Genau, entweder zyklisch oder bei Variablen-Änderung, aber das wäre wieder doppelt, dann könntest du auch gleich zählen…
du kannst auch, wenn du es im Webfront haben willst, dann aufrufen, wenn die Webfront-Seite geöffent wird oder so.
Und mit dem Verlinken ist genau richtig, direkt die Status-Variable verlinken und gut ist. Kannst auch sonst was zählen, Türen, Fenster … hauptsache es ist Boolean.

Ok mega, da habt ihr mir sehr geholfen. VIELEN DANK!

Einen schönen Abend noch!

Du kannst auch ein Script erstellen und dann darunter alle Licht Ausgänge als Event. Wenn das Script ausgeführt wird
Foreach Event die Quelle nachschauen, wenn true dann Zähler +

Dann brauchst du keine Links und bei jeder Änderung ist es auf dem aktuellen Stand

aber sehr viele Events, die wollte ich mit der Lösung vermeiden, nimmt sich glaube ich nicht sonderlich viel vom manuellen Aufwand, aber ich weiß immer nicht wie stark Events das System belasten.

Vielleicht kann @paresy ja was dazu sagen, wie Events umgesetzt sind, bzw. wie sie das System belasten (also „ausgelöste Ereignisse bei Variablenänderung“)

Ja das wäre echt interessant. Ich habe auch mehrere 100 Events. Bis jetzt noch nichts gemerkt

Die Ereignisse selber sind doch gar nicht das Thema, sondern was damit angesteuert wird.
Wenn du 100 Ereignisse hast welche jede eine Variable oder Gerät schalten oder 10 Ereignisse welche alle 10 Sekunden große Skripte starten, welche auch laaange laufen, dann sind die Ereignisse das kleinste Problem.
Von daher ist eine Aussage dazu bestimmt schwierig bis unmöglich.
Grundsätzliche: Lieber Triggerbasierte Events, als alle 5 Sekunde pollen.
Michael

100 Trigger-Events sind doch gar kein Problem. Wie Nall-Chan schon sagte sind 100 zyklische Events jede 5 Sekunden eher ungünstig für die Performance (und selten sinnvoll!)

Hast du dir mal das Modul „Aktivliste“ angesehen? Willst du wirklich einen Counter haben? Oder würde dir eine Liste mit allen wirklich aktiven Lampen auch ausreichen? Meistens will man ja genau diese sehen, um schnell zu prüfen, ob noch etwas an ist.

paresy

Ja die hatte ich gesehen. An sich gut, allerdings muss ich da jede einzelne Variable recht mühsam hinzufügen. Das mit den Links gefällt mir im Moment besser.

Die Frage zielt darauf ab, ob ein angelegtes Event „Ressourcen verbraucht“ weil im Hintergrund etwas gepollt wird oder sonst etwas, oder ob es erst Ressourcen frisst, wenn es ausgelöst wird.

Kurze Antwort: Nur, wenn es ausgelöst wird.

Lange Antwort: Natürlich verbraucht es auch in gewisser Weise Ressourcen - aber diese ins im Vergleich zu zyklischen Ereignissen Vernachlässigbar :slight_smile:

paresy

Hallo und vielen Dank das Script:
Ich habe hierbei nur das Problem, das ich die Childrens aus 3 verschiedenen Kategorien in der max. Strukturtiefe ermitteln möchte und nicht nur die Childs aus der aktuellen Kategorie…
Wie kann dieses realisiert werden?

Viele Grüße, Yansop.

das Script für jede Kategorie einmal ausführen und dann zusammen addieren?