LED - Letzten Zustand merken und nach einer Aktion (z.B. Blinken) wiederherstellen

Hallo allerseits!

Ich wollte meine LEDs bei bestimmten Ereignissen (z.B. es klingelt an der Tür) in verschiedenen Farben blinken lassen und danach den alten Zustand (AN in bestimmter Farbe oder AUS) wiederherstellen. Doch das mit dem letzten Zustand war gar nicht so einfach, wie ich erst dachte.

Nachdem ich nirgends im Forum etwas passendes finden konnte, habe ich mich an die Arbeit gemacht und dabei kam folgendes Skript heraus:

<?
// Aktuellen Zustand vom RGBW-868 auslesen, um den Zustand nach dem Ereignis wieder zu setzen
$ledaktuell_rgb = GetValue(43321 /*[Hardware & Skripte\RGB-Steuerung\Wohnzimmer hinten\RGBW-868\Color]*/);
$ledaktuell_white = GetValue(35007 /*[Hardware & Skripte\RGB-Steuerung\Wohnzimmer hinten\RGBW-868\White]*/);

// LED 3 x rot aufblitzen lassen
PJ_SetRGBW(22214 /*[Hardware & Skripte\RGB-Steuerung\Wohnzimmer hinten\RGBW-868]*/, 0, 0, 0, 0);
IPS_Sleep(500);
PJ_SetRGBW(22214 /*[Hardware & Skripte\RGB-Steuerung\Wohnzimmer hinten\RGBW-868]*/, 255, 0, 0, 0);
IPS_Sleep(500);
PJ_SetRGBW(22214 /*[Hardware & Skripte\RGB-Steuerung\Wohnzimmer hinten\RGBW-868]*/, 0, 0, 0, 0);
IPS_Sleep(500);
PJ_SetRGBW(22214 /*[Hardware & Skripte\RGB-Steuerung\Wohnzimmer hinten\RGBW-868]*/, 255, 0, 0, 0);
IPS_Sleep(500);
PJ_SetRGBW(22214 /*[Hardware & Skripte\RGB-Steuerung\Wohnzimmer hinten\RGBW-868]*/, 0, 0, 0, 0);
IPS_Sleep(500);
PJ_SetRGBW(22214 /*[Hardware & Skripte\RGB-Steuerung\Wohnzimmer hinten\RGBW-868]*/, 255, 0, 0, 0);

// Letzten Zustand vom RGBW-868 wiederherstellen (erst mit Dezimal zu Hex, dann Hex zu RGB via Funktion)
$hex_letzterzustand = dechex($ledaktuell_rgb);
$rgb_letzterzustand = hex2rgb($hex_letzterzustand);

// Werte aus dem Array was aus der Funktion kommt zurück in die einzelnen Farbvariablen speichern
$rotalt = $rgb_letzterzustand[0];
$gruenalt = $rgb_letzterzustand[1];
$blaualt = $rgb_letzterzustand[2];
$weissalt = $ledaktuell_white;

// Einzelne Farbvariablen an den RGBW-868 senden, um den Zustand vor dem Ereignis wiederherzustellen
PJ_SetRGBW(22214 /*[Hardware & Skripte\RGB-Steuerung\Wohnzimmer hinten\RGBW-868]*/, $rotalt, $gruenalt, $blaualt, $weissalt);


// Die Funktion um die HEX Werte, aus dem alten LED-Zustand, wieder in RGB-Farben "umzurechnen"
function hex2rgb( $colour ) {
        if ( $colour[0] == '#' ) {
                $colour = substr( $colour, 1 );
        }
		  if ( strlen( $colour ) == 6 ) {
                list( $r, $g, $b ) = array( $colour[0] . $colour[1], $colour[2] . $colour[3], $colour[4] . $colour[5] );
        } elseif ( strlen( $colour ) == 2 ) {
                list( $r, $g, $b ) = array( "00", "00", $colour[0] . $colour[1] );
		  } elseif ( strlen( $colour ) == 3 ) {
                list( $r, $g, $b ) = array( $colour[0] . $colour[0], $colour[1] . $colour[1], $colour[2] . $colour[2] );
        } elseif ( strlen( $colour ) == 4 ) {
                list( $r, $g, $b ) = array( "00", $colour[0] . $colour[1], $colour[2] . $colour[3] );
		  } else {
                return false;
        }
        $r = hexdec( $r );
        $g = hexdec( $g );
        $b = hexdec( $b );
        return array( '0' => $r, '1' => $g, '2' => $b );
}

?>

Dieses Skript muss man jetzt nur von einer Variable triggern lassen, dann blinken die LED 3x auf und der letzte Zustand wird wiederhergestellt. Also z.B. bei einem Bewegungsmelder, einem Taster oder einem Schalter auf Variablenänderung/-aktualisierung.

Natürlich könnt ihr das auch für andere LED Geschichten verwenden oder noch erweitern. Hauptsächlich geht es um die Möglichkeit den letzten Zustand auszulesen und nach einem Ereignis wiederherzustellen.

Grüße,
Chris

Hallo Chris

Das skript ist echt super. Habs gleich mal ausprobiert, da ich bei mir seit 4 Tagen eine LED Beleuchtung unters Sofa gebaut habe. Da kann man echt viel damit anstellen :slight_smile:
Hab mir dein Script gleich mal geholt und ausprobiert. Muss echt sagen, das funktioniert bestens.

Ein Paar Änderungen hab ich noch eingebaut. Vielleicht kannst du es auch gebrauchen

  • Alles über Variablen gemacht (Kann man dann auch übers Webfront einstellen)
  • Auswählbar, ob der Weise Streifen auch mit blinken soll oder nicht
  • Zeiten für ein oder aus können auch extern angegeben werden
  • Anzahl der Blinkvorgänge ist auch Variabel
  • Es können seperate Farben für Ein und Aus gewählt werden.

So kannst du einmal das Script über IPS Variablen verknüpfen.
Wenn es Blau blinken soll einfach ein Script das die Variablen beschreibt, dann das Script aufruft und fertig ist das.
Würde wahrscheinlich auch gehen wenn man das ganze als Funktion schreibt und in einem anderen Script einfach includiert. Aber da weis ich nicht genau wie

<?
// Aktuellen Zustand vom RGBW-868 auslesen, um den Zustand nach dem Ereignis wieder zu setzen
$IDController 		= 53080 /*[Hardware\ProJet\RGBW\RGBW-868 (Wohnzimmer Sofa)]*/;
$ledaktuell_rgb 	= GetValue(11438 /*[Hardware\ProJet\RGBW\RGBW-868 (Wohnzimmer Sofa)\Color]*/);
$ledaktuell_white = GetValue(39546 /*[Hardware\ProJet\RGBW\RGBW-868 (Wohnzimmer Sofa)\White]*/);


// Blinkfrequenz einstellen
$TimeON     = 50;
$TimeOFF    = 500;
$Anzahl     = 3;
$WeisLassen = true;        /* Hier kann man einstellen, dass der Weise Streifen bleibt wie er ist */

// Hier einstellen in welcher Farbe geblinkt werden soll
$ColorRedON   	= 0;
$ColorRedOFF   = 0;
$ColorGreenON 	= 255;
$ColorGreenOFF = 0;
$ColorBlueON  	= 0;
$ColorBlueOFF 	= 0;

$ColorWhite 	= 255;


// Überprüft ob die Weise LED so gelassen werden soll
if ($WeisLassen == true){
		$ColorWhiteON 		= $ledaktuell_white;
		$ColorWhiteOFF 	= $ledaktuell_white;
	}else{
		$ColorWhiteON 		= $ColorWhite;
		$ColorWhiteOFF 	= 0;
	}


//PJ_SetRGBW($IDController, 0, 0, 0, 0);
PJ_DimRGBW($IDController, 0, 1, 0, 1, 0, 1, $ColorWhiteOFF, 1);
IPS_Sleep($TimeOFF);

// LED x mal aufblitzen lassen
for ($i = 1; $i <= $Anzahl; $i++) {
	PJ_SetRGBW($IDController, $ColorRedON, $ColorGreenON, $ColorBlueON, $ColorWhiteON);
	IPS_Sleep($TimeON );
	PJ_SetRGBW($IDController, $ColorRedOFF, $ColorGreenOFF, $ColorBlueOFF, $ColorWhiteOFF);
	IPS_Sleep($TimeOFF);
}

// Letzten Zustand vom RGBW-868 wiederherstellen (erst mit Dezimal zu Hex, dann Hex zu RGB via Funktion)
$hex_letzterzustand = dechex($ledaktuell_rgb);
$rgb_letzterzustand = hex2rgb($hex_letzterzustand);

// Werte aus dem Array was aus der Funktion kommt zurück in die einzelnen Farbvariablen speichern
$rotalt 			= $rgb_letzterzustand[0];
$gruenalt 		= $rgb_letzterzustand[1];
$blaualt 		= $rgb_letzterzustand[2];
$weissalt 		= $ledaktuell_white;

// Einzelne Farbvariablen an den RGBW-868 senden, um den Zustand vor dem Ereignis wiederherzustellen
PJ_dimRGBW($IDController, $rotalt, 1, $gruenalt, 1, $blaualt, 1, $weissalt, 1);


// Die Funktion um die HEX Werte, aus dem alten LED-Zustand, wieder in RGB-Farben "umzurechnen"
function hex2rgb( $colour ) {
        if ( $colour[0] == '#' ) {
                $colour = substr( $colour, 1 );
        }
          if ( strlen( $colour ) == 6 ) {
                list( $r, $g, $b ) = array( $colour[0] . $colour[1], $colour[2] . $colour[3], $colour[4] . $colour[5] );
        } elseif ( strlen( $colour ) == 2 ) {
                list( $r, $g, $b ) = array( "00", "00", $colour[0] . $colour[1] );
          } elseif ( strlen( $colour ) == 3 ) {
                list( $r, $g, $b ) = array( $colour[0] . $colour[0], $colour[1] . $colour[1], $colour[2] . $colour[2] );
        } elseif ( strlen( $colour ) == 4 ) {
                list( $r, $g, $b ) = array( "00", $colour[0] . $colour[1], $colour[2] . $colour[3] );
          } else {
                return false;
        }
        $r = hexdec( $r );
        $g = hexdec( $g );
        $b = hexdec( $b );
        return array( '0' => $r, '1' => $g, '2' => $b );
}

?>

Hi tommy!

Danke für die Rückmeldung und die Veröffentlichung deiner Anpassungen! Habe aber mittlerweile selbst noch einiges geändert/angepasst. Aber sowas muss ja eh jeder selbst auf sich und deine Bedürfnisse anpassen, wollte nur eine Vorlage bieten :slight_smile:

Mit der Funktion, das ist eigentlich gar nicht schwer. Ich hab mir dazu eine Kategorie „Funktionen“ angelegt und dort hab ich verschiedene Skripte gebaut und z.B. „SonosOWN.ips.php“ genannt.

Ich versuche das mal in einem kleinen Beispiel zu verdeutlichen:

Inhalt vom Funktionen-Skript "Test1.ips.php":

function test1($IDController, $ColorRedON, $ColorGreenON, $ColorBlueON, $ColorWhiteON) {
	PJ_SetRGBW($IDController, $ColorRedON, $ColorGreenON, $ColorBlueON, $ColorWhiteON);
} 
	



So ruft man dann aus einem anderen Skript die Funktion auf - Skript "Test2.ips.php":

include 'Test1.ips.php';
  // Hier stehen ganz viele Sachen und jetzt möchte ich die LEDs leuchten lassen
  test1(12345, 255, 0, 0, 0);
  echo "Habe die LED angeschaltet"

Man schreibt also einfach eine Funktion in ein extra Skript und dieses Skript muss man mit „include“ einbinden und kann dann Funktionen aus diesem Skript verwenden und Variablen mit übergeben…

Google bringt dazu auch ein paar gute Beispiele :slight_smile:

Könntest in deinem Fall dann eine Funktion „LEDblinken“ nennen und in den Variablen die Farbe und die Anzahl oder auch die Controller ID mitgeben.

Wenn du noch Fragen hast, immer raus damit, bin nach knapp 3 Monaten IPS schon recht fit mit dem ganzen Kram :slight_smile:

Grüße,
Chris