Fensterzustand anzeigen

Wer diesen gerne farbig hätte, kann dieses hiermit machen. Nicht die eleganteste Lösung aber anderst geht es im Moment nicht.

Das Script in die Instanz eures Fenster legen. Script ausführen. Trigger auf State bei Variabenaktualisierung.

<?
$object = IPS_GetObject($IPS_SELF);
$parentID = $object['ParentID'];

CreateVariableByName($parentID, "Zustand", 3, "Window", "~HTMLBox", 1);

$state = GetValue(IPS_GetVariableIDByName("STATE", $parentID));
$status = IPS_GetVariableIDByName("Zustand", $parentID);

switch($state)
{
    case 0:
    //IPS_SetIcon($status, "Fenster1_32");
    SetValue($status, "<table width='100%'><tr bgcolor=#004000><td align='center'>Geschlossen</td></tr></table>");
    //WFC_Reload(43661 /*[WebFront Configurator]*/);
    break;

    case 1:
    //IPS_SetIcon($status, "Fenster1 Gekippt_32");
    SetValue($status, "<table width='100%'><tr bgcolor=#c08800><td align='center'>Gekippt</td></tr></table>");
    //WFC_Reload(43661 /*[WebFront Configurator]*/);
    break;

    case 2:
    //IPS_SetIcon($status, "Fenster1 Offen_32");
   SetValue($status, "<table width='100%'><tr bgcolor=#800000><td align='center'>Offen</td></tr></table>");
   //WFC_Reload(43661 /*[WebFront Configurator]*/);
   break;
}

function CreateVariableByName($id, $name, $type, $icon, $profil, $pos)
{
  global $IPS_SELF;
  $vid = @IPS_GetVariableIDByName($name, $id);
  if($vid === false)
  {
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetPosition($vid, $pos);
        IPS_SetIcon($vid, $icon);
        IPS_SetVariableCustomProfile($vid, $profil);
      IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
  }
  return $vid;
}
?>

Für die die es gerne Bunt haben.

<?
$str = "<table width='100%' border='0' align='center'>";
$str .= "<tr bgcolor=#505050><td align='center'><b>Raum</b></td><td align='center'><b>Typ</b></td><td align='center'><b>Status</b></td></tr>";
foreach(IPS_GetInstanceListByModuleID("{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}") as $id)
{
   if(IPS_StatusVariableExists($id, "STATE"))
    {
        $var = IPS_GetStatusVariable($id, "STATE");
        // Integer Variable
        if($var['VariableType'] == 1)
        {
             if(@IPS_GetEventIDByName("Event".$var['VariableID'], $IPS_SELF) === false)
            {
                  $ereignis = IPS_CreateEvent(0);
                  IPS_SetEventTrigger($ereignis, 1, $var['VariableID']);
                  IPS_SetParent($ereignis, $IPS_SELF);
                  IPS_SetName($ereignis, "Event".$var['VariableID']);
                  IPS_SetEventActive($ereignis, true);
            }
            $value = GetValue($var['VariableID']);
            switch($value)
            {
               case 0:
               $value = "geschlossen";
               $color = "#00FF00";
               break;
               case 1:
               $value = "gekippt";
               $color = "#FFFF00";
               break;
               case 2:
               $value = "geöffnet";
               $color = "#FF0000";
               break;
            }
            $name = IPS_GetObject($var['VariableID']);
            $str .="<tr bgcolor=$color><td align='center'><font color=#000000>".IPS_GetName(IPS_GetParent($name['ParentID']))."</td><td align='center'><font color=#000000>".IPS_GetName($name['ParentID'])."</td><td align='center'><font color=#000000>".$value."</td></tr>";
        }
    }
}
$str .= "</table>";
SetValue(23619 /*[HomeMatic	est\Fensterstatus\Sensor]*/ , $str);

?>

Hallo zusammen,

ein positiver Nebeneffekt dieses Skriptes ist, dass wesentlich mehr Fenster (Variablentyp 1 - Integer - in das Script eintragen) und Türen (Variablentyp 0 - Boolean - eintragen) auf wesentlich weniger Raum und vor allen Dingen farbig angezeigt werden können.
Damit ist noch leichter und ohne Scrollen ein nicht gewollter Zustand bei einer hohen Anzahl von Fensteraktoren erkennbar.

DANKE !

Gruss
B71

jawoll… gefällt mir auch sehr :wink:

…wie kann man in dem Script sicherstellen, dass Räume zusammen angezeigt werden ?

Mein Schlafzimmer ist bei dem Script Ergebnis zerrissen… kann man das via Sortierung anpassen ?

Und noch eine Frage an @ Horst oder @ Paresy: Welche HEX Farbe nutzt Ihr im Webfront für ROT und GRÜN ?

Und das es so schön ist hier noch eine Frage: Türkontakte und Rauchmelder haben beiden eine boolean STATE Variable und tauchen dann bei einer Boolean Abfrage in einer Tabelle auf. Sowas kann man nicht irgendwie trennen, oder ?

Gruss
B71

Hallo zusammen,

nun habe ich mir gedacht ich frage mal meine FS20 RSU über das Script ab und habe es wie folgt angepasst:

<?
$str = "<table width='100%' border='0' align='center'>";
$str .= "<tr bgcolor=#505050><td align='center'><b>Raum</b></td><td align='center'><b>Typ</b></td><td align='center'><b>Status</b></td></tr>";
foreach(IPS_GetInstanceListByModuleID("{542CC907-CA63-4E7A-A8C7-92F74639FA4C}") as $id)
{
   if(IPS_StatusVariableExists($id, "Position"))
    {
        $var = IPS_GetStatusVariable($id, "Position");
        // Integer Variable
        if($var['VariableType'] == 1)
        {
             if(@IPS_GetEventIDByName("Event".$var['VariableID'], $IPS_SELF) === false)
            {
                  $ereignis = IPS_CreateEvent(0);
                  IPS_SetEventTrigger($ereignis, 1, $var['VariableID']);
                  IPS_SetParent($ereignis, $IPS_SELF);
                  IPS_SetName($ereignis, "Event".$var['VariableID']);
                  IPS_SetEventActive($ereignis, true);
            }
            $value = GetValue($var['VariableID']);
            switch($value)
            {
               case 0:
               $value = "0";
               $color = "#CD3700";
               break;
               case 1:
               $value = "100";
               $color = "#32CD32";
               break;
            }
            $name = IPS_GetObject($var['VariableID']);
            $str .="<tr bgcolor=$color><td align='center'><font color=#000000>".IPS_GetName(IPS_GetParent($name['ParentID']))."</td><td align='center'><font color=#000000>".IPS_GetName($name['ParentID'])."</td><td align='center'><font color=#000000>".$value."</td></tr>";
        }
    }
}
$str .= "</table>";
SetValue(14125 /*[Rolladenstatus\Rolladenstatus]*/ , $str);

?>

Die Events meiner Rolläden werden auch angelegt, der Header der Tabelle erscheint, aber die Aktorenstati werden nicht in die Liste geparst.

Irgendwo habe ich wieder nen Denkfehler drin und stehe auf dem Schlauch.

Die ID für FS20 ist gepflegt, die Variable auf Position geändert nur die Case Auswertung macht mir wohl einen Strich durch die Rechnung.

Die Positions Variablen sind alle Integer und werden mittels Shutter Variablenprofil mit % als Suffix angezeigt.

Erstmal wäre 0 und 100% interessant in der Liste angezeigt zu werden. Das dazwischen ist sicherlich wieder PHP Profileague…

Irgendein Tip ?

Gruss
B71

Das ist ganz einfach, das ist für Homematic und nicht für FS20. Wenn Du das für FS20 nutzen willst musst Du die InstanzModule ändern und eventuell noch ein paar Kleinigkeiten anpassen.

Hallo Rainer,
habe ich doch schon nach bestem Wissen gemacht…
Daher ja die Frage wo der Bug liegt…das Script muss doch universell verwendbar sein da ich keine HM spezifischen Befehle sehe oder bin ich blind.
Gruss
b71

Edit:
Habe den Denkfehler gefunden. Ich versuche auf die Positionsvariable des Shuttermoduls das Script laufen zu lassen.
Da FS20 keine Variable dieser Art hat ist dies also nicht von Erfolg gekrönt gewesen. Aber auch mit der ID vom Shuttercontrol lässt sich das Script nicht zur freundlichen Mitarbeit bewegen…nun gut…kurz: Es lebe Homematic :slight_smile:

ich habe die Liste noch mal angepasst so dass sie sich besser in das Webfront integriert.

<?
$bordercolor = "#505050"; // Rahmenfarbe anpassen

$str = "<table width='100%' cellspacing='0'>";

foreach(IPS_GetInstanceListByModuleID("{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}") as $id)
{
   if(IPS_StatusVariableExists($id, "STATE"))
    {
        $var = IPS_GetStatusVariable($id, "STATE");
        // Integer Variable
        if($var['VariableType'] == 1)
        {
             if(@IPS_GetEventIDByName("Event".$var['VariableID'], $IPS_SELF) === false)
            {
                  $ereignis = IPS_CreateEvent(0);
                  IPS_SetEventTrigger($ereignis, 1, $var['VariableID']);
                  IPS_SetParent($ereignis, $IPS_SELF);
                  IPS_SetName($ereignis, "Event".$var['VariableID']);
                  IPS_SetEventActive($ereignis, true);
            }
            switch(GetValue($var['VariableID']))
            {
               case 0:
               $value = "<td style='border:1px solid $bordercolor;' align='center' bgcolor=#004000>geschlossen</td>";
               break;
               case 1:
               $value = "<td style='border:1px solid $bordercolor;' align='center' bgcolor='#C08800'>gekippt</td>";
               break;
               case 2:
               $value = "<td style='border:1px solid $bordercolor;' align='center' bgcolor=#800000>geöffnet</td>";
               break;
            }
            $name = IPS_GetObject($var['VariableID']);
            $str .= "<tr height='38px'><td style='border:1px solid $bordercolor;' bgcolor=#27292B width='84%'>&nbsp&nbsp".IPS_GetName(IPS_GetParent($name['ParentID']))." ".IPS_GetName($name['ParentID'])."</td>".$value."</tr>";
        }
    }
}
$str .= "</table>";
SetValue(29445 /*[Homematic\Sensoren\Content]*/, $str);

?>

ich arbeite gerade in einer ähnlichen Richtung. Passt nicht direkt zu den Fensterkontakten, kann aber sicher auch dafür eingesetzt werden.

Analog dem Script von Rainer, mag ich es auch immer flexibel.

So hab ich mir eine Dummy Instanz als Übersicht für die Geschosse angelegt. Diese beinhaltet eine Statusvariable bzw. Links zu allen zu überwachenden Lampenvariablen. Ein zentrales Script derzeitig updated die Sichtbarkeit der Links. Denn in der Übersicht interessieren nur die eingeschalteten Lampen. Vorteil an dem Link ist, das man in der Übersicht noch steuern kann.

In dem Thread hier würden ja eigentlich auch nur die offenen Fenster von Interesse sein. Vielleicht wäre mein Script abgewandelt ja auch was für die Fensterkontakte.

Aufrufscript unter der Dummy Variable


<?
 include "CheckLights.ips.php";
 
 // aufruf der funktion
 // liest aud dem ¸bergebenen aktor die untergeordneten links und wertet deren Status aus
 // dazu muss unter einem dummy aktor eine vielzahl von links auf die Lampen Variable angelegt werden
 // durch ein und ausblenden wird signalisiert welche lampen noch eingeschaltet werden
 // in einer weiteren variable wird als text angezeigt wieviel lampen noch eingeschaltet sind
 //
 // Übergabe 
 // $PV_IPS_SELF  -
 // $PV_ALLE_VARIABLE

 $PV_IPS_SELF=$IPS_SELF;
 $PV_ALLE_VARIABLE=59700 /*[EG\Eingeschaltete Lampen im EG\Alle]*/;

 updateCheckLights($PV_IPS_SELF, $PV_ALLE_VARIABLE)
?>

Zentrales Script „CheckLights.ips.php“


<?

 // diese funktion liest aud dem übergebenen aktor die untergeordneten links und wertet deren Status aus
 // dazu muss unter einem dummy aktor eine vielzahl von links auf die Lampen Variable angelegt werden
 // durch ein und ausblenden wird signalisiert welche lampen noch eingeschaltet werden
 // in einer weiteren variable wird als text angezeigt wieviel lampen noch eingeschaltet sind
 //
 // übergabe der function
 // $PV_IPS_SELF  -
 // $PV_ALLE_VARIABLE

 function updateCheckLights($PV_IPS_SELF, $PV_ALLE_VARIABLE)
 {
   //echo "start für Aktor ".$PV_IPS_SELF." und Variablenupdate in ".$PV_ALLE_VARIABLE;
	$objectIDs = IPS_GetChildrenIDs(IPS_GetParent($PV_IPS_SELF));

	$anzahlLampenEin=0;

	foreach($objectIDs as $singleID)
	{
	   if (IPS_LinkExists($singleID))
	   {
	      // ist ein Link
	      // original lampen variable  suchen
	      $linkInfo = IPS_GetLink($singleID);
			$originalID = $linkInfo["LinkChildID"];

			// lampen prüfung ob eingeschaltet
			//typ ist integer bei dimmer und geschalteten (boolean)
			if (gettype($originalID)=="integer")
			{  // dimmer oder geschaltet
			   // alles was nicht =0 ist, ist eingeschaltet

				if (getValue($originalID)>0)
				{  // eingeschaltet, dann sichtbar
				   IPS_SetHidden($singleID, false); 			//Objekt sichtbar
				   $anzahlLampenEin=$anzahlLampenEin+1;      // zähler eingeschaltete lampen erhöhen
				   //echo ($singleID." einblenden mit wert=".getValue($originalID)."
");
				}
				else
				{  // ausgeschaltet, dann ausblenden
				 	IPS_SetHidden($singleID, true); //Objekt verstecken
				 	//echo ($singleID." ausblenden mit wert=".getValue($originalID)."
");
				}
			}
		}

		// text für die variable (alle lampen setzen), leer lassen wenn keine lampe an
		if ($anzahlLampenEin==0)
		{
			setValue($PV_ALLE_VARIABLE,"keine");
		}
		else
		{
		   setValue($PV_ALLE_VARIABLE,$anzahlLampenEin." An");
		}


		// webfront aktualisieren
		// das WF sollte eigentlich nur die aktive seite refeshen
		// WFC_Reload(21641 /*[WebFront Configurator]*/);
	}
 }

?>

Hallo Rainer,

wie immer, hervorragende Arbeit.

Habe es für die Anfänger noch ein wenig ergänzt.

Skript einfach in eine Kategorie seiner Wahl ablegen und einmal starten.

Variable mit entsprechenden Profil wird automatisch angelegt und das Skript gleich versteckt, ansonsten ist es im Webfront sichtbar. Gleichzeitig wird noch das Standard-Window-Icon auf die Variable gelegt.

<?
if($IPS_SENDER = 'Execute') {
 IPS_SetHidden($IPS_SELF, true);
}
$parentID = IPS_GetObject($IPS_SELF);
$parentID = $parentID['ParentID'];
$ausgabe    = CreateVariableByName($parentID, "Fenstergriffe", "HMTL");
$bordercolor = "#505050"; // Rahmenfarbe anpassen
$str = "<table width='100%' cellspacing='0'>";
foreach(IPS_GetInstanceListByModuleID("{EE4A81C6-5C90-4DB7-AD2F-F6BBD521412E}") as $id)
{
   if(IPS_StatusVariableExists($id, "STATE"))
    {
        $var = IPS_GetStatusVariable($id, "STATE");
        // Integer Variable
        if($var['VariableType'] == 1)
        {
             if(@IPS_GetEventIDByName("Event".$var['VariableID'], $IPS_SELF) === false)
            {
                  $ereignis = IPS_CreateEvent(0);
                  IPS_SetEventTrigger($ereignis, 1, $var['VariableID']);
                  IPS_SetParent($ereignis, $IPS_SELF);
                  IPS_SetName($ereignis, "Event".$var['VariableID']);
                  IPS_SetEventActive($ereignis, true);
            }
            switch(GetValue($var['VariableID']))
            {
               case 0:
               $value = "<td style='border:1px solid $bordercolor;' align='center' bgcolor=#004000>geschlossen</td>";
               break;
               case 1:
               $value = "<td style='border:1px solid $bordercolor;' align='center' bgcolor='#C08800'>gekippt</td>";
               break;
               case 2:
               $value = "<td style='border:1px solid $bordercolor;' align='center' bgcolor=#800000>geöffnet</td>";
               break;
            }
            $name = IPS_GetObject($var['VariableID']);
            $str .= "<tr height='38px'><td style='border:1px solid $bordercolor;' bgcolor=#27292B width='84%'>".IPS_GetName(IPS_GetParent($name['ParentID']))." ".IPS_GetName($name['ParentID'])."</td>".$value."</tr>";
        }
    }
}
$str .= "</table>";
SetValue($ausgabe, $str);
function CreateVariableByName($id, $name, $type)
 {
 global $IPS_SELF;
 global $ScriptID;
 $vid = @IPS_GetVariableIDByName($name, $id);
 if($vid === false) {
  $vartype = 3;
      if ($type == 'HTML')  $vartype = 3;
  $vid = IPS_CreateVariable($vartype);
  IPS_SetParent($vid, $id);
  IPS_SetName($vid, $name);
  IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
  IPS_SetVariableCustomProfile ($vid, "~HTMLBox");
      IPS_SetIcon($vid, "Window");
  IPS_SetPosition($vid, 1);
  echo "Variable $name mit ID $vid angelegt
";
  }
return $vid;
}
?>

Das ist klasse. Dank euch.

Gelb im Webfrontdesign…na wenn das mal nicht was geniales ist…

Ist schon cool was Ihr immer so herauszaubert…

Habe gerade die Anzeige auch noch für die Türkontakte (Variablentyp = 0) angepasst und auch das rennt sofort.

Jetzt müsste man nur noch die Rauchmelder AN/AUS schalten können wenn das Script die Türkontakte einliest. Die haben nämlich das gleiche Variablenprofil und tauchen in dieser Liste dann mit auf.

Gruss
B71

Es basiert ja auch hierauf.

Wie meinst Du das mit ein und ausschalten?

Hallo Rainer,

Mit An und Aus meine ich, dass die Rauchmelder nicht mitgescannt werden und somit nicht in dieser Abfrage der Türen mit auftauchen.

Gruss
Bernd

Ok, Haben die Rauchmelder einen eindeutigen Namen.

Hallo Community,

das Script zum Auslesen und Darstellen der Drehgriffkontakte ist echt eine gute Idee. Ich finde es nur etwas bedenklich auf Grund der Abfrage des Variablentypes zu entscheiden dass es sich um einen entsprechenden Kontakt handelt. Macht es da nicht langfristig mehr Sinn sich so einen Art „DeviceClass“ Variable einzuführen welche die Art des Gerätes kennzeichnet (z.B.: TF für Türfensterkontakt oder DGK für Drehgriffkontakt oder RM für Rauchmelder). Damit kann dann auch sicher abgefragt werden um welchen Typ von Gerät es sich handelt.

Das würde ich von der softwaretechnischen Betrachtung erheblich sauberer finden.

Ich finde eure Lösung sehr schick leider habe ich kein HM könntet ihr eine Version bauen die das mit Links macht?? oder ist das sehr aufwändig.
MFG Ken

Hallo Rainer,
Soweit ich das beurteilen kann haben die Rauchmelder keinen eindeutigen Namen.

Daher wird es wohl schweirig.

Einen habe ich noch.
Im iFront wird die Schrift blau.
An welcher Stelle muss man das ändern um weiss zu erlangen?

Gruss
B71

Die ganze Schrift die jetzt weiss ist wird blau :confused: funktioniert bei dem komischen Appledingens überhaupt was. Probier es mal mit Fontcolor.