Ansteuern aller LED Status anzeigen mit einem Befehl

Alles klar,
dann brauche ich nicht mehr weiter nach der Ursache zu suchen.

Vllt. wäre es gut gleich bei speziellen Scripten für Homematic bei zu schreiben, ob man den Lan- Adapter nutzt oder nicht.
Die Probleme das bestimmt Scripte nicht laufen haben wir ja immer wieder mal.

Danke u. Gruß,
Doc

Funktioniert einwandfrei! (mit CCU)
Da ich auch gerade überlege wie ich mir die Fenster am besten anzeigen lasse, nimmst Du als Quelle nur den Shutter-Kontakt, nur den Drehgriff oder eine Kombi aus beidem?

Cheers
/Jens

Ich nehme die Drehgriffe und bei Schiebetüren den Magnetkontakt

BestEx

Ah! O.k.

Habe mir mittlerweile per Script eine Kombi aus Drehgriff- und Magnetkontaktzustand gebastelt. So lassen sich auch „nicht definierte“ Zustände als „rot“ melden (z.B. Fenster/Tür „zu“, Griff in Position „offen“).
Einzig der Zustand „Drehgriff gekippt + Kontakt offen“ lässt sich natürlich schlecht differenzieren :wink:

Cheers
/Jens

Hi BestEx!

Nachdem ich lange Zeit die LED von meinen Display einzeln angesteuert habe, wurde es heute doch mal Zeit für diese Funk-Optimierung :slight_smile:

Skript kopiert, meine ID eingetragen, ausgeführt, funktioniert. Top! Vielen Dank! :slight_smile:

Jetzt muss ich mir nur noch mein drumherum wieder bauen und das war es schon :cool:

Mir geht es dabei hauptsächlich um meine All-Off Szene. Da werden mehrere LED nacheinander eingeschaltet, dabei könnte man das auch mit einem Befehl senden und Funkverkehr sparen. Deshalb schreibe ich erst alles in eine Variable und wenn diese geändert wird, dann läuft ein Timer, welcher dann verzögert sendet, so dass alle Änderungen in dieser Zeit auf einmal gesendet werden.

Danke und Grüße,
Chris

Hallo Bayaro

Freut mich das mein Script geholfen hat. Deine Vorgehensweise die LED`s möglichst selten anzusteuern ist gerade bei der Homematic genau richtig

Moin!

Habe es gestern Nachmittag noch fertiggestellt. Ich habe ein Skript, was bei Variablenänderung der ganzen anzuzeigenden Objekte getriggert wird. Dieses macht nichts anderes, als eine Temp-Variable mit dem String zu beschreiben (immer). Also das „Aus,Organge,Aus, …“.

Dann gibt es ein Sende-Skript welches durch die Temp-Variable getriggert wird (und durch „unreach“ und „deaktiviert“). Wenn die Temp-Variable vor mehr als 5 Sekunden das letzte Mal geändert wurde und das Display nicht auf „Unreach“ oder „Deaktiviert“ steht, dann wird gesendet.
Wird innerhalb der 5 Sekunden erneut die Temp-Variable geändert, schiebt es sich wieder um 5 Sekunden nach hinten mit dem Senden, bis keine Änderung mehr erfolgt. So werde ich nach wie vor schnell am Display informiert, aber gerade bei „All-Off“ oder ähnlichen Aktionen mit viel An/aus wird nur einmal gesendet :slight_smile: Perfekt :slight_smile:

So sieht der Objektbaum vom HMOULED16-Display im Wohnzimmer aus:

Skript „Wand-Display Wohnzimmer (HM-OU-LED16)“:

<?
$LED_Temp_Var = 56224;  // Temp-Variable in die der String geschrieben wird ("Aus, Organge, Aus, ...")

// Hier werden den LED die Bool-Variablen zugeordnet (Fenster-STATE, Aktiv-STATE, ...)
$VariablenIDs_Quellen_AR = array(1=>48838,2=>30290,3=>37164,4=>20188,5=>49002,6=>32439,7=>29270,8=>52756,9=>46598,10=>57494,11=>59397,12=>19271,13=>46554,14=>53361,15=>38540,16=>23819);

$i = 1;
$LEDstringAR = "";
while ($i <= 16) {
	$TrueFalse = GetValue($VariablenIDs_Quellen_AR[$i]);
	//echo "LED-$i -- $TrueFalse
";
	if ($TrueFalse == true) {
	   $LEDstringAR[$i] = "Orange";
	}
	else {
		$LEDstringAR[$i] = "Aus";
	}
	$i++;
}

$LEDstring = implode(",", $LEDstringAR);
SetValue($LED_Temp_Var, $LEDstring);
?>

Skript „SendeSkript_HM-Display-WZ“:

<?
$LED_Temp_Var = 56224 /*[Skripte & Variablen\HomeMatic\Wand-Display Wohnzimmer (HM-OU-LED16)\SendeSkript_HM-Display-WZ\Temp-LED-Var]*/;
$DisplayID = 47176 /*[Hardware\HomeMatic\Wand-Display\DISPLAY02 (Wohnzimmer)\LED01]*/;
$DisplayUnreach = 59105 /*[Hardware\HomeMatic\Wand-Display\DISPLAY02 (Wohnzimmer)\DISPLAY02 (Wohnzimmer)\UNREACH]*/;
$DisplayDeaktiviert = 13189 /*[Skripte & Variablen\HomeMatic\Wand-Display Wohnzimmer (HM-OU-LED16)\Deaktiviert]*/;

$EVENT_UnreachFalse = 11059 /*[Skripte & Variablen\HomeMatic\Wand-Display Wohnzimmer (HM-OU-LED16)\SendeSkript_HM-Display-WZ\]*/;
$EVENT_DeaktiviertFalse = 19949 /*[Skripte & Variablen\HomeMatic\Wand-Display Wohnzimmer (HM-OU-LED16)\SendeSkript_HM-Display-WZ\]*/;
$EVENT_TempVarChange = 38931 /*[Skripte & Variablen\HomeMatic\Wand-Display Wohnzimmer (HM-OU-LED16)\SendeSkript_HM-Display-WZ\]*/;

$TempVar_LastChanged = IPS_GetVariable($LED_Temp_Var);
$TempVar_LastChanged = $TempVar_LastChanged["VariableChanged"];
$TempVar_TimeDiff = time() - $TempVar_LastChanged;

if (@$_IPS['EVENT'] == $EVENT_TempVarChange) {
	IPS_SetScriptTimer($_IPS['SELF'], 5);
}
elseif ((@$_IPS['EVENT'] == $EVENT_UnreachFalse) OR (@$_IPS['EVENT'] == $EVENT_DeaktiviertFalse)) {
   HMOULED16_Senden();
}


if ($_IPS['SENDER'] == "TimerEvent") {
	if (($TempVar_TimeDiff >= 5) AND (GetValue($DisplayUnreach) == false) AND (GetValue($DisplayDeaktiviert) == false)) {
	   IPS_SetScriptTimer($_IPS['SELF'], 0);
	   HMOULED16_Senden();
	}
	elseif ((GetValue($DisplayUnreach) == true) OR (GetValue($DisplayDeaktiviert) == true)) {
	   IPS_SetScriptTimer($_IPS['SELF'], 0);
	}
}



function HMOULED16_Senden() {
	Global $DisplayID;
	Global $LED_Temp_Var;
	
	//$LED_Matrix = ["Rot","Grün","Orange","Aus","Aus","Aus","Aus","Aus","Aus","Aus","Aus","Aus","Aus","Aus","Aus","Aus"];
	$LED_Matrix = explode(",", GetValue($LED_Temp_Var));

	$Sequenz = 0;
	foreach ($LED_Matrix as $key => $color) {
		$LED_Nr = $key+1;
	   Calculate_LED_Control_Number ($LED_Nr, $Results);
		$Sequenz = $Sequenz + $Results[$color];
	}
	@HM_WriteValueString($DisplayID, "ALL_LEDS", $Sequenz);
}


function Calculate_LED_Control_Number($LED_NR,&$Results) {
	$Bereich = $LED_NR * 2;
	$Rot_exp = $Bereich - 2;
	$Gruen_exp = $Bereich - 1;
	$Results["Rot"] = pow(2,$Rot_exp);
	$Results["Grün"] = pow(2,$Gruen_exp);
	$Results["Orange"] = $Results["Rot"]+$Results["Grün"];
	$Results["Aus"] = 0;
}
?>

Kann natürlich auch noch erweitert werden, so dass man z.B. Integer-Variablen mit abfragen kann. Oder ein Zeitlimit einbauen, dass spätestens 15 Sekunden nach der 1. Temp-Variablen Änderung gesendet wird, …
Aber bei mir passt es so wunderbar und funktioniert traumhaft :slight_smile:

Grüße,
Chris