Licht per Bewegungsmelder steuern

Hallo zusammen, bin ein blutiger Anfänger im Skripte schreiben und auch beim IP-Symcon allgemein. Bis jetzt sind mir erst die Grundkonfiguration und erste simple Skripte gelungen. Nun möchte ich allerdings folgendes machen und stehe etwas am Berg:

Aufgabenstellung

Ich möchte mehrere Lichter über mehrere Bewegungsmelder steuern. Die Lichter werden einzeln oder auch gruppenweise per Schalter angemacht.

Nun brauche ich ein Skript mit folgender Funktion. Am liebsten hätte ich alles möglichst kompakt, damit ich es für jeden Raum einfach nur kopieren und die ID’s ändern kann.

Die Stati der Lichter sollen überwacht werden. Sobald ein Licht der Gruppe an ist, sollen ein oder mehrere Bewegungsmelder (Impuls-Betrieb) aktiviert werden. Diese triggern eine Nachlaufzeit von 5 min.

Nach Ablauf der 5 min ohne Bewegung geschieht folgendes:

  • Helligkeit sämtlicher involvierter Leuchten ermitteln und abspeichern (Lichtstimmung)
  • alle Lichter während 30 sek. herunterdimmen

Falls während den 30 sek. eine Bewegung gesehen wird:

  • Licht wieder anschalten und zwar auf gleiche Stimmung wie vor dem Abschalten

Falls während den 30 sek. keine Bewegung gesehen wird:

  • Licht ausdimmen lassen
  • Sobald alle Lichter 0% Helligkeit erreicht haben, wird das komplette Skript gesperrt, bis eines der Lichter wieder manuell eingeschaltet wird.

Hallo manuel,

und wie lautet jetzt die Frage?
Für erste Denkanstöße einfach die Forumssuche bemühen, diese Themen wurden alle schon mehrfach durchgekaut. Wenn Du irgendwo nicht weiterkommst, dann eine konkrete Frage stellen, dann wird man Dir sicher helfen. Aber so ließt sich Dein Post, als solle Dir jemand kostenlos hinterherwischen :slight_smile:

Gruß, Martin

@lurch: Nana, selbst erst 15 Post aber gleich große Töne spuken.
Die ersten paar Fragen dürfen auch mal blöd sein, später sollte man dann mit der Suche umgehen können.

@manuel:
Wenn du nach einem passendem Codebeispiel frägts solltest du zumindest deine verwendete Hardware angeben.
Ansonsten ist es tatsächlich kaum möglich dir was sinnvolles zu schreiben.

gruß
bb

danke bb für deine wohlwollende Antwort :slight_smile:
ich habe mich ja als blutigen Anfänger bezeichnet. Tatsächlich konnte ich beim Durchstöbern des Forums nachvollziehen, dass ähnliche Fragestellungen gleich mit Skripten quittiert wurden. Wäre ja möglich…
Jedenfalls, ich verwende ein LCN-System. Die Lichter werden über entsprechende Ausgänge gesteuert, die Melder hängen an Binäreingängen.
Ich habe mich bereits in der Lösung der Aufgabe versucht, bin aber mit unterschiedlichen Skripttimern im gleichen Skript gescheitert. Als Resultat meiner versuche habe ich eine ziemlich klare Beschreibung des Lösungsweges erhalten. Meine Hoffnung war, dass, nachdem ich mich schon einige Zeit mit der Aufgabe beschäftigt habe, vielleicht jemand mein Skript in kurzer Zeit aus dem Ärmel schüttelt :slight_smile:
Natürlich wäre ich auch schon sehr dankbar um einen Verweis auf ein ähnliches Codebeispiel.
Gruss
manuel

Ok Manuel

für deinen Fall wäre es noch beser wenn du im LCN Bereich gepostet hättest. Deine Problemstellung ist nämlich nicht wirklich ein Script problem, sondern eher ein Thema welche Funktionalitäten dir deine Aktoren bieten.
Aber egal.

Nun ich hab bei mir genau sowas laufen wie du benötigst, allerdings verwende ich das FS20 System von ELV.
Die Dimmer können von sich aus schon innerhalb einer programierbaren Zeit Rauf und Runterdimmen. Ob die LCN Aktoren das auch können weiß ich leider nicht.

Als Denkanstoß wie dies prinzipiell umzusetzen wäre hier mein Script:

<?
{

$myId= 16699 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri]*/;

$Sensor = "";
Switch ($_IPS['SENDER'])
	{
	Default:
	   break;

	Case "RunScript":
   	   break;
	Case "Execute":
      echo "Execute";
      
	   break;


	Case "Variable":
         $Sensor = IPS_GetName($IPS_VARIABLE);
			$Sensor = IPS_GetName(IPS_GetParent($IPS_VARIABLE))."_".$Sensor;
			echo $Sensor;
			break;
	Case "Execute":

	Case "TimerEvent":
         $Sensor = IPS_GetName($_IPS['EVENT']);
			echo $Sensor;
		 	$TimerId = (IPS_GetObjectIDByName($Sensor, $myId));
			break;
	};

Switch ($Sensor)
	{
// --------- Flur EG------------------

	Case "Bewegungssensor_EG_Status":
 //     If (GetValueBoolean(23751 /*[Wandschalter\Schalter_Haustüre\Taste1]*/) == false) {

		  FS20_SwitchDuration(36849 /*[Licht\Flur Erdgeschoß]*/,true,120);
	     myStartTimer(30138 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/);
	  
	//TMEX_F29_SetPin(14768 /*[Licht\ZK_Relaisgruppe]*/, 2, true);
			SetValueInteger(58697 /*[Räume\Flur\Weinregal\SettlingTime & Brightness\Helligkeit]*/,100);
			SetValueInteger(43676 /*[Räume\Flur\Weinregal\SettlingTime & Brightness\DimTime]*/,20);
			IPS_RunScript(12817 /*[Räume\Flur\Weinregal\Scripte\random]*/);
			IPS_RunScriptEx(28613 /*[Räume\Flur\Weinregal\Scripte\Set_RGB]*/,Array("ChromoflexMode" => 0.0)); //Chromoflex setzen
//			}
			break;
      Case "Timer_Flur1":
         IPS_SetEventActive(30138 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/,false);
          // FS20_SetIntensity(36849 /*[Licht\Flur Erdgeschoß]*/,0,15);
         FS20_SwitchMode(36849 /*[Licht\Flur Erdgeschoß]*/, false);
			IPS_RunScript(12817 /*[Räume\Flur\Weinregal\Scripte\random]*/);
			SetValueInteger(43676 /*[Räume\Flur\Weinregal\SettlingTime & Brightness\DimTime]*/,20);
			SetValueInteger(58697 /*[Räume\Flur\Weinregal\SettlingTime & Brightness\Helligkeit]*/,5);
			IPS_RunScriptEx(28613 /*[Räume\Flur\Weinregal\Scripte\Set_RGB]*/,Array("ChromoflexMode" => 0.0)); //Chromoflex setzen
			break;


// --------- Flur OG------------------
	Case "Bewegungssensor_OG_Status":
         if (GetValue(22388 /*[Garten\Helligkeit]*/) <10) {
				FS20_SwitchDuration(50986 /*[Licht\Flur Obergeschoß]*/,true,60);
   	      FS20_SwitchDuration(36849 /*[Licht\Flur Erdgeschoß]*/,true,120);
      	   myStartTimer(16999 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/);
			}
			break;
   Case "Timer_OG1":
			IPS_SetEventActive(16999 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/,false);
	      // FS20_SetIntensity(50986 /*[Licht\Flur Obergeschoß]*/,0,15);
         FS20_SwitchMode(50986 /*[Licht\Flur Obergeschoß]*/, false);
			break;


// --------- Toilette------------------
	Case "Bewegungssensor_Toilette_Status":
         TMEX_F29_SetPin(14768 /*[Licht\ZK_Relaisgruppe]*/, 5, true);
         myStartTimer(49718 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/);
         IPS_SetEventCyclicTimeBounds(49718 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/,time(),0);
			break;
    Case "Timer_Toilette1":
			TMEX_F29_SetPin(14768 /*[Licht\ZK_Relaisgruppe]*/, 5, false);
         IPS_SetEventActive(49718 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/,false);
			break;

// --------- Kellerstiege------------------
   Case "Bewegungssensor_Kellerstiege_Status":
         TMEX_F29_SetPin(14768 /*[Licht\ZK_Relaisgruppe]*/, 7, true);
         myStartTimer(45818 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/);
			break;
   Case "Timer_Kellerstiege1":
         TMEX_F29_SetPin(14768 /*[Licht\ZK_Relaisgruppe]*/, 7, false);
         IPS_SetEventActive(45818 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/,false);
			break;

// --------- Keller------------------
   Case "Bewegungssensor_UG_Status":
			if (GetValueBoolean(17090 /*[Licht\ZK_Relaisgruppe\Licht Keller]*/) <>1) {
				TMEX_F29_SetPin(14768 /*[Licht\ZK_Relaisgruppe]*/, 3, true);
         	myStartTimer(38895 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/);
         }
			break;
   Case "Timer_Keller1":
         TMEX_F29_SetPin(14768 /*[Licht\ZK_Relaisgruppe]*/, 3, false);
         IPS_SetEventActive(38895 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/,false);
			break;

// --------- Terrasse------------------
   Case "Bewegungssensor_Terrasse_Status":
			if (GetValueBoolean(52664 /*[Licht\Terrasse\Status]*/) <> 1 && GetValue(22388 /*[Garten\Helligkeit]*/) <10) {
				FS20_SwitchDuration(27796 /*[Licht\Terrasse]*/,true,60);
		   	FS20_SwitchDuration(14090 /*[Licht\Geräteschuppen Eingang]*/,true,60);
	      	myStartTimer(35032 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/);
	      }
			break;
   Case "Timer_Terrasse1":
         FS20_SwitchMode(27796 /*[Licht\Terrasse]*/,false);
		   FS20_SwitchMode(14090 /*[Licht\Geräteschuppen Eingang]*/,false);
	      IPS_SetEventActive(35032 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/,false);
			break;

// --------- Parkplatz ------------------
   Case "Bewegungssensor_Parkplatz_Status":
			if (GetValueBoolean(57684 /*[Licht\ZK_Relaisgruppe\Außenbeleuchtung]*/)<> 1 && GetValue(22388 /*[Garten\Helligkeit]*/) <10) {
       		myStartTimer(48893 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/);
		   	TMEX_F29_SetPin(14768 /*[Licht\ZK_Relaisgruppe]*/, 0, true);
			}
        	break;
   Case "Timer_Parkplatz1":
         TMEX_F29_SetPin(14768 /*[Licht\ZK_Relaisgruppe]*/, 0, false);
         IPS_SetEventActive(48893 /*[Programe\Lichtsteuerung\Lichtsteuerung Piri\]*/,false);
			break;


	}
};


function myStartTimer($dev) {
	IPS_SetEventActive($dev,false);
	IPS_SetEventCyclicTimeBounds($dev,time(),0);
	IPS_SetEventActive($dev,true);
}




/***************************************************************************
* Function: myToggleFS20
* Description: Diese Funktion Toggelt Einen FS20 Switch

* Parameter: - $objid (ObjektID)
***************************************************************************/

function myToggleFS20($dev){

	If (myGetObjectVariable($dev,'Status') == true) {
		FS20_SwitchMode($dev, false);
		}
	else {
		FS20_SwitchMode($dev, true);
		}
}

/***************************************************************************
* Function: MY_ObjectVariable
* Description: Diese Funktion gibt den Wert einer Variablen eines Objektes
*              zurück. Zum Beispiel den Wert MOTION des Devices PIRI.
*
* Parameter: - $objid (ObjektID)
*            - $variable (Name der Variablen)
* Return: - Wert der Variablen
*
***************************************************************************/
function myGetObjectVariable($objid, $variable)
{
    $obj = IPS_GetObject($objid);

    foreach ( $obj['ChildrenIDs'] as $item )
    {
       if ( IPS_GetName($item) == $variable )
       {
            return GetValue($item);
       }
    }
    return null;
}


?>

Im Objektbrowser sieht das so aus:

 

Ich hab jetzt mal das Script für meine ganzen Piris reingestellt. Dich dürfte der Bereich „Flur OG“ interessieren. Da passiert in etwa das was du suchst.
Aber wie gesagt, das ist für FS20, für LCN könnte das ggfls. ganz anders aussehen.

gruß
bb

@bbernhard:
Ok ok, war wohl etwas zu bissig formuliert, ich gelobe Besserung :slight_smile:

danke bb
dann werde ich gerne versuchen, dein skript für mich zu adaptieren.
Gruss Manuel

Hi,
Ich nutze auch ein LCN System und frage mich gerade warum Du das was Du vorhast nicht einfach im LCN System selbst mit LCN-PRO konfigurierst zum Beispielt mit der Rampenfunktion für das langsame herunterdimmen…

im LCN habe ich diese Funktionalität im Moment drin, ich bin aber überhaupt nicht Fan von zu viel Logik in LCN, das wird sehr schnell zum Tschungel…

ich habe nun folgendes, kleines Skript entworfen.
Zuerst versuche ich die aktuellen Stati der Lichter zu bekommen. Falls beide Lichter aus, stoppe ich einen allfälligen Timer und ebenso ein Ereignis, welches direkt über den PIR die Leuchten einschaltet (Wiedereinschaltung)

Irgendwie versteht jetzt aber das Skript die Bedingung
if ($StatusA1 = false AND $StatusA2 = false)
nicht, sondern springt direkt zur else-Bedingung

kann mir jemand sagen, was ich falsch mache?


<?

$StatusA1 = GetValue(50612 /*[Stockwerke\EG\WC\EG WC Decke\Status]*/ );
$StatusA2 = GetValue(47646 /*[Stockwerke\EG\WC\EG WC Spiegel\Status]*/ );

if ($IPS_SENDER == "Variable")
 {
  if ($StatusA1 = false AND $StatusA2 = false) {
    IPS_SetScriptTimer($IPS_SELF, 0);
    IPS_SetEventActive(22610 /*[Stockwerke\EG\WC\PIR Trigger\]*/, false);
  } else {
    IPS_SetScriptTimer($IPS_SELF, 30);
  }
}

if ($IPS_SENDER == "TimerEvent")
	$result = CSCK_SendText(41241 /*[LCN-PCHK]*/, '>M000070.A1DI000030'.chr(10));
	$result = CSCK_SendText(41241 /*[LCN-PCHK]*/, '>M000070.A2DI000030'.chr(10));
    IPS_SetEventActive(22610 /*[Stockwerke\EG\WC\PIR Trigger\]*/, true);

?>


alles klar, nun hab ichs. Alles klappt wie erwünscht :slight_smile:

Hallo allerseits,

der Fall hier ist zwar schon älter und auch schon gelöst, trotzdem würde ich gerne meine Lösung noch posten. Eventuell kann ja einer was damit anfangen, wenn er den Beitrag über die Suche findet :slight_smile:

Mein Fall: Ich habe 2 Bewegungsmelder im Flur (einen oben und einen unten). Im HomeMatic UI hab ich 60 Sekunden eingestellt. Nutzt man eine andere Technik, kann man einfach seine AN und AUS Befehle einbauen und den Timer auf die gewünschte Beleuchtungsdauer ändern.
Sobald einer der Sensoren Bewegung erkennt, dann wird das Licht eingeschaltet, kommt innerhalb von 60 Sekunden keine neue Bewegung, dann startet ein Timer mit 15 Sekunden, wird in der Zeit eine Bewegung erkannt geht der Timer wieder aus und eine weitere Minute ist Licht. Kommt keine Bewegung nach der Zeit, dann geht das Licht aus und der Timer wird ausgeschaltet.
Zusätzlich wird Datum und Uhrzeit der letzten Bewegung in einen Variable gespeichert und im WebFront angezeigt. Könnte man später für Alarm-Funktionen nutzen…bin ja noch ganz am Anfang mit IPS :slight_smile:


<?
include('LightManager.ips.php');

$B01Bewegung = GetValue(59324 /*[SKRIPTE\HomeMatic\Bewegungsmelder\B01 (Flur oben)\Sensor\MOTION]*/);
$B02Bewegung = GetValue(57400 /*[SKRIPTE\HomeMatic\Bewegungsmelder\B02 (Flur unten)\Sensor\MOTION]*/);


if (($B01Bewegung == true) OR ($B02Bewegung == true))  {
	$mode = GetValueBoolean($IPS_VARIABLE) ? LightManager::INTERTECHNO_ON : LightManager::INTERTECHNO_ON;
	LightManager::InterTechno_SwitchMode('B1', $mode, $IPS_VARIABLE, true);   //false = normal // true = lernfähig
	SetValue(38192 /*[SKRIPTE\LightManager\Treppenlicht]*/, true);
	IPS_SetScriptTimer($IPS_SELF, 0);
	
	$timestamp = time();
	$datum = date("d.m.Y - H:i", $timestamp);
	$datum = $datum. " Uhr";
	SetValueString(27657 /*[SKRIPTE\HomeMatic\Bewegungsmelder\Letzte Bewegung]*/, $datum);
}
if (($B01Bewegung == false) AND ($B02Bewegung == false))  {
	IPS_SetScriptTimer($IPS_SELF, 15);
}


if($IPS_SENDER == "TimerEvent")  {
	if (($B01Bewegung == true) OR ($B02Bewegung == true))  {
	  IPS_SetScriptTimer($IPS_SELF, 0);
	}
	else  {
  		$mode = GetValueBoolean($IPS_VARIABLE) ? LightManager::INTERTECHNO_OFF : LightManager::INTERTECHNO_OFF;
		LightManager::InterTechno_SwitchMode('B1', $mode, $IPS_VARIABLE, true);   //false = normal // true = lernfähig
		SetValue(38192 /*[SKRIPTE\LightManager\Treppenlicht]*/, false);
		IPS_SetScriptTimer($IPS_SELF, 0);
		
		$timestamp = time();
		$datum = date("d.m.Y - H:i", $timestamp);
		$datum = $datum. " Uhr";
		SetValueString(27657 /*[SKRIPTE\HomeMatic\Bewegungsmelder\Letzte Bewegung]*/, $datum);
	}
}
?>

Bei Fragen einfach melden :slight_smile:

Grüße,
Chris