Anwesenheitssimulation

Hallo zusammen,

um die Anwesenheit zu simulieren, hab ich mir folgendes Skript geschrieben. Es basiert auf dem Skript der zufälligen Gartenbeleuchtung, welches Steiner mal gepostet hat.

Was braucht man?

  • Eine Boolean-Variable, die ich beim Aus-dem-Haus-gehen über den Touch auf True setze.
  • Das Skript selbst hat zwei Timer. Einmal einen über obige Variable getriggert (OnChange), den zweiten um immer ein Licht unterschiedlich lange zu schalten.

Die zu schaltenden Lichter werden im Anfang des Skripts in einem Array deklariert. Fügt man mehrere hinzu, muss man die Anzahl in dem rnd-Befehl anpassen (könnte man auch noch automatisch über die Array-Länge machen…).

Hier das Skript:


<?
$instances = array(32881 /*[Erdgeschoss\Küche\Sockelbeleuchtung]*/, 55938, 10595 /*[Obergeschoss\Galerie\Bücherregal]*/);
if ($IPS_EVENT == 32272 /*[.System\Anwesenheit\Anwesenheitssimulation\]*/) {
	switch ($IPS_VALUE) {
	   case true:
	      IPS_SetEventActive(47429 /*[.System\Anwesenheit\Anwesenheitssimulation\]*/, true);
	      IPS_SetEventCyclic(47429 /*[.System\Anwesenheit\Anwesenheitssimulation\]*/, 0, 0, 0, 0, 2, 1);
   		print_r("Abwesenheitssimulation aktiv");
   		break;
		case false:
		   IPS_SetEventActive(47429 /*[.System\Anwesenheit\Anwesenheitssimulation\]*/, false);
   		$current = GetValue(40049 /*[.System\Anwesenheit\sys_V_int_dev_act]*/);
			if (GetValue(IPS_GetStatusVariableID($instances[$current], "StatusVariable")) != false) {
				FS20_SwitchMode ($instances[$current], false);
			}
			print_r("Abwesenheitssimulation inaktiv");
			break;
  }
}

if ($IPS_EVENT == 47429 /*[.System\Anwesenheit\Anwesenheitssimulation\]*/)  {
   $time = time();
	$start_time = strtotime(GetValue(27745 /*[.System\Wetter\Sonnenuntergang]*/));
	$end_time = strtotime("00:00")+60*60*24;
	if (($time >= $start_time) and ($time <= $end_time)) {
		$current = GetValue(40049 /*[.System\Anwesenheit\sys_V_int_dev_act]*/);
		$last = GetValue(50262 /*[.System\Anwesenheit\sys_V_int_dev_old]*/);
		$rnd = rand(0,2);
		while (($rnd == $current) or ($rnd == $last)){
	   	   $rnd = rand(0,2);
		}
		FS20_SwitchMode ($instances[$rnd], true);
		FS20_SwitchMode ($instances[$current], false);
		$duration = rand(10,60);
		IPS_SetEventCyclic(47429 /*[.System\Anwesenheit\Anwesenheitssimulation\]*/, 0, 0, 0, 0, 2, $duration);
		SetValue(40049 /*[.System\Anwesenheit\sys_V_int_dev_act]*/, $rnd);
		SetValue(50262 /*[.System\Anwesenheit\sys_V_int_dev_old]*/,$current);
	} else {
		if (GetValue(IPS_GetStatusVariableID($instances[GetValue(40049 /*[.System\Anwesenheit\sys_V_int_dev_act]*/)], "StatusVariable")) != false) {
			FS20_SwitchMode ($instances[GetValue(40049 /*[.System\Anwesenheit\sys_V_int_dev_act]*/)], false);
		}
	}
}
?>

Sobald die Uhrzeit später als der Sonnenuntergang ist, startet die Anwesenheitssimulation und läuft in meinem Fall bis 01:00Uhr.
Kommt man vorher nach Hause, wird die gerade aktive Lampe ausgeschaltet.

Gruß und vielleicht kann´s der ein oder andere gebrauchen. :slight_smile:

Gruß
dfhome

Hi dfhome

Ich kann das Script gebrauchen bzw. möchte ich es gerne mal ausprobieren. Leider steige ich aber bei dem Wust aus Objekt ID’s nicht ganz durch, da alle gleiche Namen haben und ich nicht ganz verstehe was für was ist !

Vielleicht kannst Du mir ja ein wenig auf die Sprünge helfen.

Was steckt hinter den folgenden ID`s:

32272 /[.System\Anwesenheit\Anwesenheitssimulation]/

47429 /[.System\Anwesenheit\Anwesenheitssimulation]/

40049 /[.System\Anwesenheit\sys_V_int_dev_act]/

50262 /[.System\Anwesenheit\sys_V_int_dev_old]/

Hallo Andy,

klar kann ich helfen. Also:

32272 /[.System\Anwesenheit\Anwesenheitssimulation]/:
Ist die ID des Events, welches über die Boolean-Variable getriggert wird. Quasi der An/Aus-Schalter.

47429 /[.System\Anwesenheit\Anwesenheitssimulation]/:
Ist die ID des Events zum Schalten der Lichter. Dessen Ausführungsintervall wird über die Zufallsgenerierung festgelegt. Ist aber nur aktiv, wenn durch obiges Event dieses Event aktiviert wurde.

40049 /[.System\Anwesenheit\sys_V_int_dev_act]/:
Darin wird die ID der gerade aktiven Lampe hinterlegt. Dient dazu, dass bei der Zufallszahlengenerierung nicht zweimal hintereinander dieselbe Lampe oder die zuvor gewählte Lampe geschaltet wird.

50262 /[.System\Anwesenheit\sys_V_int_dev_old]/ :
Dito s.o. Weiterhin aber auch, damit ich beim Ausschalten weiß, welche Lampe gerade an ist.

Sorry, aber ich blicke es auch nicht.
Ginge diese Beschreibung etwas detaillierter ?

Was muss wie angelegt werden und was für Variablen und Events sind in welcher Form nötig.

Habe es versucht hinzubekommen, aber er sagt mit immer dass er keine Variable mit dem Namen IPS_Event in Zeile 3 und 21 kennt.

Hilfe wäre nett…

Danke vorab.

Gruss
B71

Klar, ich schreib euch heut abend noch was dazu.

Ok, hier auch mal mit Bildchen, evtl. einfacher:
„Event 40466“ startet die Simulation bzw. stopt sie. Dieses Event läuft über das OnChange-Ereignis der Variablen, mit der die Simulation gestartet wird. Ist $IPS_VALUE == true, wird das zyklische Event 47429 gestartet, welches nur dazu da ist, jede Minute die Uhrzeit zur Verfügung zu stellen und das Skript minütlich zu triggern.
Im zweiten Teil des Skripts wird nun eine Zufalls-Einschaltzeit und eine „Zufallslampe“ generiert. Das ist der Part, den ich von Steiner übernommen hab.

Falls noch Fragen sind, helf ich gern.

…nun habe ich jedoch 6 Lampen die ich ansteuern möchte.

Was meinst Du im Eingangspost mit „Anpassung der rnd Funktion“.

Könntest Du das bitte etwas genauer spezifizieren ? Oder mir sagen, wie diese Änderung aussehen müsste ?

Gruss & Danke
B71

Klar, ist ganz einfach:

alle ID´s deiner Lampen, die Du steuern willst, kommen in das Array in der ersten Zeile.
Dann musst Du noch folgende Zeilen (Zweimal im Skript!)

$rnd = rand(0,2); 

in

$rnd = rand(0,5); 

ändern, da Du ja, anders wie im Beispiel, 6 Lampen hast. Das bezieht sich auf die Zufallszahl, die generiert wird => diese ist der Index für das Array für die neu zu schaltende Lampe.

So, hoffe, dass jetzt alles klappt. :slight_smile:

Danke.
Sollte nun gehen.

Gruss
B71

@dfhome

Habe seit längeren Dein Script laufen, mit dem Effekt dass egal ob die Einschaltvariable auf True oder False steht, immer nach dem ermittelten Sunset die Simulation startet?

Irgend eine Idee ?

Ich erhalte beim Ausführen des Scripts die folgende Fehlermeldung:

Notice: Undefined variable: IPS_EVENT in E:\WinAnw\Technik\Ips\IP-Symcon\scripts\55808.ips.php on line 10

Notice: Undefined variable: IPS_EVENT in E:\WinAnw\Technik\Ips\IP-Symcon\scripts\55808.ips.php on line 30

Wo wird denn die Variable IPS_EVENT definiert ?

Ich konnte bisher auch noch keine brauchbare Objekt-Zuordnung für die ID 32272 finden?

(Zitat: „32272 /[.System\Anwesenheit\Anwesenheitssimulation]/:
Ist die ID des Events, welches über die Boolean-Variable getriggert wird. Quasi der An/Aus-Schalter.“)

Als was und wie richte ich für diese ID ein sprechendes Objekt (Instance, Variable oder Ereignis) ein ?

Vielen Dank vorab
Ralf

Hallo Ralf,

alle $IPS_ Variablen stehen erst zum Zeitpunkt des getriggerten Aufrufes zur Verfügung bzw. wenn Sie durch ein anderes Skript gestartet werden (IPS_RunScriptEx).

Bei einem Start durch den „Ausführen-Button“ im Skripteditor sind diese $IPS_ Variablen nicht definiert.

Bin gerade auch daran eine AW Simu zu bauen und wollte mir ein paar Gedanken aus dem Skript „borgen“. Dabei ist mir folgendes aufgefallen - mag es sein, dass ich da grob falsch liege mit folgendem … ???

Frage: Hast Du das Script mal laufen lassen, bis, sagen wir 01:30 und:

  • NICHT vorher bzw. hinterher ausgeschaltet
  • UND die Schaltvorgänge ab 00:00 Uhr überprüft?

denn:

Ich glaube, dass das Script ab 00:00 nicht mehr schaltet, sondern einfsch nur so weiterläuft - und das, bis es wieder manuell ausgeschaltet wird (wobei es sicht m.E. beim erreichen der Endezeit ja wohl doch selbst ausschalten sollte?

Warum meine Annahme?

1.) Wenn ich das richtig sehe, ist doch beim zweiten Teil der if-Abfrage:

if (($time >= $start_time) and ($time <= $end_time)) {

$end_time IMMER größer als $time, denn beide Zeiten werden ja zur Laufzeit festgestellt und da ist $end_time = strtotime(00:00) + 606024 IMMER die der aktuellen Zeit FOLGENDE Mitternacht, also IMMER größer als time()???

Insofern ist der zweite Teil der if-Abfrage doch IMMER true??? Oder übersehe ich da grad was ganz gravierend?

Es müsste doch zum Zeitpunkt des Einschaltens einmalig der Ende-Zeitpunkt festgeschrieben (–>Variable) werden und gegen diese dann immer feste Endzeit die aktuelle Laufzeit verglichen werden, oder?

2.) Ab 00:00 Uhr ist der erste Teil der Bedingung IMMER falsch, wenn $start_time einen „normalen“ Wert von irgendwie zwischen 16:00 Uhr (Winter) und 22:00 Uhr (Sommer) einnimmt?

3.) Glaube ich, dass das Script, einmal getriggert (und nicht per Schalter ausgeschaltet), unendlich alle Minute getriggert wird, weil die Ausschaltung des Timers beim Zeitabfrage-Ende fehlt. Dass es nicht mehr zu Schaltvorgängen kommt, liegt m.E. an der if Abfrage, aber das minütliche Starten des Script bleibt und kostet Ressourcen. Und ab dem nächsten Abend läuft dann die Simulation wieder.

Das kann im Einzelfalle oder Urlaubsfalle gewünscht sein … sollte man aber vielleicht mit einem Urlaubsprogramm koppeln, oder?

Kopfkratz …
jwka

Hallo zusammen,

habe folgendes Problem und finde den Fehler nicht!

ich habe folgendes Script von hier und es funktioniert auch alles bis auf das das die Anwesenheit nicht abschaltet!
bzw. d.h. die Anwesenheitsimulation sollte an bleiben aber ab einer gewissen Uhrzeit sollten die Lampen denoch ausgehen und nicht die ganze Nacht durchbrennen.

<?
$instances = array(54839 /[Lichter\Licht Küche]/, 34982 /Stehlampe/, 12682 /Gang/);
if ($IPS_EVENT == 56840 /[Anwesenheitssimulation\Anwesenheitssimulation]/) {
switch ($IPS_VALUE) {
case true:
$AnwesenheitsVar=IPS_CreateVariableProfile(„AnwesSimulAn“,1); //erstellt ein VarProfil zur Erkennung nach REchnerneustart ob Alarmanlage scharf
$Temp=IPS_VariableProfileExists(„AnwesSimulAn“);
if ($Temp==True)
{
SetValue(14626 /[Anwesenheitssimulation\Startmeldung]/,„Var AnwesSimulAn angelegt“);
}
else
{
SetValue(14626 /[Anwesenheitssimulation\Startmeldung]/,„Var AnwesSimulAn fehlt“);
}
IPS_SetEventActive(38187 /[Anwesenheitssimulation\Anwesenheitssimulation]/, true);
IPS_SetEventCyclic(38187 /[Anwesenheitssimulation\Anwesenheitssimulation]/, 0, 0, 0, 0, 2, 1);
print_r(„Anwesenheitssimulation aktiv“);
SetValue(14626 /[Anwesenheitssimulation\Startmeldung]/,„Anwesenheitssimulation aktiv“);
break;
case false:
IPS_DeleteVariableProfile(„AnwesSimulAn“); //Variable löschen für Rechnerneustart Erkennung ob Alarmanlage scharf
IPS_SetEventActive(38187 /[Anwesenheitssimulation\Anwesenheitssimulation]/ , false);
$current = GetValue(53314 /[Anwesenheitssimulation\awsimAktivLampe]/);
if (GetValue(IPS_GetStatusVariableID($instances[$current], „StatusVariable“)) != false) {
FS20_SwitchMode ($instances[$current], false);
}
print_r(„Anwesenheitssimulation inaktiv“);
SetValue(14626 /[Anwesenheitssimulation\Startmeldung]/,„Anwesenheitssimulation aus“);
break;
}
}

if ($IPS_EVENT == 38187 /Timer der die Lichter per Zufall steuert/ ) {
$time = time();
$start_time = strtotime(„18:15“); /* startet um 18:15 /
$end_time = strtotime(„20:00“)+60
6024;
if (($time >= $start_time) and ($time <= $end_time)) {
$current = GetValue(53314 /
[Anwesenheitssimulation\awsimAktivLampe]/);
$last = GetValue(16196 /
[Anwesenheitssimulation\awsimLampOnOld]/);
$rnd = rand(0,2);
while (($rnd == $current) or ($rnd == $last)){
$rnd = rand(0,2);
}
FS20_SwitchMode ($instances[$rnd], true);
FS20_SwitchMode ($instances[$current], false);
$duration = rand(10,60);
IPS_SetEventCyclic(38187 /Timer der die Lichter per Zufall steuert/ , 0, 0, 0, 0, 2, $duration);
SetValue(53314 /
[Anwesenheitssimulation\awsimAktivLampe]/, $rnd);
SetValue(16196 /
[Anwesenheitssimulation\awsimLampOnOld]/,$current);
} else {
if (GetValue(IPS_GetStatusVariableID($instances[GetValue(53314 /
[Anwesenheitssimulation\awsimAktivLampe]/)], „StatusVariable“)) != false) {
FS20_SwitchMode ($instances[GetValue(53314 /
[Anwesenheitssimulation\awsimAktivLampe]*/)], false);
}
}
}
?>

So habe nun das Script nochmal komplett neu gemacht jedoch wieder
selbes ergebniss. Es Läuft über die Endzeit einfach hinaus weiter und wechselt fröhlich die lampen unendlich weiter :frowning:

<?
$instances = array(54839 /*[Lichter\Licht Küche]*/, 34982 /*Stehlampe*/, 12682 /*Gang*/);
if ($IPS_EVENT == 56840 /*[Anwesenheitssimulation\Anwesenheitssimulation\]*/) {
    switch ($IPS_VALUE) {
       case true:
          IPS_SetEventActive(38187 /*[Anwesenheitssimulation\Anwesenheitssimulation\]*/, true);
          IPS_SetEventCyclic(38187 /*[Anwesenheitssimulation\Anwesenheitssimulation\]*/, 0, 0, 0, 0, 2, 1);
           print_r("Abwesenheitssimulation aktiv");
           break;
        case false:
           IPS_SetEventActive(38187 /*[Anwesenheitssimulation\Anwesenheitssimulation\]*/, false);
           $current = GetValue(53314 /*[Anwesenheitssimulation\awsimAktivLampe]*/);
            if (GetValue(IPS_GetStatusVariableID($instances[$current], "StatusVariable")) != false) {
                FS20_SwitchMode ($instances[$current], false);
            }
            print_r("Abwesenheitssimulation inaktiv");
            break;
  }
}

if ($IPS_EVENT == 38187 /*[Anwesenheitssimulation\Anwesenheitssimulation\]*/)  {
   $time = time();
     $start_time = strtotime("15:20"); /* startet um 20:15 */
    $end_time = strtotime(",16:00")+60*60*24;
    if (($time >= $start_time) and ($time <= $end_time)) {
        $current = GetValue(53314 /*[Anwesenheitssimulation\awsimAktivLampe]*/);
        $last = GetValue(16196 /*[Anwesenheitssimulation\awsimLampOnOld]*/);
        $rnd = rand(0,2);
        while (($rnd == $current) or ($rnd == $last)){
              $rnd = rand(0,2);
        }
        FS20_SwitchMode ($instances[$rnd], true);
        FS20_SwitchMode ($instances[$current], false);
        $duration = rand(10,60);
        IPS_SetEventCyclic(38187 /*[Anwesenheitssimulation\Anwesenheitssimulation\]*/, 0, 0, 0, 0, 2, $duration);
        SetValue(53314 /*[Anwesenheitssimulation\awsimAktivLampe]*/, $rnd);
        SetValue(16196 /*[Anwesenheitssimulation\awsimLampOnOld]*/,$current);
    } else {
        if (GetValue(IPS_GetStatusVariableID($instances[GetValue(53314 /*[Anwesenheitssimulation\awsimAktivLampe]*/)], "StatusVariable")) != false) {
            FS20_SwitchMode ($instances[GetValue(53314 /*[Anwesenheitssimulation\awsimAktivLampe]*/)], false);
        }
    }
}
?>