Anwesenheitssimulation

Hallo

Bin am Basteln einer Anwesenheitssimulation. Dies ist erstmal das Kern Script und es fehlt noch die Funktion zum Schalten. In der Simulation funktioniert es schon mal. Was haltet ihr von der Idee?

Grundidee ist folgende:

  • Es wird einmal gestartet (extern, Wenn keiner da ist und dunkel)
  • Es können beliebig viele Lichter verwendet werden
  • Man kann angeben wie viele Lichter max gleichzeitig leuchten sollen
  • es ist sichergestellt, dass bei der nächsten Ausführung sich der Zustand ändert.

Ablauf

  • Es wird für jede Lampe ein neuer Status per Zufall generiert
  • Ist die Gesamt Anzahl über der angegebenen zulässigen, startet das Skript von vorne
  • Ist der Zustand der gleiche wie zuvor, startet das Skript von vorne
  • Wenn zufällig gar keine Lampe aktiv ist, startet das Skript von vorne
    Sind alle Zustände OK, werden die Lampen demensprechend geschalten.
    Die neue Wartezeit wird gesetzt und das Skript startet nach der zufälligen Zeit erneut (noch nicht umgesetzt)

Wer es mal testen will (aktuelle Vorabversion):

Unter dem Skript muss als Sohn eine String-Variable mit dem Namen „speicher“ angelegt sein.

<?
$AnzahlLichterGesamt 					= 4;
$AnzahlLichterMaxGleichzeitigAn 		= 2;

$LaufzeitMinimum                    = 3;
$LaufzeitMaximumMehrAlsEineLampe  	= 10;
$LaufzeitMaximum                    = 40;

// IDs für die Lampen hier eintragen
$IDLampe1 	= 1234;
$IDLampe2 	= 4567;
$IDLampe3 	= 1234;
$IDLampe4 	= 1333;
$IDLampe5 	= 0;
$IDLampe6 	= 0;

// IPS Light Befehle integrieren
IPSUtils_Include ('IPSLight.inc.php', 'IPSLibrary::app::modules::IPSLight');
   
// Speicherort für alter Zustand der Lampen
$IDSpeicher 		= IPS_GetVariableIDByName ("speicher",$_IPS['SELF']);
$SpeicherAlt 		= getvalue ($IDSpeicher);
$AnzahlDruchlauf 	= 0;

// Anfang der Funktion
Start:

// Neuen Zustand generieren
$AnzahlDruchlauf 	= $AnzahlDruchlauf + 1;
$SummeLichter 		= 0;
$Speicher 			= "";

for ($i = 1; $i < $AnzahlLichterGesamt+1; $i++) {
	$ZustandNeu = rand(0, 1);
	$SummeLichter = $SummeLichter + $ZustandNeu;
	$Speicher = $Speicher . $ZustandNeu;
	}


// Prüfung ob der Neuzustand sich in den Grenzwerten befindet
if ($Speicher 		== $SpeicherAlt)							{goto Start;}else{}
if ($SummeLichter == 0)											{goto Start;}else{}
if ($SummeLichter > $AnzahlLichterMaxGleichzeitigAn) 	{goto Start;}else{}

if ($SummeLichter == 1){
	$Wartezeit = rand ($LaufzeitMaximumMehrAlsEineLampe, $LaufzeitMaximum);
	}else{
	$Wartezeit = rand ($LaufzeitMinimum, $LaufzeitMaximumMehrAlsEineLampe);
	}

// Lampen mit dem Neuen Status schalten
setvalue ($IDSpeicher, $Speicher);

for ($i = 1; $i < $AnzahlLichterGesamt+1; $i++) {
	$IDSchalter = "IDLampe".$i;
	$Aktuell = $i - 1;

	//IPSLight_SetSwitch
	echo $$IDSchalter ." = ". $Speicher[$Aktuell] . "
";
	}


// Ausgabe für Diagnose
echo "Alt: 	                 ".$SpeicherAlt."
";
echo "Neu:                   ".$Speicher;
echo "   ";
echo "$AnzahlDruchlauf Versuch(e) für $SummeLichter Lichter für ".$Wartezeit ." min einschalten
";


?>


Hi!

Da hat ein User mal ein Modul gebaut:
GitHub - mcbeyel/IPSAbsence

Ich hatte ihm meine Ideen dazu noch per PN geschickt (PN hab ich leider nicht mehr), weil ich selbst so ein Modul auf der 2do habe/hatte. Kam aber keine Reaktion.

Habe aber noch ein paar Notizen, mit den Gedanken die ich mir zu so einem Modul bereits gemacht hatte. Vielleicht kannst du damit was anfangen :slight_smile: Ich komme so bald eh nicht dazu da was zu machen, also überlasse ich dir/euch mal mein „Gedankengut“ :slight_smile:

Anwesenheitssimulation (Modul zur Simulation von Anwesenheit)
>> In der Form z.B. 3 Timeslots definieren lassen (z.B. 8-10Uhr, 18-20Uhr, 21-23Uhr)
>> In der Form dann jeweils ein „Aktion-Skript“ Skript auswählbar machen, welches dann innerhalb dieser Timeslots zu einer zufälligen Zeit ausgeführt wird (in diesen Skripten können die Benutzer dann verschiedene Lichter schalten oder Rollläden bewegen)
>> +2 Skripte definierbar machen bei Sonnenaufgang/-untergang

…ich denke daraus wird klar, was ich vor hab/hatte :slight_smile:

Grüße,
Chris

So jetzt mit einigen Funktionen:

  • Wählbar, ob die Lichter beim Abschalten der Simulation ihren Status behalten sollen, oder aus gehen.
  • Timer funktioniert auch

Aufbau wie Folgt:


<?
$LaufzeitMinimum                    = 60 * 3;
$LaufzeitMaximumMehrAlsEineLampe  	= 60 * 10;
$LaufzeitMaximum                    = 60 * 40;

$IDJemandAnwesend    = 28003 /*[Dienstprogramme\Anwesenheitsstatus\Irgendjemand im Haus]*/;
$IDTag         		= 35710 /*[Dienstprogramme\Sonnen Auf und Untergang\Es ist Tag]*/;

// IDs für die Lampen hier eintragen
$IDLampe1 				= 39399 /*[Program\IPSLibrary\data\modules\IPSLight\Switches\WohnzimmerStehlampe]*/;
$IDLampe2 				= 34750 /*[Program\IPSLibrary\data\modules\IPSLight\Switches\DummyDachboden]*/;
$IDLampe3			 	= 44620 /*[Program\IPSLibrary\data\modules\IPSLight\Switches\DummyBad]*/;
$IDLampe4 				= 38030 /*[Program\IPSLibrary\data\modules\IPSLight\Switches\DummyGästeklo]*/;
$IDLampe5			 	= 0;
$IDLampe6 				= 0;

$AnzahlLichterGesamt 					= 4;
$AnzahlLichterMaxGleichzeitigAn 		= 2;


// IPS Light Befehle integrieren
IPSUtils_Include ('IPSLight.inc.php', 'IPSLibrary::app::modules::IPSLight');

// Parameter Prüfen auf richtige Eingabe
if ($AnzahlLichterMaxGleichzeitigAn < $AnzahlLichterGesamt)	{}else{echo "Fehler in der Parametrierung! (Anzahl der Lichter)"; goto Programmende;}
if ($LaufzeitMinimum < $LaufzeitMaximum)							{}else{echo "Fehler in der Laufzeit! (Anzahl der Lichter)"; goto Programmende;}
if ($LaufzeitMinimum < $LaufzeitMaximumMehrAlsEineLampe)		{}else{echo "Fehler in der Laufzeit! (Anzahl der Lichter)"; goto Programmende;}

// Variablen Einleseen
$IDScript         = $_IPS['SELF'];
$Hauptschalter  	= getvalue (IPS_GetParent ($IDScript));
$LeuteImHaus      = getvalue ($IDJemandAnwesend);
$Tag      			= getvalue ($IDTag);

$IDSimulatAktiv   = IPS_GetVariableIDByName ("simulation aktiv", $IDScript);
$IDSpeicher 		= IPS_GetVariableIDByName ("speicher",$IDScript);
$IDBeiBeendenAus	= IPS_GetVariableIDByName ("ausschalten bei beenden",$IDScript);

$SpeicherAlt 		= getvalue ($IDSpeicher);
$SpeicherNeu		= "";
$AnzahlDruchlauf 	= 0;


// Logic, wann Simulation aktiv
$SimulationAktiv 	= ( $Hauptschalter and
							!$LeuteImHaus and
						   !$Tag);


// Simulation Ein und Ausschalten
if ($SimulationAktiv == true){
   setvalue ($IDSimulatAktiv, true);
	goto Start;
}else{
	IPS_SetScriptTimer($IDScript, 0);
   setvalue ($IDSimulatAktiv, false);

   if (getvalue ($IDBeiBeendenAus) == true){
   	for ($i = 1; $i < $AnzahlLichterGesamt+1; $i++) {$SpeicherNeu = $SpeicherNeu . 0;}
		goto Lampenschalten;
	}else{
		goto Programmende;
	}
}


// Anfang der Funktion
Start:

// Neuen Zustand generieren
$AnzahlDruchlauf 	= $AnzahlDruchlauf + 1;
$SummeLichter 		= 0;
$SpeicherNeu 			= "";

for ($i = 1; $i < $AnzahlLichterGesamt+1; $i++) {
	// Zufälligen Status erzeugen
	$ZustandNeu = rand(0, 1);
	$SummeLichter = $SummeLichter + $ZustandNeu;
	$SpeicherNeu = $SpeicherNeu . $ZustandNeu;
	}


// Prüfung ob der Neuzustand sich in den Grenzwerten befindet
if ($SpeicherNeu	== $SpeicherAlt)							{goto Start;}else{}
if ($SummeLichter == 0)											{goto Start;}else{}
if ($SummeLichter > $AnzahlLichterMaxGleichzeitigAn) 	{goto Start;}else{}

if ($SummeLichter == 1){
	$Wartezeit = rand ($LaufzeitMaximumMehrAlsEineLampe, $LaufzeitMaximum);
	}else{
	$Wartezeit = rand ($LaufzeitMinimum, $LaufzeitMaximumMehrAlsEineLampe);
	}



// Lampen mit dem Neuen Status schalten und Timer setzen
setvalue ($IDSpeicher, $SpeicherNeu);
IPS_SetScriptTimer($IDScript, $Wartezeit);


// Lampen schalten
Lampenschalten:
for ($i = 1; $i < $AnzahlLichterGesamt + 1; $i++) {
	$IDSchalter = "IDLampe".$i;
	// Korrektur, da bei 0 losgezählt wird
	$Aktuell = $i - 1;

	$Zustand = $SpeicherNeu[$Aktuell];
	if ($Zustand == 1){$ZustandTrueFalse = true;}else{$ZustandTrueFalse = false;}


	IPSLight_SetSwitch ($$IDSchalter, $ZustandTrueFalse);
	}

Programmende:
?>