Statusanzeige für mehrere Lichter - Triggern, Pollen oder Alternative?

Hallo zusammen,

ich suche eine einfache Lösung für folgende Problematik:

In Haus befinden sich auf insgesamt 4 Etagen diverse HM-gesteuerte Beleuchtungen.
Es soll eine zentrale Statusanzeige realisiert werden die mit VIER Lämpchen anzeigt in welcher Etage evtl. noch Licht brennt.
Dies soll möglichst zeitnah (idealerweise sofort) bei Änderungen erfolgen.

Zwei Lösungswege sind mir bekannt:

  • in IPS jedem „Status“ einen Event auf Änderung zuordnen der ein Sammelscript aufruft
  • nur ein Sammelscript das in regelmäßigen Abständen die Stati prüft (Polling)

Version 1 ist aufwändig bei insgesamt >30 Verbrauchern und variablenfressend
Version 2 ist wegen der Verzögerungen „unschön“

Frage: gibt es eine Version 3 auf die ich nur nicht komme?

Danke fürs Mitdenken
Alexander

Hallo,

Eine weitere Variante fällt mir nicht ein. Aber Version 1 ist doch absolut ok? Ich sehe auch nicht die Notwendigkeit, mehr als 4 Variablen ( 1 pro Etage ) benutzen zu müssen. Du machst pro Etage ein Aktionsskript, das Du bei Änderung jedes Status / Level Deiner HM Komponente laufen lässt. Dann prüfst die Summe der Level ( Bei Dimmern ) bzw. die Status-Variablen bei Schaltern und setzt je nach Ergebnis die EtagenVariable auf TRUE oder FALSE. Bei der Aktion hilft u.U. die Verwendung eines Arrays für die IDs und eine Schleife - dann wird’s übersichtlicher und Du bist flexibel, wenn neue AKtoren hinzukommen.

Gruß
Walter

Hallo

Ich habe so etwas über Zähler-Variablen gelöst.
Wenn ein Aktor eingeschaltet wird , wird eine Variable um eins erhöht und umgekehrt.
Wenn die Variable > 0 dann StatusLed an ansonsten aus. Klappt bisher problemlos

Oliver

Sowas brauche ich auch noch.
Gibt es zufällig iwo ein Beispielscript?

Kann man nicht evtl. auch ein array aus den Etagen-Staten bilden und gucken ob >1 oder so!?

Also das ist meine Lösung. Ich weiss das die nicht optimal ist, funktioniert aber bisher sehr gut.

Hiermit wird die Statusanzeige gesetzt. Es ist die von HM
Ich unterscheide hier nochmal ob es Sicherheitsrelant ist odr nicht --> critical oder info
critical wäre z.B. ein offenes Fenster oder Tür.

<?
if(getValue(39640 /*[EG\Wohnzimmer\Raumstatus\Status_critical]*/)>0)
	{
	   HM_WriteValueString(41102 /*[EG\Flur\Statusanzeige\Kanal4]*/,"LED_STATUS","1");
	}
else
	{
	   if(getValue(15385 /*[EG\Wohnzimmer\Raumstatus\Status_Info]*/)>0)
	      {
	         HM_WriteValueString(41102 /*[EG\Flur\Statusanzeige\Kanal4]*/,"LED_STATUS","2");
			}
		else
		   {
	   		HM_WriteValueString(41102 /*[EG\Flur\Statusanzeige\Kanal4]*/,"LED_STATUS","0");
			}
	}

?>

Das Aktionsskript des Aktors wird per Ereignis getriggert.

<?
if(getValue(58483 /*[EG\Wohnzimmer\Lampe groß\STATE]*/)==True)
	{
	   IPS_RunScript(53028 /*[EG\Wohnzimmer\Raumstatus\Status_Info\+]*/);

	}
else
	{
	   IPS_RunScript(46611 /*[EG\Wohnzimmer\Raumstatus\Status_Info\-]*/);

	}
?>

Das Skript der Zählvariable (+) .


<?
setValue(15385 /*[EG\Wohnzimmer\Raumstatus\Status_Info]*/,getValue(15385 /*[EG\Wohnzimmer\Raumstatus\Status_Info]*/)+1);
?>

Verbesserungsvorschläge sind erwünscht :smiley:

oliver

Meine jetzt bevorzugte Lösung ist die mit einem Sammelscript das bei JEDER Änderung des Status eines Lichts aufgerufen wird.

Hier der erste Abschnitt - nur für die 4 Lichter im Büro; gesetzt wird eine LED der HM-Statusanzeige:

<?
$led_aus = „0“;
$led_rot = „1“;
$led_gruen = „2“;
$led_gelb = „3“;

////////////////////////////////////////////////////////////////////////////////////////////////////////
// F2 Dach Büro
////////////////////////////////////////////////////////////////////////////////////////////////////////

$stat = false;
if (GetValueBoolean(22472 /[Licht\F2\Licht Büro Decke\STATE]/ ) == true) {$stat = true ;};
if (GetValueBoolean(20852 /[Licht\F2\Licht Flur F2 \STATE]/ ) == true) {$stat = true ;};
if (GetValueBoolean(43355 /[Licht\F2\Licht Werkstatt\STATE]/ ) == true) {$stat = true ;};
if (GetValueBoolean(45351 /[Licht\F2\Schaltsteckdose Büro 4 EIN (Schreibtischlampe)\STATE]/ ) == true) {$stat = true ;};

$id_led = 39051 /[Statusanzeige im Windfang\LEDs\LED rechts 12 Licht Dach]/ ;
if($stat)
{ HM_WriteValueString($id_led ,„LED_STATUS“,$led_gruen);}
else
{ HM_WriteValueString($id_led ,„LED_STATUS“,$led_aus);};
?>

Klar dass er bei nur einem Script unnötig „viel“ rechnet - aber so bleibt es zentral und leicht zu pflegen.

Hi,

die vielen IFs könnte man sich sparen, indem man mit boolschen Verknüpfungen arbeitet :

 <?php

$led_aus = "0";
$led_rot = "1";
$led_gruen = "2";
$led_gelb = "3";
$stat = false;
$id_led = 39051 /*[Statusanzeige im Windfang\LEDs\LED rechts 12 Licht Dach]*/ ;

$v1=GetValueBoolean(22472 /*[Licht\F2\Licht Büro Decke\STATE]*/);
$v2=GetValueBoolean(20852 /*[Licht\F2\Licht Flur F2 \STATE]*/);
$v3=GetValueBoolean(43355 /*[Licht\F2\Licht Werkstatt\STATE]*/);
$v4=GetValueBoolean(45351 /*[Licht\F2\Schaltsteckdose Büro 4 EIN (Schreibtischlampe)\STATE]*/ );


if( ($v1 || $v2 || $v3 || $v4 ) )
{ HM_WriteValueString($id_led ,"LED_STATUS",$led_gruen);}
else
{ HM_WriteValueString($id_led ,"LED_STATUS",$led_aus);};
?>

Macht’s vielleicht etwas übersichtlicher, und beim nächsten Aktor hast Du weniger Arbeit :slight_smile:

Gruß
Walter

Hallo Walter,

danke für die Fortentwicklung zu Version 2.0 :wink:

Das ist aber ABSICHT.
Denn bei einem neu hinzukommenden Licht mache ich „D&D“ von nur einer Zeile, passe die Statusvariable an und fertig.
Bei deiner Version müsste ich ein neues „v.“ vergeben usw. - ist halt Geschmacksache.

vg Alexander

Hi Oliver,

verstehe nicht ganz, warum Du nochmal separate Vars anlegst. Variablen sind ja knapp :smiley:
Die HM Instanz liefert ja eigentlich per State oder LEVEL alles, was Du zur Auswertung für ein zentrales Skript brauchst ?!

Gruß
Walter

Ich bin halt noch ein Programmierer der ganz alten Garde. :smiley: Wir haben damals immer gelernt, dass IF-Statements fürchterlich viel CPU Zeit benötigen und den Programmablauf verlangsamen, deshalb versuche ich sie auf ein Minimum zu reduzieren - wohl wissend, dass das heute keine große Rolle mehr spielt. Und die ganzen Klammern nerven mich :smiley:

Gruß
Walter

So, z.B.

 <?php
// In dieses Array die StatusVariablen der Aktoren übertragen
$lampen = array (20815,54739,10932);
$etagen_status=FALSE;
for ($count=0; $count < count($lampen); $count++)
	{
		  	IF ( GetValue($lampen[$count] ))
		  	   {
					$etagen_status=TRUE;
					$count=count($lampen);
				}

	}

IF ($etagen_status) 
{
	// Mach was, wenn positiv
}
ELSE
{
	// Mach was, wenn negativ
}
?>

In $lampen einfach die IDs der Status Variablen übertragen und fertig. $etagen_status liefert dann das Ergebnis.

Gruß
Walter

Hallo Walter

Der Hintergrung ist das ich recht viele Aktoren habe und den Status für jeden Raum darstellen wollte. Deshalb wollte ich nicht jedesmal alle Aktoren abfragen. So kam mir diee Idee den Status jedes Raums in einer Variablen zu speichern.
Push statt Poll
Ausserdem sollten verschiedene Aktoren berücksichtet werden (Lampen,Dimmer,Jalousien,Türkontakte etc…).

Ich weiss das Variablen knapp/ teuer sind, aber bisher reichen die 1000 meiner PRO-Lizenz noch :slight_smile:

oliver

Tach Walter!

Das ist ja ganz ausgezeichnet, vielen Dank dafür, werde ich mal testen!

Funktioniert echt top das script von Walter!

Meine Fenster kann ich damit ebenfalls erfassen, ganz ausgezeichnet.

Eine Frage hätte ich aber noch, hab´s noch nicht probiert, kann ich dort auch die Level Variable von den HM Dimmern mit reinpacken?

Bei den Levels handelt es sich um Float-Variablen, nicht um Booleans wie bei den Status, deshalb muss das Skript wie folgt geändert werden, wenn Du die Level Vars mit berücksichtigen willst.

 <?php

// In dieses Array die StatusVariablen oder LEVEL-Vars der Aktoren übertragen
$lampen = array (34184, 20815, 54739, 10932);

$etagen_status=FALSE;
for ($count=0; $count < count($lampen); $count++)
	{
	      $stat=GetValue($lampen[$count]);
	      IF (!is_float($stat))
	   	   {
	   	      IF ($stat)     // Checken der Status Bool Vars
	   	      {
						$etagen_status=TRUE;
						$count=count($lampen);
					}
				}
			
				ELSE
				{
					IF ( $stat > 0 )  // Checken der Level Float Vars
					   {
						$etagen_status=TRUE;
						$count=count($lampen);
						}
				}
	}

IF ($etagen_status) 
{
	// Mach was, wenn positiv
}
ELSE
{
	// Mach was, wenn negativ
}
?>

Gruß
Walter