"Globales Script" möglich? (Invoke bei JEDEM Vorfall)

Ich suche nach einer Möglichkeit, (zusätzlich zu eventuell speziell gesetzten Scripten) ein Script IMMER ablaufen zu lassen, wenn IRGENDEIN (FS20-) Sendebefehl „in der Luft ist“.

Wie mache ich sowas am geschicktesten?

Danke
jwka

PHP: override_function - Manual

Das sollte helfen. Man beachte dabei, dass die PECL Extension APD benötigt wird. (http://museum.php.net/php5/pecl-5.1.6-Win32.zip)

paresy

Danke für die Antwort.

Aber ich glaube, ich habe mich da vielleicht etwas missverständlich ausgedrückt, also ein wenig genauer:

Wenn ich ein Script laufen lassen will, wenn ein FS20 Sensor einen Befehl sendet (z.B. beim Drücken einer Taste einer Fernbedienung), muss ich ja einen Event-Eintrag (bei meinem Script) machen, der auf die enstsprechenden FS-20 Instanz Änderung der Statusvariablen reagiert, richtig?

Wenn ich also ein Script bei JEDEM FS20-Sender-Befehl ausgeführt haben will und 50 Aktoren habe, brauche ich 50 Events bei meinem globalen Script, jeder überwacht dann einen FS20 Aktor, richtig?

Ich wollte gerne vermeiden, dass ich

1.) diese vielen Events anlegen muss
2.) Bei Hinzukommen von weiteren Aktoren dieses vielleicht vergesse.

Frage also:

Gibt es die Möglichkeit, ein Script zu erstellen, das IMMER ausgeführt wird (Modulbezogen), wenn sich innerhalb der Modulwelt „etwas tut“?

Hoffe, dass ich jetzt klarer war. Oder habe ich schlicht Deinen Override-Gedanken nicht geschnallt?

Danke
jwka

Okey. Das was du willst geht nicht und wird es auch nicht geben (falls du das gleich als Featurewunsch eintragen wollen würdest)

Evtl. kannst du ein Skript erstellen, dass dir diese Ereignisse automatisch einträgt für alle passenden Geräte. Ist dann aber kein 3 Zeiler, sondern kurz überschlagen recht kompliziert.

paresy

Jetzt würde mich noch interessieren, warum es das nie geben wird?

Overload?
Systemstabilität?

Das kann ich auh locker durch ne endlos-loop hinkriegen, und den Aufruf eines anderen Scripts gibt’s ja auch.

Und: Im Endeffekt ist „mein“ Vorgehen (was ja offenbar unterstützt wird, oder gibt es eine maximale Anzahl Events pro Script?) ja auch machbar, nur eben über Fleissarbeit.

Danke.
jwka

Brauchst Du die Reaktion sofort oder reicht nach einiger Zeit (Sekunden,Minuten)?

Ferengi-Master:

Darf ich mal fragen, was das Du mit dieser Antwort sagen willst?

Sag es doch ganz klar und unverblümt!

jwka

Ich weiss, dass ich einigen hier auf den Zeiger gehe:(. Sorry dafür, es ist nicht meine Absicht, Menschen zu nerven.

Ich habe gelernt, dass es kein globales Script gibt, das durch jeden Sensor gestartet wird. Meine daraus resultierenden Fragen (FS20 bezogen):

1.) Ist es richtig, dass ich für jeden Sensor, der ein Script triggern soll (und sei es so, dass es nur ein einziges Script gäbe) ein Event bei diesem Script anlegen muss, das auf den entsprechenden Aktor, dort auf Status oder Intensity verweist?

2.) Wenn einige der Sensoren weitere Scripts triggern sollen, kann ich dies entweder mit Logik in diesem ersten Script tun und andere Scripte aufrufen oder dadurch, bei den weiteren Scripten wiederum ein Event für den entsprechenden Aktor anzulegen?

Danke
jwka

  1. Ja
  2. Ja / Ja -> Das ist dir überlassen, wie du es lieber magst. Ich würde die 2. Option nutzen.

paresy

Danke.

Kann geschlossen werden.

Darf ich mal fragen, was das Du mit dieser Antwort sagen willst?

Die Frage bezog sich auf die Reaktionszeit, die Du benötigst wenn ein FS20 Gerät eine Änderung erlangt. Die Idee dahinter wäre ein zyklisches Script welches das FS20 Modul und die darin enthaltenen Instanzen auf Veränderungen z.B. der Stati prüft oder einfach nur der Zeitstempelveränderung.
Das würde dann die endlosen Trigger sparen.

@paresy:

hab das von Dir erwähnte Script mal eben geschrieben ;). Funzt, aber man merkt dann ganz deutlich die Aufräumarbeiten auf dem Server, der ja doch einige Events neu setzen und umbiegen muss.


<?
/*----------------------------------------------------------------------------
MASTER DATA TO USE THIS SCRIPT ON
MODIFY SCRIPT HERE ONLY !!
----------------------------------------------------------------------------*/
// ARRAY OF PLACES WHERE TO ADD EVENTS AS TRIGGERS
$PlaceOIDs = array(
				0=>41308, // TestBeep
				1=>55259, // jwtest01
				);
// ARRAY OF VARIABLES OF INSTANCES THAT SHALL TRIGGER AN EVENT
$EventTriggerVariables = array(
				0=>"StatusVariable",
//				1=>"IntensityVariable",
				);

// Generate sorted array of all mirrored instances of a certain module
// ***** MODIFY HERE FOR OTHER MODULES IF NECESSARY
$ModuleID = "{48FCFDC1-11A5-4309-BB0B-A0DB8042A969}";
$FS20_OIDs = IPS_GetInstanceListByModuleID($ModuleID);
natsort($FS20_OIDs);

// ***** CONCETENATE MORE ARRAYS HERE IF NECESSARY
$InstanceOIDs = $FS20_OIDs;

/*
// TEST VALUES
$PlaceOIDs = array(
				0=>37460, // aaaaaaa
				);

$InstanceOIDs =array(
		0 => 24142
);
// TEST VALUES
*/


// print_r( $InstanceOIDs );

/*----------------------------------------------------------------------------
MASTER LOOP
DO NOT MODIFY BEHIND THIS LINE
----------------------------------------------------------------------------*/
foreach ($PlaceOIDs as $PlaceOID) {

	$PlaceName = IPS_GetName($PlaceOID);
	echo "*** Place: ". $PlaceName . " [". $PlaceOID . "]
";

	// GET LIST OF ALL EVENTS ACTUALLY SET (TO NOT SET AGAIN)
	$PlaceEventOIDs = IPS_GetScriptEventList ( $PlaceOID );

	// LOOP ALL INSTANCES TO BE AN EVENT FOR ARRAY OF PLACES FROM INSTANCE READ
	foreach ($InstanceOIDs as $InstanceOID ){
		$InstanceName = IPS_GetName($InstanceOID);
		echo "    * Instance: " . $InstanceName . " [". $InstanceOID . "]
";

		//LOOP ALL EVENT TRIGGER VARIABLES AS DEFINED BY USER
		foreach($EventTriggerVariables as $EventTriggerVariable){
			$EventTriggerVariableOID = IPS_GetStatusVariableID($InstanceOID, $EventTriggerVariable);
			echo "      * TriggerVariable: " . $EventTriggerVariable . " [". $EventTriggerVariableOID . "]
";

			// LOOK IF TRIGGER VARIABLE ALREADY IN EVENTLIST --> NOT SET AGAIN
			$i=0;
			foreach($PlaceEventOIDs as $PlaceEventOID){

				echo "        * PlaceEvent:  ID only no name [" . $PlaceEventOID . "]";
            $EventProperties = IPS_GetEvent ( $PlaceEventOID );
			   $EventTriggerOID = $EventProperties["TriggerVariableID"];
			   echo "  triggered by: " . $EventTriggerOID;
				if ($EventTriggerOID == $EventTriggerVariableOID) {
				   echo "**** MATCH ==> EXISTS ALLREADY !!! ***";
				   $i++;
				}
				echo "
";
			}
			echo $i . "
";
			// IF NOT FOUND IN EVENT LIST, SET THE INSTANCE's VARIABLE AS AN EVENT TRIGGER
			if ( $i == 0) {
 					$newOID = IPS_CreateEvent(0);
					$success[0] = IPS_SetParent ( $newOID, $PlaceOID);
					$success[1] = IPS_SetEventTrigger ( $newOID , 0, $EventTriggerVariableOID );
					$success[2] = IPS_SetEventActive ( $newOID, True );
			}
		}
	}
}
?>

4 foreach Schleifen geschachtelt können nicht performant sein :slight_smile:

Es fehlt übrigens noch der Fall, dass du Events hast, die „zu viel“ sind und gelöscht werden müssen.

paresy

@Ferengi-Master:
Ich hatte mir das auch überlegt mit einem zyklischen Script, aber leider kann ich im Moment überhaupt nicht die „Serverload“ abschätzen.

Evtl. wäre das ja auch für ein „permanenlaufendes Script“, wenn die Serverleistung das hergibt.

Da ich mit diesem Script u.a. die Schaltbefehle „duplizieren“ will (um die Zuverlässigkeit z uerhöhen), die von den Schaltern ausgesendet werden, müsste das schon eher im Bereich von Milisekunden den Sekunden sein und somit scheidet ein Timer-gesteuertes Script m.E. aus.

Ich fände es grundsätzlich überlegenswert, je Modulgruppe, die man benutzt, ein eigenes „permanentes“ Script zu haben, mit dem man dann etwas anstellen kann.

Ich meine, IPS überwacht ohnehin, was los ist und erkennt mit Sicherheit auch, zu welchem Modul eine Instanz, die geändert wurde, gehört. Da dann noch ein Script zu starten, kann auch nicht schwerer sein, als alle Events abzuklappern (dafür gibt es sicher intern eine intelligente Tabelle) die zu einer Instanz gehören.

Bei einer mittleren Installation: Wieviele solche Scripte wären von IPS zu überwachen bzw. anzustossen? 5? 10?

Ich fände es auch interessant, mal ein paar „Daumenwerte“ zu bekommen, was die Mögflichkeiten/Grenzen von IPS anbetrifft und wie sich einzelne Vorgehensweisen da auswirken. Ich weiss schon, dass das nicht leicht ist und dass es fast unmöglich ist, konkrete Zeiten anzugeben (selbst ein mickriges kleines Script läuft mal 2ms, mal 15ms), aber relative Werte würden ja u.U. auch schon helfen: 10 Events abzuarbeiten == 5 Schaltvorgänge FS20 oder so.

@Paresy:
Habe nicht gesagt, dass dieses Script der letzte Wurf ist, ist ja Version „0.9“, und von einem Anfänger programmiert.

Es stimmt, dass ich vorhandene doppelte nicht lösche. Ich lege aber vorhandene Events auch nicht ein zweites mal an, greife also in das vorhandene Setup gar nicht ein. Doppelte können also nur vom User kommen.

Das mit den 4 foreach stimmt zweifellos, ist aber gar nicht das Bottleneck.

Ohne setzen der Events läuft das Script bei mir mit ca. 30 Aktoren immer so um die 20ms, manchmal auch leicht mehr. Die Laufzeit des Scripts verändert sich dann mit setzen der Events nur unmerklich.

AAAAABER:
Die vier Anweisungen, die die Events anlegen, die sind - im Backend - irre lahm. Es dauert deutlich über eine Minute (im Vergleich zu 20 ms), bis die Events überhaupt angelegt sind. Ich denke, da ist erheblich mehr Optimierungsbedarf als bei den foreach!

Und: Auch das Löschen der neuen 30 Events in der IPS Console dauert schlapp 25 Sekunden.

Während dem Anlegen und dem Löschen ist das Frontend praktisch tot. Selbst umschalten zwischenIPS Fenstern (in den Baum wechseln, um zu sehen wann die Events angelegt sind) dauert Sekunden.

Und an der Performance des Systems kanns nicht liegen: Vista Server 2GB Ram, 1,1 GB uesd, dual core, 7200er Festplatte. Last bei 5%. Und der Client kann das Bottleneck ja auch nichjt sein mit seinen paar anzeige-Aufgäbchen.

jwka

…Da ich mit diesem Script u.a. die Schaltbefehle „duplizieren“ will (um die Zuverlässigkeit z uerhöhen)…

Mich würde in diesem Zusammenhang einmal die Größe des Projekts interessieren welches Du vor hast zu realisieren. (z.B. Anzahl der FS20 Komponenten) Die Frage stelle ich deshalb, weil den Aufwand den Du in die Verbesserung der FS20 Zuverlässigkeit steckst bestimmt noch kein anderer hier um Forum betrieben hat und auch bei nochsoviel gutgemeinter PHP Unterstützung durch Scripte wird aus FS20 kein XComfort etc. Ich finde Schaltbefehle zu dublizieren an sich schon nicht besonders toll.

Hi Ferengi Master,

ich denke nicht, dass mein Projekt aussergewöhnlich groß wird. Aber auch kleine Projekte können den Anspruch an den Realisierer stellen, so gut wie eben möglich umgesetzt zu werden.

Und meine eine schwäbische Hirnwindung sitz bei mir leider im Finanzzentrum …

Konkrete Antwort: Ich werde in der Endausbaustufe wohl haben (+/- 10%, habe nicht genau nachgezählt):

  • 20 Jalousieaktoren
  • ca. 70 Licht-/Steckdosen-/Schwachstrom-/Individual-aktoren aller couleur
  • 40 „Schalter“, 3-4 Touchscreens
  • 10 Fernsteuerungen
  • 10-20 Bewegungsmelder
  • Heizungssteuerung „konventionell“
  • Heizungssteuerung per PPM für elektrische Fussbodenheizung
  • Beregungsanlage mit 10 Kanälen
  • Poolsteuerung
  • Alarmsteuerung und Überwachung
  • Sonderfunktionen wie Panik, Anwesenheitssimulation, Leave & Come Funktionen, Badezimmer-Siegelheizung, …
  • Szenariensteuerung (Abendessen mit Freunden) mit integration von Playlists und Audio/Video-Preset
  • Einbindung von Sound, HiFi, Aussenbeschallung, Multiroom per UPNP und IRTrans (7 unabhängige Anlagen) sowie UPNP Controllerfunktionen
  • Steuerung per Touch auf Win, Linux und Devices wie Nokia 810/Nachfolger, iTouch etc.

Teilweise werde ich wohl zusätzlich einsetzen (müssen):

  • EIB oder LCN
  • 1 Wire
  • ???

Na ja und noch ein paar kleinere Schnickschnacks sowie einen möglichst hohen WAF (schwerstarbeit zu leisten, weil die überall verbauten FS20 Touch schwer durchgefallen sind).

Also nicht wirklich mehr als ein normaler „Häuslebesitzer“ auch machen würde, wenn er (wie ich) so ein Idiot wie ich wäre, der nur „Eins oder Null“ kann.

Nach meinem bisherigen Stand machen mir nur einige „blöde“ Restriktionen das Leben schwer, weniger die tatsächliche ZUverlässigkeit der FS20 Komponenten.

Hier die Liste meiner bisherigen Hürden:

  • ein paar wenige unwillige Aktoren (werden versetzt, teilweise zentrale Beschschaltung mit FS20 Hutschiene), 3-4 Sender an einer FHZ

  • FHZ 1000 Sendezeitlimit (BIG PROBLEM)

  • Stromausfälle hier (das kennt man in BRD so 5 mal im Jahr, hier ist das in der Regenzeit schlimmstenfalls 10 mal am Tag --> Aktoren fallen ab und bei Strom wieder da sit Licht trotzdem aus)

  • ein paar Hürden in der IPS

  • und mein Unvermögen, das ich wohl nie ganz ausräumen werde

Was mir an der FS20 gefällt:

  • mit Abstand am preiswertesten
  • mit Abstand die meisten Modifikationsmöglichkeiten für einen Bastler
  • Funk, denn in meinem EG gibt mein Umbau nur an wenigen Stellen Kabel her, und einige spanische Restriktionen (überall Rohr und doch darf ich nicht EIB verlegen weil Einzeladern-Verkabelung und EIB hier in einem Rohr unzuläsig)

Und: Ich wollte mit max. 7.000 - 10.000 EUR mit dem ganzen Zeug raus kommen.

Ciao
jwka

Das ist ne ganze Stange was Du da vor hast. Das Sendezeitproblem hatte ich bei meiner Frage auch im Hinterkopf wegen der Schaltdublikate. Ich habe auch mit FS20 angefangen und halte es heute an vielen Stellen für Geldverschwendung. Jeder hat da natürlich andere Ansprüche. Meiner liegt definitiv auf Multimedia und Komfort.
Ein Beispiel: Ich gebe in den meisten Räumen im Haus Informationen via Sprachausgabe aus, dazu muß ich feststellen ob jemand im Raum ist, dies ist entweder über Bewegungsmelder oder über die Abfrage von Aktoren möglich. Sprich meine Frau schaltet in einem Raum mittels Standardtaster das Licht ein. Bei einem bidirektionalen System kein Problem. Der Status ist IPS bekannt oder kann sogar abgefragt werden. Bei FS20 brauch ich dazu schon einen speziellen und nicht so schönen Taster und der Status ist nicht sicher. Dafür würde mit BiDi die Sache locker das 2-3 fache Kosten… Ich wünsche Dir viel Erfolg. Und bin gespannt auf die Langzeitergebnisse.:wink:

Jemand der alles so Vorsichtig prüft und sowas von TOTAL sicher haben will, würde ich ERNSTHAFT abraten FS20 zu nehmen. Du versuchst im Prinzip das Chassis eines Porsche zu nehmen und mit einem 0815 Motor zu nutzen. Sicher bekommt man die Karre in Bewegung. Aber das was du hier versuchst, ist einfach nur total gespalten.

Einerseits alles abklären wollen - Andererseits den offensichtlichen Fehler außer acht zu lassen.

Lass es dir wirklich sagen. Vergiss FS20.

paresy