Abfrage welcher Schalter zuerst kommt (Richung Erkennen ob Haus verlassen / betreten)

Hallo Freunde

ich steh vor einem Problem und zwar möchte ich erkenne, ob ich zum Haus heraus gehe oder hineinkomme.
Dazu ist an der Haustür ein Schalter und im Eingang ein Bewegungsmelder bzw. die Flurtür könnte auch abgefragt werden.

Mein Problem ist zu erkennen welcher Schalter von beiden zuerst kommt

  1. Haustür -> 2. Flurtür => Heim kommen
  2. Flurtür -> 2. Haustür => Haus verlassen.

wie könnte man das in einem Skript abfagen? Ich steh gerade echt auf den schlauch.

na du musst ja eine „Frist“ definieren in der auch der 2. Kontakt ausgelöst werden muss, kann ja sein das NUR z.B. der Bewegungssensor ausgelöst wird.

Also musst du ein Aktualisierungs-Event auf beide Schalter legen, dort nen Timer starten und wenn innerhalb der Frist des Timer auch der 2. Schalter ausgelöst wird hast du dein „Ereignis“. Dabei dann prüfen ob der jeweils andere Timer schon läuft, wenn ja ist die aktuelle „Aktion“ die 2. und das Ereignis ist vollständig. Wenn nein ist das aktuelle Ereignis das 1. und du musst den Timer aufziehen und warten…

Vergiss es.
Im richtigen Leben klappt das nicht. Will sagen es klappt schon, aber nur wenn du dich immer streng an die Regel -
erst Haustür - dann Flurtüre bzw. umgekehrt hältst.

Wenn du aber mal auf halbem Weg umdrehst, oder eine der beiden Türen offenbleibt, zusätzlich noch besuch durch eien Türe huscht, oder sonst irgendeine Abnormalität im Ablauf eintritt kommt alles durcheinander.

Ansonsten ist das doch mit einer Hilfsvariablen in der du speicherst welche Türe vorher geöffnet wurde und ein paar kleinen If - Then leicht zu erledigen.

gruß
bb

Fibaro wirbt für seine Motion-Sensoren sogar mit dieser Funktion, dann aber so das man wirklich an ein und der selben Tür 2 Motion-Sensoren befestigt, einmal Innen einmal Außen, dazwischen kann dann nur sehr schwerlich was passieren, höchstens man dreht sozusagen auf der Schwelle um… da wir dann bestimmt auch mit einem Timeout gearbeitet.

naja es soll nicht für lebenswichtige aufgaben sein. sondern nur erkennen wenn ich raus gehe, dass er sagt hey nimm den müll mit (tts) und das eben nicht sagt wenn ich heim komme. sowas wie hallo und tschüss wäre ne nette spielerei.

Hey,

Hilfsvariable war schon eine gute Idee! Einfach die Hilfsvariable immer mit dem aktuellen Türnamen füttern. Ein Script erstellen was den aktuellen Wert mit den vorherigen vergleicht und das bei Wertänderungen der hilfsvariable ausführen.

Gruß Bernd

die idee ist gut. und wenn innerhalb von 5 min nix anderes passiert dann wird zurück gesetzt.

Damit klappts schonmal ganz gut.
etwas komplex, aber auch fehlbedienung wird abgefangen.

hier das checken script.

<?

// Tür Öffnen = true

$IDScript = ($_IPS['SELF']);
$IDParent = IPS_GetParent ($IDScript);

// IDs heraussuchen
$IDTuerAussen 		= IPS_GetEventIDByName ("TuerAussen",$IDScript);
$IDTuerInnen  		= IPS_GetEventIDByName ("TuerInnen",$IDScript);
$IDRichtungRein  	= IPS_GetVariableIDByName ("Richtung Reinkommen", $IDParent);
$IDRichtungRaus  	= IPS_GetVariableIDByName ("Richtung Rausgehen", $IDParent);
$IDMerker     		= IPS_GetVariableIDByName ("Merker", $IDScript);
$IDRuecksetzscript= IPS_GetScriptIDByName ("zurücksetzen", $IDParent);
$IDTimer 			= IPS_GetEventIDByName ("timer", $IDRuecksetzscript);

// Werte herauslesen
$WertTuerAussen 	= GetValue(IPS_GetEvent($IDTuerAussen)['TriggerVariableID']);
$WertTuerInnen  	= GetValue(IPS_GetEvent($IDTuerInnen)['TriggerVariableID']);
$WertMerker 		= Getvalue ($IDMerker);

// Die Zeit solange das Ergebnis anstehen soll
$Wartezeit = 3000;



switch ($WertMerker) {
   case "nix":
		if ($WertTuerInnen == true){
			// Setzt den Merker auf Innen zuerst und aktiviert den Timer
			setvalue ($IDMerker,"Innen zuerst");
			IPS_SetEventActive ($IDTimer, true);
			}else{
			// Setzt den Merker auf Aussen zuerst und aktiviert den Timer
			setvalue ($IDMerker, "Aussen zuerst");
			IPS_SetEventActive ($IDTimer, true);
			}
		break;

	case "Innen zuerst":
		if ($WertTuerInnen == true){
			// Wird wieder zurückgesetzt
			setvalue ($IDMerker, "nix" );
			}else{
			// Durchgang erkannt, schaltet die Variabel für angegebene Zeit auf true
			IPS_SetEventActive ($IDTimer, false);
			setvalue ($IDRichtungRaus, true);
			IPS_Sleep ($Wartezeit);
			setvalue ($IDRichtungRein, false);
			setvalue ($IDRichtungRaus, false);
			setvalue ($IDMerker,"nix");
			}
      break;
        
    case "Aussen zuerst":
		if ($WertTuerInnen == true){
			// Durchgang erkannt, schaltet die Variabel für angegebene Zeit auf true
			IPS_SetEventActive ($IDTimer, false);
			setvalue ($IDRichtungRein, true);
			IPS_Sleep ($Wartezeit);
			setvalue ($IDRichtungRein, false);
			setvalue ($IDRichtungRaus, false);
			setvalue ($IDMerker,"nix");
			}else{
			// Wird wieder zurückgesetzt
			setvalue ($IDMerker, "nix");
			}
      break;
}



?>


und hier das rücksetzen script

<?

$IDScript = ($_IPS['SELF']);
$IDParent = IPS_GetParent ($IDScript);

// IDs heraussuchen
$IDCheckenScript 			= IPS_GetScriptIDByName ("checken",$IDParent);
$IDZuruecksetzenScript 	= IPS_GetScriptIDByName ("zurücksetzen",$IDParent);

$IDMerker = IPS_GetVariableIDByName ("Merker",$IDCheckenScript);
$IDTimer = IPS_GetEventIDByName ("timer", $IDZuruecksetzenScript);

// Merker zurücksetzen und Timer deaktivieren
setvalue ($IDMerker,"nix");
IPS_SetEventActive ($IDTimer, false);

?>

interessant wäre aber auch den Status schon beim öffnen der ersten Tür auszugeben.