Lichtsteuerung mit BWM / Anwesenheitserkennung etc

Hallo zusammen,

ich möchte meine Beleuchtung in einigen Räumen nach gewissen Gegebenheiten steuern.

Die Beleuchtung soll eingeschaltet werden, wenn

  • der Raum betreten wird und es ist bereits dunkel
    -> Licht an mit 2s Rampe

  • man bereits im Raum ist und es wird in dieser Zeit dunkel
    -> Licht an mit 20m Rampe.

Die Beleuchtung soll ausschalten, wenn

  • keiner mehr im Raum
  • wenn es wieder hell wird.

Derzeit wird die Helligkeit noch über den Homematik BWM ausgewertet.
Es ist aber ein Helligkeitssensor für draußen in Planung,
ich bin nur noch nicht im klaren wie ich das löse (welches System).:rolleyes:

Mein Script läuft so einigermaßen,
jedoch schaltet sich das Licht in der Nacht gelegentlich selber ein,
wenn z.B. die Helligkeit schwankt.
Manchmal, wenn jemand anwesend und es wird dunkel,
schaltet das Licht sofort ein statt den 20 Minuten etc…:confused:

Seltsamerweise finde ich hier kein Beispielscript,
bin ich hier der Einzige, der seine Beleuchtung so steuern möchte?
Kann ich mir eigentlich nicht vorstellen.
Ich hoffe also, dass Ihr mir hier ein wenig auf die Sprünge helfen könnt.

Was evtl. noch interessant wäre: eine Konstantlichtregelung.
Hat hier jemand sowas schon einmal umgesetzt?
Hierzu lässt sich leider auch nichts finden.

Vielen Dank schon einmal. :wink:

Hier meine Scripts und der Objektbaum:

Anwesenheit erkennen:

<?


if ($_IPS['SENDER'] == "TimerEvent")
{
SetValue(43825 /*[Homematic\Wohnzimmer/Terrarien\Szenen\Anwesenheit WZ]*/  ,false);    //Aus Befehl
   

    
    IPS_SetScriptTimer($_IPS['SELF'], 0);    //Timer ausschalten
}

else

{

SetValue(43825 /*[Homematic\Wohnzimmer/Terrarien\Szenen\Anwesenheit WZ]*/  ,true);    //An Befehl



    IPS_SetScriptTimer($_IPS['SELF'], 1200);    //Timer anschalten
}

?>

BWM Steuerung Licht WZ:

<?

$id_Decke = 45405 /*[Homematic\Wohnzimmer/Terrarien\Unterputz-Dimmer Decke \DIMMER]*/ ;
$Decke_Work = GetValue(48350 /*[Homematic\Wohnzimmer/Terrarien\Unterputz-Dimmer Decke \DIMMER\WORKING]*/ );
$Decke_Level = GetValue(32605 /*[Homematic\Wohnzimmer/Terrarien\Unterputz-Dimmer Decke \DIMMER\LEVEL]*/ );
$Wert_Helligkeit = GetValue(33229 /*[Homematic\Wohnzimmer/Terrarien\BWM Wohnzimmer\MOTION_DETECTOR\BRIGHTNESS]*/);
$Anwesend = GetValue(43825 /*[Homematic\Wohnzimmer/Terrarien\Szenen\Anwesenheit WZ]*/ );
$Sperrung = GetValue(35927 /*[Homematic\Wohnzimmer/Terrarien\Szenen\Sperrung WZ]*/ );
$sunrise = GetValue(53215 /*[Sonstiges\Astronomische Ereignisse\Astronomische Ereignisse\Sonnenaufgang]*/ );
$sunset = GetValue(29151 /*[Sonstiges\Astronomische Ereignisse\Astronomische Ereignisse\Sonnenuntergang]*/  );
$uhrzeit = date("H:i");	// aktuelle Uhrzeit
$BWM_Sperrung = GetValue(13622 /*[Homematic\Wohnzimmer/Terrarien\Szenen\BWM sperren WZ]*/ );
$BWM_Motion = GetValue(22852 /*[Homematic\Wohnzimmer/Terrarien\BWM Wohnzimmer\MOTION_DETECTOR\MOTION]*/ );

//**********************************************************************************************************
If             	//Setzt Sperrung nach Tagesanbruch zurück...

	(                                      						   //...prüfen...
		( ($uhrzeit > $sunrise) or ($uhrzeit < $sunset) ) &&     //...wenn zwischen Morgen- und Abenddämmerung...
		($Wert_Helligkeit > 64)           								//... und Helligkeit kleiner als X...
	)

	SetValueBoolean(35927 /*[Homematic\Wohnzimmer/Terrarien\Szenen\Sperrung WZ]*/ , false);    //setze Variable Sperrung auf falsch
	
//**********************************************************************************************************
//**********************************************************************************************************

Switch ($_IPS['SENDER'])
{
//**********************************************************************************************************
case
//if					//Wenn Licht aus und keiner im Raum und es ist dunkel...

	(                                      							//...prüfen...
		($Decke_Work == false) &&           							//...wenn Deckenlicht führt keinen Befehl aus...
		($Decke_Level == 0)	&&                                  //...und Level gleich 0% (also aus)...
		($Wert_Helligkeit < 39) &&          							//...und Helligkeit kleiner als X...
		($BWM_Sperrung == false) &&          							//...und BWM nicht gesperrt...
		($Anwesend == true)  &&                                  //...und anwesenheit erkannt...
 //		($BWM_Motion == true)  &&                                  //...und anwesenheit erkannt...
		($Sperrung == false)                							//...und nicht durch andere Szenen gesperrt...
	):
	
	{                                                           //...dann...
		HM_WriteValueFloat($id_Decke , "RAMP_TIME", 2);        	//...X Sekunden Rampe...
		HM_WriteValueFloat($id_Decke  , "LEVEL" , .9);           //...und ausführen auf x%.
	}
break;
//**********************************************************************************************************
case
//if					//Wenn Licht aus und jemand im Raum und es wird dunkel...

	(                                      							//...prüfen...
		($Decke_Work == false) &&           							//...wenn Deckenlicht führt keinen Befehl aus...
		($Decke_Level == 0)	&&                                  //...und Level gleich 0% (also aus)...
		($Wert_Helligkeit < 45) &&          							//...und dunkler als X...
		($Anwesend == true)     &&          							//...und jemand anwesend...
		($BWM_Sperrung == false) &&          							//...und BWM nicht gesperrt...
		($Sperrung == false)                							//...und nicht durch andere Szenen gesperrt...
	):
	{                                                           //...dann...
		HM_WriteValueFloat($id_Decke , "RAMP_TIME", 900);        //...X Sekunden Rampe...
		HM_WriteValueFloat($id_Decke  , "LEVEL" , .95);          //...und ausführen auf x%.
	}
break;
//***********************************************************************************************************
case
//if					//Wenn Licht an und keiner mehr im Raum...

	(                                      							//...prüfen...
		($Decke_Level > 0)	&&                                  //...und Level größer als 0% (also an)...
		($Decke_Work == false) &&           							//...und Deckenlicht führt keinen Befehl aus...
		($Anwesend == false) 		          							//...und keiner anwesend...
	):
	{                                                           //...dann...
		HM_WriteValueFloat($id_Decke , "RAMP_TIME", 5);       	//...X Sekunden Rampe...
		HM_WriteValueFloat($id_Decke  , "LEVEL" , 0);            //...und ausführen auf x%.
	}
break;
//************************************************************************************************************
case
//if					//Wenn jemand anwesend und es wird hell und Licht ist an...

	(                                      						   //...prüfen...
		($Anwesend == true)	&&                            	   //...es ist jemand anwesend...
		($Decke_Work == false) &&           							//...und Deckenlicht führt keinen Befehl aus...
		( ($uhrzeit > $sunrise) or ($uhrzeit < $sunset) ) &&     //...und zwischen Morgen- und Abenddämmerung...
		($Wert_Helligkeit > 70) &&          							//... und Helligkeit größer als X...
		($Decke_Level > 0)	&&                                  //...und Level größer als 0% (also an)...
		($Sperrung == false)                							//...und nicht durch andere Szenen gesperrt...
	):
	{                                                           //...dann...
		HM_WriteValueFloat($id_Decke , "RAMP_TIME", 300);       	//...X Sekunden Rampe...
		HM_WriteValueFloat($id_Decke  , "LEVEL" , 0);            //...und ausführen auf x%.
	}
break;
}

?>

BWM_sperren WZ:

<?


if($_IPS['SENDER'] == "TimerEvent")
{
SetValue(13622 /*[Homematic\Wohnzimmer/Terrarien\Szenen\BWM sperren WZ]*/   ,false);    //Aus Befehl



    IPS_SetScriptTimer($_IPS['SELF'], 0);    //Timer ausschalten
}

else

{

SetValue(13622 /*[Homematic\Wohnzimmer/Terrarien\Szenen\BWM sperren WZ]*/   ,true);    //An Befehl



    IPS_SetScriptTimer($_IPS['SELF'], 30);    //Timer anschalten
}

?>

Hallo Darklord,

ohne jetzt ganz im Detail darüber geschaut zu haben, Dein CASE Verteiler im mittleren Skript kann - zumindest nach dem was ich über PHP weiß - so nicht funktionieren.
Du machst eine Abfrage auf $_IPS[‚SENDER‘], fragst aber die Zustände im case-Verteiler nicht ab, sondern hast da geklammerte IF-Bedingungen. Rein syntaktisch fehlen schon die Doppelpunkte hinter den cases. :confused:
Ich fürchte, hier solltest Du wieder auf IF-Klauseln umbauen. Hattest Du ja offensichtlich schon einmal…

Gruß
Walter

Hi Walter,

ja, am Anfang hatte ich das noch mi „if“ gemacht.
Funktionierte aber noch viel weniger.:frowning:

Allerdings ein guter Ansatz von Dir.
Meine PHP-Kenntnisse sind noch mangelhaft.
Werde Deine angesprochenen Punkte recherchieren,
vielleicht komme ich damit weiter.

Wenn sonst noch jemand Ideen hat: immer her damit. :stuck_out_tongue:

Danke.

Hallo nochmal,

mal unabhängig davon, ob dieser CASE Verteiler so läuft, die Bedingungen der ersten beiden Abfragen sind identisch bis auf den WERT_Helligkeit ( einmal < 39, einmal < 45). D.h. bei einem Wert unter 45 würden immer beide Aktionen durchgeführt.
Der letzte gewinnt :smiley:
Bei der ersten Bedingungen würde ich vermuten, dass $Anwesend = FALSE abgefragt werden müsste.

Gruß
Walter