Scripte kürzen - HM Komponentenarten "auf einmal" abfragen

Hallo zusammen,

aktuell muss ich, aufgrund meiner limitierten PHP Möglichkeiten, immer einzeln mit der entsprechenden ID und getvalue in den Skripten die Stati von z.B. meinen Fenster-Drehgriffen abfragen, um z.B. Alarmmeldungen zu generieren.

Gibt es eine Möglichkeit eine beliebige Summe von Fenster-Drehgriffen über irgendeinen PHP Trick / eine PHP Abfrage so abzufragen, dass ich Griffe meinem System hinzufügen kann, ohne immer alle Scripte einzeln nachführen zu müssen.

So in der Art Getdevice „Type“ Status in einer PHP Zeile nur für die Instanzen der Fensterkontakte oder nur für Türkontakte usw…

Das würde sicherlich die Skripte um einiges einfacher machen und vor allen Dingen neue Kontakte automatisch mit hinzufügen.

Was sagen die PHP Meister dazu ?

Gruss
B71

Vieleicht meinst Du soetwas?

<?


$Com = 51190 /*[Tools\EDIP\XBee Device-Edip-Wohnz]*/;

$bad        = GetValueInteger(29629 /*[Räume\Fenstergriffe-Hoppe\FG_Badezimmer\Status]*/);
$bueroli    = GetValueInteger(29202 /*[Räume\Fenstergriffe-Hoppe\FG_Buero_Links\Status]*/);
$buerore    = GetValueInteger(33161 /*[Räume\Fenstergriffe-Hoppe\FG_Buero_Rechts\Status]*/);
$dennis     = GetValueInteger(13235 /*[Räume\Fenstergriffe-Hoppe\FG_Dennis\Status]*/);
$essz       = GetValueInteger(45984 /*[Räume\Fenstergriffe-Hoppe\FG_Esszimmer\Status]*/);
$essz1      = GetValueInteger(16670 /*[Räume\Fenstergriffe-Hoppe\FG_Esszimmer_1\Status]*/);
$essz2      = GetValueInteger(59949 /*[Räume\Fenstergriffe-Hoppe\FG_Esszimmer_2\Status]*/);
$gast       = GetValueInteger(42359 /*[Räume\Fenstergriffe-Hoppe\FG_Gastezimmer\Status]*/);
$kammer     = GetValueInteger(58167 /*[Räume\Fenstergriffe-Hoppe\FG_Kammer\Status]*/);
$kueche     = GetValueInteger(49688 /*[Räume\Fenstergriffe-Hoppe\FG_Kueche\Status]*/);
$schlafz    = GetValueInteger(38896 /*[Räume\Fenstergriffe-Hoppe\FG_Schlafzimmer\Status]*/);
$wc         = GetValueInteger(31834 /*[Räume\Fenstergriffe-Hoppe\FG_WC\Status]*/);
$wohnz      = GetValueInteger(54377 /*[Räume\Fenstergriffe-Hoppe\FG_Wohnzimmer\Status]*/);
$wohnz1     = GetValueInteger(57641 /*[Räume\Fenstergriffe-Hoppe\FG_Wohnzimmer_1\Status]*/);
$wohnz2     = GetValueInteger(30447 /*[Räume\Fenstergriffe-Hoppe\FG_Wohnzimmer_2\Status]*/);

$offen = array($bad, $bueroli, $buerore, $dennis, $essz, $essz1, $essz2, $gast, $kammer, $kueche, $schlafz, $wc, $wohnz, $wohnz1, $wohnz2);

//echo $ez." ".$ku." ".$wz_t." ".$wz_f;

if ((in_array("2", $offen)) or (in_array("0", $offen)))
{
   echo "Ein Fenster ist offen"; 
  
}
else
{
   if (in_array("3", $offen)) {
      echo "Ein Fenster ist gekippt"; 
      
   }
   else
   {
      echo "Alle Fenster zu";  
      
   }
}


?>

und von jedem Griff ein Ereignis bei Änderung mit rein packen.

Hallo Bernd,

hiermit hast Du den Zustand von STATE, beim Fenstergriff und Schaltaktor mit VariablenID.

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)
        {
            $value = GetValue($var['VariableID']);
            echo $var['VariableID']." ".$value."
";
        }
        // bool Variable
        if($var['VariableType'] == 0)
        {
            $value = GetValue($var['VariableID']);
            echo $var['VariableID']." ".(int)$value."
";
        }
    }
}

Seht Ihr…man muss nur mal fragen…

Vielen Dank. Ich werde das am Wochenende mal einbauen.
Eines ist sicher…ich werde Fragen haben :smiley:

Gruss
B71

Hier noch eines zur Anzeige im Webfront.
Stringvariable anlegen und ID unten eintragen.

<?
$str = "<table width='100%' border='0' align='center'>";
$str .= "<tr bgcolor=#505050><td><b>&nbsp&nbspRaum</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";
               break;
               case 1:
               $value = "gekippt";
               break;
               case 2:
               $value = "geöffnet";
               break;
            }
            $name = IPS_GetObject($var['VariableID']);
            $str .="<tr bgcolor=#C08800><td>&nbsp&nbsp".IPS_GetName(IPS_GetParent($name['ParentID']))."</td><td align='center'>".IPS_GetName($name['ParentID'])."</td><td align='center'>".$value."</td></tr>";
        }
    }
}
$str .= "</table>";
SetValue(29445, $str);

?>

Hy Rainer,
auch nicht schlecht.

Ups sehe grad wir sind ja hier in HomeMatic.:o

ich habe oben noch den Trigger hinzugefügt. Die Event werden automatisch hinzugefügt bei Variablenänderung.

Damit zeigt er auch Zwischstecker, Unterputzaktoren und noch ein bischen mehr an - leider.

das denk ich mir. :slight_smile: Da wird man noch mal filtern müssen.

setz mal ein print_r($var); und schau mal was der Fensterkontakt(e) ist.

// bool Variable
        if($var['VariableType'] == 0)
        {
            print_r($var);
            $value = GetValue($var['VariableID']);
            echo $var['VariableID']." ".(int)$value."
";
        }

Huch, in falschem Thread gelandet. Sorry.

egal, ist das selbe. :wink:

Was sagt dein print_r ?

Auf Anhieb mal nicht wirklich etwas brauchbares drin (nur ein Auszug):

[VariableHasAction] =&gt; 1
[VariableID] =&gt; 58275
[VariableIdent] =&gt; STATE
[VariableName] =&gt; STATE
[VariablePosition] =&gt; 0
[VariableProfile] =&gt; ~Switch
[VariableType] =&gt; 0
[VariableUseAction] =&gt; 1

Das Variablen-Profil sah erst vielversprechend aus aber er zeigt da nur das Standardprofil an und nicht das welches man selbst zugeordnet hat. Das sehe ich BUG an. Ansonsten wäre die Zuordnung einfach gewesen da ich wegen eigener Icons sowieso eigene Profile angelegt und zugeordnet habe.

probier es mal hiermit, ob es einen Unterschied gibt.

IPS_GetVariableProfile: IP-Symcon :: Automatisierungssoftware

Da kommt so etwas raus:

[Digits] => 1
[Icon] => WindDirection
[IsReadOnly] => 1
[MaxValue] => 360
[MinValue] => 0
[Prefix] =>
[ProfileName] => ~WindDirection
[ProfileType] => 2
[StepSize] => 60
[Suffix] => °

So lange ich nicht irgendwo die Brücke zur passenden Variable schlagen kann kann ich den Profilnamen nicht als Kennzeichen von State auswerten.

Eventuell über das HM-Inventory-Script - da kommen ja auch die Typen der HM-Instanzen raus. Aber da fehlt dann glaube ich wieder die Brücke zu einer IPS-Instanz.

Das wächst sich zu einer Machbarkeitsstudie aus.

Das Variablen-Profil sah erst vielversprechend aus aber er zeigt da nur das Standardprofil an und nicht das welches man selbst zugeordnet hat. Das sehe ich BUG an.

Das sehe ich genauso oder die Beschreibung stimmt nicht. Machst Du einen Bug Report dazu auf.

Als Workaround die 2 Profile vergleichen. Mit IPS_GetVariableprofile zeigt er es nämlich richtig an.

Ok, BUG-Report ist erstellt. Mal sehen was passiert.

Macht wirklich Spaß hier. Danke für Deine Zeit.

jetzt aber, hatte die hälfte vergessen. :confused:

$profID = IPS_GetVariable($var['VariableID']);
        $prof = $profID['VariableCustomProfile'];
        // bool Variable
      if(($var['VariableType'] == 0) && ($prof == "umschalten")) // Profil eintragen
      {

Hallo,

beim Stöbern und Suchen nach Lösungsansätzen für mein nächstes Vorhaben bin ich auf diesen Thread gekommen, der ja schon älter ist, aber für meine Anfrag geeignet scheint.

Nachdem ich meine Fensterkontakte durch ein eiziges Script auswerten und Zustandsänderungen in eine MySql-DB schreiben lasse, möchte ich selbiges mit der HM-Tasterschnittstelle machen.

Dabei bildet das hier http://www.ip-symcon.de/forum/f50/scripte-kuerzen-hm-komponentenarten-einmal-abfragen-11888/#post99036 das Herzstück des Ganzen. Nun gibt es bei den Tastern keine Statusvariable, die sich ändert, sondern nur der Zeitstempel. Lässt sich diese Tasterschnittstelle relativ eindeutig identifizieren? Laut Datenpunkten für HM sind PRESS_SHORT, PRESS_LONG und INSTALL_TEST auch in vielen Geräten vorhanden. Hat da jemand schon was gemacht? Nach einigem Lesen und Probieren finde ich die Möglichkeit, HM-Geräte ähnlicher Natur (Taster, Fernbed., Wandtaster etc.) mit nur einem Script auszuwerten ziemlich genial und effizient.

Hallo zusammen,

kurze Frage, wieso kann ich eigentlich beim Script von Bmwm3 mir zum Schluss den Wert vom Script nicht in einer String Variable ausgeben lassen?

Mit SetValueString(varID,$offen); sagt mir Ips immer:

Wrong parameter type for SetValueString () in [Test] on line 25

Was mache ich hier falsch? Den Wert vom Script spukt er mir ja aus aber ich will es aber in der variable angezeigt bekommen.

Gruss