Alarmscript Ideen

Hallo zusammen,

stehe vor nem Problemchen und würde euch gerne mal um ein paar Ideen bitten.

Also: Ich will meine Alarmsteuerung und Visualisierung komplett mit IPS realisieren. Habe auch schon ein paar Grundideen…leider scheint das Script bei meinen ü1000 Variablen komplett ab zu schmiergeln, da ich in dem Script ALLE Geräte überprüfe und durch eine while Schleife jage - vielleicht denke ich auch nur zu kompliziert- keine Ahnung - dafür frage ich ja jetzt euch. :rolleyes:

So. Ich habe im Eingangsbereich eine Signalleuchte die Rot,Grün und Gelb darstellt. Diese ist über einen Schaltaktor mit der HomeMatic und dem IPS verbunden.
Die Farben stellen folgendes dar:
Rot = Alarmanlage scharf
Grün = Alarmanlage unscharf, alle Fenster und Türen geschlossen
Gelb = Alarmanlage unscharf, ein oder mehrere Fenster oder Türen sind geöffnet.

Sinn des ganzen soll sein, das ich weiss wenn ich das Haus verlasse ob alle Fenster und Türen geschlossen sind oder ob irgendwo noch eins geöffnet ist. natürlich sollte die LED automatisch zwischen Grün und Gelb wechseln.

Wenn ich per Knopfdruck auf meinem Funkschlüssel drücke soll die Alarmanlage dann nach 20 Sekunden scharf bzw unscharf gestellt werden, das habe ich soweit aber schon mit einem anderen Script realisiert (ist ja nix wildes.)

Hier mal mein jetziges Script, IPS hängt sich dabei auf, da es einfach zu viel wird.

Alle Fenster und Türen im IPS müssen logischerweise überprüft werden. Sind aber in verschiedenen Kategorien…also lese ich hier alle Variablen aus dem IPS raus, was meiner Meinung nach nen bisl unsinnig ist…?

Danach sucht das Script in jeder ID nach einem Wort, hier STATE (Status des Fensters / der Tür) und überprüft dann ob es geöffnet oder geschlossen ist…
aber seht selbst:

 
 #################################
 ## KONFIGURATION
 ################ 
  ##Status-Variablen der Ampelanzeige:
 $aktor_green = 37651;
 $aktor_yellow = 49603;
 $aktor_red = 51124;
 ####################################################

 ##ID der Zustands-Variable der Alarmanlage
 ##Gibt Wert 1-3 (1=unscharf ,2= unsch. offen ,3=scharf)
 $zustand = 59260  ;
 ####################################################

 #Suchbegriff des Statuses in den Instanzen.
 $suche = "STATE";
 ###################################################

 ###########
 ## ENDE KONFIGURATION DER IDs
 #################################
 
 $objekte = IPS_GetObjectList(); //Alle Variablen-IDs aus dem IPS auslesen

	$Anzahl = count($objekte);
	$i = 0;

    while ($i< $Anzahl)
    {
	   $var2 = (IPS_GetChildrenIDs($var_1[$i]));
	   $wert = IPS_GetObjectIDByName("$suche", $var_1[$i]);
		$vergleich = GetValueBoolean($wert);
	   $i++;

	       if ($vergleich == true)
	       {
	           $bewegung = IPS_GetName(IPS_GetParent($wert));
	           $text[$i] = IPS_GetName(IPS_GetParent($wert));
	       }//if ($vergleich == true)

    }//while ($i < $Anzahl)
	$ausgabe = implode(", ",$text);
print ($ausgabe);



Das Script wird zwar ausgeführt, bei $ausgabe = implode(", ",$text); bekomme ich aber folgenden Fehler:

Warning: implode(): Invalid arguments passed in D:\IP-Symcon\scripts\30499.ips.php on line 73

und…

Warning: Variable #0 existiert nicht in D:\IP-Symcon\scripts\30499.ips.php on line 63

Notice: Undefined variable: text in D:\IP-Symcon\scripts\30499.ips.php on line 73

Hmmm…hast Du mal die maximale Laufzeit für Skripte in der php.ini hochgestellt ?

Ja klar, von 30 auf false, für unendlich. :rolleyes: Script läuft ja auch, habs eben nochmal bisschen editiert!
IPS hängt sich halt auf…und nach ca 90sek kriege ich die ausgabe:

Warning: Variable #0 existiert nicht in D:\IP-Symcon\scripts\30499.ips.php on line 63

Notice: Undefined variable: text in D:\IP-Symcon\scripts\30499.ips.php on line 73

Warning: implode(): Invalid arguments passed in D:\IP-Symcon\scripts\30499.ips.php on line 73

Notice: Undefined variable: text in D:\IP-Symcon\scripts\30499.ips.php on line 73

Hallo Archer,

Du mußt $text noch vor dem Befüllen als array definieren.

$text = array();

Borr…klar. Danke!!! :slight_smile: Immerhin sind die Fehler jetzt schonmal soweit weg.

Aber hat jemand ne Idee wie man das eleganter lösen kann???

Hallo,

wenn Du alle Fenstergriffe über Homematic abfragst, wäre dieser Scriptansatzt vielleicht was.
http://www.ip-symcon.de/forum/f50/fensterzustand-anzeigen-11821/

Hier werden nur HM Devices abgefragt. Also nicht alle Variablen.

An der Haustür hängt bei mir ein Tablet. Dort wird eine HTML-Box angezeigt. In dieser werden alle geöffneten oder gekippten Fenster und Türen der Homematic in verschiedenen Farben angezeigt.

Das mit der LED hatte ich auch mal. Ist aber doof, weil man nicht weiß welches Fenster offen ist. Ich hatte einfach keine Lust mehr, vier Stockwerke nach einem offenem Fenster zusuchen.
Mit dem Tablet sehe ich welches Fenster offen bzw. gekippt ist und kann gezielt dort hin gehen.
In einem zweiten HTML-Box werden Störungen der CCU angezeigt. Zudem noch Aussentemperatur, wegen Klamotten.

Somit habe ich alles auf einem Blick. Android Tablet z.b. Point of View 7" kostet ca. 80 - 90€ NEU.

Gruß
MCS-51

Vorausgesetzt, Du hast alles mit HM und möchtest den Ident STATE abfragen würde ich es so machen.

Von der Performance gefühlt 20 mal schneller als alle Objekte abzufragen und wenn es eh HM ist kommt nichts anderes bei raus.

Berücksichtigt werden Bool und Integer.

<?

foreach(IPS_GetInstanceListByModuleID("{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}") as $ids)
{
   $id = IPS_GetInstance($ids);
   $ident = @IPS_GetObjectIDByIdent("STATE", $id['InstanceID']);
    if($ident !== false)
   {
      $var = IPS_GetVariable($ident);
      //print_r($var);
      $name = IPS_GetObject($var['VariableID']);
      if($var['VariableValue']['ValueType'] == 0)
      echo IPS_GetName($name['ParentID'])." ".(int)$var['VariableValue']['ValueBoolean']."
";
      if($var['VariableValue']['ValueType'] == 1)
      echo IPS_GetName($name['ParentID'])." ".(int)$var['VariableValue']['ValueInteger']."
";
   }
}

?>

Danke für eure Antworten, hab es am Freitag Abend /Gestern Morgen noch selber hinbekommen.
Das Obrige Script hat ne Laufzeit von 29MINUTEN bei mir, hat im Grundansatz aber funktioniert.

In meiner „Version 2“ frage ich jetzt nur die Türkontakte, Fensterkontakte und die Dachhauben ab…

Das Script läuft dann durch eine While-Schleife und überprüft von jedem Gerät den STATUS (geöffnet oder geschlossen) solange, bis diese einen True(=geöffnet) Wer findet, danach wird die Statusleuchte automatisch auf Orange gesetzt. Sind alle False(=geschlossen) wird die LED auf Grün gesetzt.

Werde das Script übermorgen weiter ausbauen und falls Bedarf besteht hier im Forum zur Verfügung stellen…

Edit: Danke RWN! Darf ich deinen Scriptcode in meinen einfügen???

Darf ich deinen Scriptcode in meinen einfügen???
Darfst Du. :wink: Alles was hier im Forum an Scripts rumgeistert, kannst Du ohne nachfragen verwenden, ändern oder was auch immer und auch anderen wieder zur Verfügung stellen. :slight_smile:

Okay, danke! Ich nenne dich (falls ichs veröffentliche und deinen Code bei mir einfüge) in den Copyrights usw. :slight_smile:

:loveips:

Wo ist hier der Fehler?

Die If-Abfrage trifft IMMER zu! Auch wenn einer der 3 Zustandsvariablen auf FALSE, selbst wenn alle 3 auf FALSE stehen!

##Zustandsvariablen (True oder False)
$tuerschloesser = 24182;
$drehgriffkontakte = 45971;
$tuerkontakte = 12260;

##Status-Variablen der Ampelanzeige:
 $aktor_green = 37651;
 $aktor_yellow = 49603;
 $aktor_red = 51124 ;

 ##ID der Zustands-Variable der Alarmanlage
 ##Hat Wert 1-3 (1=unscharf ,2= unsch. offen ,3=scharf)
 $zustand = 59260 ;


if($tuerschloesser == TRUE && $drehgriffkontakte == TRUE && $tuerkontakte == TRUE)
{
   SetValueBoolean($aktor_yellow, FALSE);
   SetValueBoolean($aktor_green, TRUE);
   SetValueInteger($zustand, 1);
}
else
{
   SetValueBoolean($aktor_green, FALSE);
   SetValueBoolean($aktor_yellow, TRUE);
   SetValueInteger($zustand, 2);
}

… da fehlt das GetValue()…

Ups, und sowas passiert MIR wobei ich seit 2Monaten täglich 5-10Stunden am PHP programmieren bin :smiley:

Wobei ich dann nicht verstehe wieso die Abfrage immer zugetroffen hat…naja geht jetzt, vielen Dank! ^^’

Wobei ich dann nicht verstehe wieso die Abfrage immer zugetroffen hat

PHP: Booleans - Manual

Converting to boolean

To explicitly convert a value to boolean, use the (bool) or (boolean) casts. However, in most cases the cast is unncecessary, since a value will be automatically converted if an operator, function or control structure requires a boolean argument.

Siehe auch Typumwandlungen.

Bei der Konvertierung zum Typ boolean gelten die folgenden Werte als FALSE:

boolean FALSE selbst
integer 0 (zero)
float 0.0 (zero)
Der leere string, und der string "0"
Ein array ohne Elemente
Ein object ohne Eigenschaftsvariablen (nur PHP 4)
Der spezielle Typ NULL (inklusive nicht gesetzter Variablen)
SimpleXML Objekte die aus leeren Tags erzeugt wurden.

Jeder andere Wert wird als TRUE angenommen (inklusive jeglicher resource Werte).