Auslöser feststellen

Hallo,

ich habe einen Doppelaktor, der ein Licht schalten soll. Dabei kann er über ein Script geschaltet werden, was wiederum von Bewegungsmelder getriggert wird. Alternativ kann der Aktor auch direkt über einen Jung-Taster angesteuert werden. Jetzt möchte ich aber, dass bei Bewegungsmeldersteuerung das Licht nur für 20 Sekunden eingeschaltet wird, bei Tasterbenutzung soll es jedoch dauerhaft anbleiben. Ich suche nun verzweifelt nach einer Lösung, wie ich herausbekommen kann, dass der Aktor vom Jung-Schalter angetriggert wurde. Diese Workingvariable und der Status sind aber die einzigen, die sich verändern, wenn man das über den Schalter macht. Diese beiden ändern sich aber genauso, wenn der Aktor über das Script betätigt wird.
Hat jemand hierfür eine Lösung ?

lg chrissiboy

Hallo,

_$IPS[‚SENDER‘] nebst Unterfunktionen könnten hier hilfreich sein.

http://www.ip-symcon.de/service/dokumentation/konzepte/skripte/systemvariablen/

Wenn ein HM-Aktor über einen direkt angeschlossenen Taster geschaltet wird (bzw. über eine interne Gerätetaste) bekommt IPS nur die Rückmeldung vom Aktor. Die Tastfunktion selbst wird nur intern im Aktor verarbeitet (bei Funkaktoren).
Was dich aber bei eine Script natürlich nicht hindert den Auslöser (siehe Doku Systemvariablen) zu ermitteln und dann den Aktor nur für 20 sek. einzuschalten.
Natürlich ist das Verhalten und auch steuern z.b. mit On_time auch stark vom Aktor abhängig (Funk,Wired,Typ etc)
Michael

mit _$IPS[‚SENDER‘] habe ich schon herumprobiert bis zum abwinken - ich schaffe es einfsch nicht, den Unterschied zwischen Impuls am Eingang und programmgesteuertem Impuls zu erkennen…

Mehr input bitte.
Welcher Eingang ?
Welches Modul von HM?
Und wenn es z.b. ein up-Funk-Aktor ist, so kannst du den Eingang nicht auswerten :rolleyes:
Und das Script sowie ein Screenshot vom Objektbaum sind auch immer hilfreich.
Michael

es ist ein up-Funk-Aktor :frowning:
Ich habe es befürchtet, dass ich keine Chance habe, diesen auszuwerten… ich hatte gehofft, dass jemand einen Workaround gebastelt hat, den ich übernehmen kann.

Ist der Schalter im Erfassungsbereich des Bew.melders?

Gruß
Bruno

Das Licht kann über 3 Schalter angesteuert werden - zwei davon sind im Erfassungsbereich der (2) Bewegungsmelder - einer nicht. Sollte eigtl. keine Rolle spielen oder an was denkst du ?

Grüße chrissiboy

Das ist so einfach, dass ich befürchte, ich habe Dein Problem bei Deinen mageren Angaben nicht verstanden:

Wenn dieser „Jung-Schalter“ über ein Homematic-Device in IPS eingeführt wird, wird da beim ursprünglichen „Objekt hinzufügen -> Instanz -> Homematic-Device“ eine Binär-Variable angelegt, die im Default-Zustand den namen ‚STATE‘ hat.

Bei einem HM-Bewegungsmelder heißt die Binär-Variable ‚MOTION‘ (was für einen Bewegungsmelder Du verwendest, hast Du ja nicht verraten).

Für beide Binär-Variablen je ein „Objekt hinzufügen -> Ereignis“, das bei Variablenänderung ein Skript auslöst, das beim Start folgendes beinhaltet:

    
if ( !($_IPS['SENDER'] == "Variable" ) )
    die("VarEreignis: Auslöser ist nicht  'Variable', sondern '" . $_IPS['SENDER'] . "'");

// 1. Daten schnell holen, später bewerten
$IVar = IPS_GetVariable($_IPS['VARIABLE']);         // Info zur VARIABLE
$vSta = @GetValueFormatted($_IPS['VARIABLE']);      // verbaler Status Ergibt z.B.: 22,3 °C
$bSta = @GetValueBoolean($_IPS['VARIABLE']);        // Binär-Wert der Variablen: TRUE/FALSE
$aSta = $_IPS['VALUE'];                           // Analoger Wert der Variablen: 22.3
$oSta = $_IPS['OLDVALUE'];                        // Wert der auslösenden Variable vor Auslösezeitpunkt
$tSta = $IVar ['VariableValue'] ['ValueType'];    // Variablentyp (0: Boolean, 1: Integer, 2: Float, 3: String)
$IDNa = 'IPS' . $_IPS['VARIABLE'];                 // zum Key wird der ID-Name = "IPS" + ID-Nummer 5stellig
$ObjektID = $_IPS['VARIABLE'];


Bei dem o.g. Beispiel habe ich alle für Variablen verfügbaren Infos geholt, bei Deiner Applikation (bei der nur Binär-Werte ausgewertet werden) brauchst Du garnicht alle.

Im weiteren Verlauf kannst Du jetzt untersuchen, ob $ObjektID die Objekt-Nummer des Schalters oder die des Bewegungsmelder ist und das Skript kann entsprechend reagieren.

Oder hab ich Dich mißverstanden und mit Zitronen gehandelt während Du Äpfel gemeint hast? :slight_smile:

Viele Grüsse
Harald

Er hat ja noch immer nicht verraten ob seine Schalter direkt am Eingang des Aktors hängen.
Dann geht das so zumindest nicht.
Michael

Also:

Der Taster ist gewöhnlicher Schalter aus dem Hause Jung (könnte auch Kopp oder Gira oder sonst was sein), der mit IPS/Homematic nichts zu tun hat. Der verbindet beim Betätigen die Phase des Stromnetzes mit dem Eingang der UP-Aktors HM-LC-Sw2-FM und schaltet somit den Ausgang, der die Lampe ansteuert. Desweiteren steuert der Bewegungsmelder (ausgelöst durch motion) bzw. diverse Rauchmelder über ein Script (anbei) diesen Aktor.
So, und wenn der Lichtschalter betätigt wird, läuft dieses Script natürlich nicht ab, weil ich keinen Indikator dafür habe. Ich kann wohl am state oder working erkennen, dass der Aktor geschaltet hat, aber leider hat der Eingang keine Variable, die man auslesen kann und an der man erkennen könnte, dass der Eingang den Schaltvorgang ausgelöst hat. Denn dann könnte ich den else-zweig damit ausführen. Hintergrund ist, dass das Licht mit Bewegungsmelder nur 30 Sekunden eingeschaltet bleiben soll, über den Schalter aber dauerhaft.

<?

if(isset($IPS_EVENT))
   {
	switch ($IPS_EVENT)
   {
				/* Bewegungsmelder */
   case (34054 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG\Licht Flur UG schalten\]*/):
	{
         HM_WriteValueFloat(50986 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG]*/,"ON_TIME", 30);
         HM_WriteValueBoolean(50986 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG]*/,"STATE", true);
         }
   break;
   case (50657 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG\Licht Flur UG schalten\]*/):
       {
         HM_WriteValueFloat(50986 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG]*/,"ON_TIME", 30);
         HM_WriteValueBoolean(50986 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG]*/,"STATE", true);
         }
   break;
				/* Rauchmelder */
   case (25357 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG\Licht Flur UG schalten\]*/):
      HM_WriteValueBoolean(50986 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG]*/,"STATE", true);
   case (51599 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG\Licht Flur UG schalten\]*/):
      HM_WriteValueBoolean(50986 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG]*/,"STATE", true);
   case (50074 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG\Licht Flur UG schalten\]*/):
      HM_WriteValueBoolean(50986 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG]*/,"STATE", true);
   case (34902 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG\Licht Flur UG schalten\]*/):
      HM_WriteValueBoolean(50986 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG]*/,"STATE", true);

   break;
   
   default:
   }
   }
else

	 /* über Schalter ein- oder ausschalten */
	 
	if (!GetValueBoolean(39838 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG\Status]*/))
           {
          HM_WriteValueBoolean(50986 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG]*/,"STATE", true);
           }
   else
         {
         HM_WriteValueBoolean(50986 /*[Beleuchtung\Untergeschoss\Schalter Flur UG\Licht Flur UG]*/,"STATE", false);
         }
      
?>

Dadurch das die LS im Bereich von den Bewegungsmeldern sind, geht auch eine Idee die ich hätte nicht.
Weil du sonst immer im Dunkeln stehst nach 30sek, bzw. wenn du auf die LS drückst für Dauerlicht.
Ich habe mir darum für die Räume/Flure die up-Dimmaktoren für Markenschalter zugelegt, mit denen geht das alles. (OK es gehen keine ext. Taster, aber hier gibt es jetzt ja den Wandsendet für Markenschalter)
Michael
PS: Mit den Schaltaktoren für Markenschalter geht es auch nicht.

Man könnte doch über die Zeitstempel der Variablenaktualisierung auswerten, oder nicht? Aktor wird nach Bew.melder eingeschaltet --> Dauerlicht. Ist allerdings ein Schaltvorgang (bei den Tastern im Erfassungsbereich) mehr, da der ausgelöste Aktor erst ausgeschaltet werden muss und dann wieder ein.

Ich hätte vlt. eine Idee, wie das Problem zu lösen ist. Ich nehme ein Script, welches durch die Bewegungsmelder getriggert wird - dann ist vom Ablauf her alles klar.
Ein zweites Script wird durch die Working-Variable getriggert. Wenn der Timestamp der Working-Variable identisch mit dem Timestamp eines der Bewegungsmelder ist, ist klar, das das erste Scrript alles getan hat, was zu tun war. Wenn keiner der Timestamps identisch ist, muss die Working-Variable durch den externen Schalter angestoßen worden sein. Oder mache ich einen Denkfehler ? Zumindest auf Sekundenbasis sind die Timestamps immer identisch gewesen. Jetzt müsste ich herausbekommen, ob der UNIX-Timestamp auch identisch ist oder ob ich beide Timestamps umrechnen muss um sie identisch zu bekommen. Aber da gibt es sicher (?) schon eine Funktion oder Beispielscript, mit dem das geht :cool: