Signalstärke von Aktoren ausgeben

Ich habe mal ein kleines Script geschrieben welches die Signalstärke aller Aktoren (in diesem Beispiel mit Eaton xComfort getestet) in einer Tabelle ablegt welche über eine html Box im WF oder ein Memo Feld im Dashboard ausgegeben werden kann.

Es ist nur eine Variable für die html Box anzulegen.

Wenn die Signalstärke eines Aktors unter 40% liegt wird diese Rot hinterlegt.


<?
################# Script zur Ausgabe der Signalstärke von Aktoren ##############

$id_html_box    = 22998 /*[Daten Mobile Clients\Infos\Empfangsqualität\html_box]*/ ;
$search        = 'Signal Quality'; //Bezeichnung der Signalstärke des Aktors
$fiter_1       = 'xComfort'; //bei diesem Wert nichts ausgeben

################################################################################

$ids = IPS_GetObjectList();
$signal_qality_arr = array();

foreach ($ids as $id)
{
    $name = IPS_GetName($id);
    if(stristr($search, $name))
    {
      $id_parent_1    = IPS_GetParent($id);
      $name_1             = IPS_GetName($id_parent_1);

      $id_parent_2    = IPS_GetParent($id_parent_1);
      $name_2             = IPS_GetName($id_parent_2);

      $id_parent_3    = IPS_GetParent($id_parent_2);
      $name_3             = IPS_GetName($id_parent_3);

        if(stristr($name_1, $fiter_1) === FALSE)
        {
         $signal_qality_arr[] = GetValueInteger($id).'|'.$id.'|'.$name_1.'|'.$name_2.'|'.$name_3;
        }
        else
        {
            //Nichts ausgeben
        }
     }
}
sort($signal_qality_arr);

$html= '<style type="text/css">table.sigqal { width: 100%; border-collapse: true;} table.sigqal td';
$html.='{ border: 1px solid #444455; }</style>';
$html.='<table class="sigqal"><tr> ';
$html.='</td></tr><tr><td>';
$html.='Signalstärke<td>ID<td>Aktor<td>Pfad<td>Pfad';

$farbe1 = "<td style='background: #555000;' colspan='1'>";
$farbe2 = "<td style='background: #800000;' colspan='1'>";
        
foreach ($signal_qality_arr as $value)
{
    $html_box = explode("|", $value);

    if($html_box[0] < 40)
    {
        $farbe2 = "<td style='background: #800000;' colspan='1'>";
    }
    else
    {
       $farbe2 = "<td style='background: #100000;' colspan='1'>";
    }
    $html.="<tr>";
    $html.="$farbe2 $html_box[0]%";
    $html.="$farbe1 $html_box[1]";
    $html.="$farbe1 $html_box[2]";
    $html.="$farbe1 $html_box[3]";
    $html.="$farbe1 $html_box[4]";
    $html.="</tr>";
    $html.="<tr>";
}
SetValueString($id_html_box, $html);
?>

das Script kam genau rechtzeitig. Ich wollte gerade anfangen mir ein Script zu schreiben um die Xcomfort Batteriestände anzuzeigen. Dein Script kurz angepasst und schon lief es problemlos.

Dank

Prinzipiell kann es für alle Werte eines Aktors genutzt werden.:wink:

Hallo,

kann man das auch für die Homematic benutzen, wenn ja, was muss ich ändern ?

Danke und Grüsse

Thomas

Da ist das etwas schwerer, geht aber auch:

Was ist die $id_html_box variable, Ich kann nicht herausfinden was das ist oder wo ich das setzen.

Vielleicht kannst du mir dabei helfen.

Danke

Albert

Es ist nur eine Variable für die html Box anzulegen.

Das ist eine Stringvariable mit dem Profil html Box, welche dann im WebFront die Tabelle anzeigt, diese mußt Du einmal anlegen und die entsprechende ID in das Script eintragen.

Danke, ich habe es gefunden, durch ein variable zu machen.

Ins Deutsch es ist manchmal sehr schwierig zu verstehen was man machen soll.

Hallo wie muss ich das machen :
Es ist nur eine Variable für die html Box anzulegen. ???

Ron

am Besten sich zunächst mit Grundlagen vertraut machen, z.B. hier: Konzepte: IP-Symcon :: Automatisierungssoftware

Wenn ich das für die Batterie einstelle ($search = ‚Battery‘:wink: dann ist die niedrigsten Wert am Ende der Tabelle, ohne Farbe.

Was sollte hier anders eingestellt werden?

Albert

Ich schau mir das mal heute abend an.

Schon etwas gefunden?

Albert

Bin schon etwas müde, hier der wichtigste Teil. Wenn Du nicht weiterkommst einfach melden.


foreach ($ids as $id)
{

  	 $name = IPS_GetName($id); //Name des aktuellen Objektes
    if(stristr($search, $name)) //entspricht der Objektname dem des Suchfilters?
    {
      $id_aktor			= IPS_GetParent($id);
      $name_aktor 		= IPS_GetName($id_aktor);

      $id_kategorie_1	= IPS_GetParent($id_aktor);
      $name_kategorie_1	= IPS_GetName($id_kategorie_1);

      $id_kategorie_2	= IPS_GetParent($id_kategorie_1);
      $name_kategorie_2	= IPS_GetName($id_kategorie_2);

		$id_gateway			= IPS_GetInstance($id_aktor)['ConnectionID'];
		$name_gateway		= IPS_GetName($id_gateway);

		if(stristr($name_aktor, $modul) === FALSE)
		{
		   $wert_search   = GetValueInteger($id);
		   if($wert_search <100) $wert_search = '0'.$wert_search;
         $arr[] = $wert_search.' | '.$id.'|'.$name_aktor.'|'.$name_kategorie_1.'|'.$name_kategorie_2.'|'.$name_gateway;
		}
		else
		{
			//Nichts ausgeben
		}
	 }
}

Farbwerte entsprechend anpassen.

Es funktioniert nicht, ich bekomme eine Fehlermeldung über die ConnectionID und $modul. Wo sollten sie angegeben werden?

Albert

Hallon Albert,

ich habe für Dich natürlich einiges im Script angepasst. Ich kenne Deine PHP Kenntnisse ja nicht.
$modul = ‚xComfort‘; (war vorher fiter_1)

Und was mit der ConnectionID?

Ich habe kein PHP kenntnise, ich teste und versuche ob es funktioniert :slight_smile:

Albert

Ich denke am Wochenende komme ich dazu das ganze Script anzupassen, werde versuchen gleich noch FS20 mit einzubinden.

Danke …

Albert


################ Script zur Ausgabe der Batteriestärke von Aktoren #############

$id_html_box    = 23271 /*[WebFront/iFront\Info&Verwaltung\Infos\Empfangsqualität\Signalstärke der Aktoren]*/ ;
$search        = 'Battery'; //Bezeichnung der Batteriestärke des Aktors
$search_2      = 'Batterie'; //Bezeichnung der Batteriestärke des Aktors
$modul          = 'xComfort'; //Name des Moduls
$modul_2          = 'HMS'; //Name des Moduls

################################################################################

$ids = IPS_GetObjectList();
$arr = array();

foreach ($ids as $id)
{

       $name = IPS_GetName($id); //Name des aktuellen Objektes
    if( stristr($search, $name) ) //entspricht der Objektname dem des Suchfilters?
    {
      $id_aktor            = IPS_GetParent($id);
      $name_aktor         = IPS_GetName($id_aktor);

      $id_kategorie_1    = IPS_GetParent($id_aktor);
      $name_kategorie_1    = IPS_GetName($id_kategorie_1);

      $id_kategorie_2    = IPS_GetParent($id_kategorie_1);
      $name_kategorie_2    = IPS_GetName($id_kategorie_2);

        $id_gateway            =  IPS_GetInstanceParentID($id_aktor);
        $name_gateway        = IPS_GetName($id_gateway);

        if(stristr($name_aktor, $modul) === FALSE )
        {
           $wert_search   = GetValueInteger($id);
           if($wert_search <100) $wert_search = '0'.$wert_search;
         $arr[] = $wert_search.' | '.$id.'|'.$name_aktor.'|'.$name_kategorie_1.'|'.$name_kategorie_2.'|'.$name_gateway;
        }
        else
        {
            //Nichts ausgeben
        }
     }
}

foreach ($ids as $id)
{

       $name = IPS_GetName($id); //Name des aktuellen Objektes
    if( stristr($search_2, $name) ) //entspricht der Objektname dem des Suchfilters?
    {
      $id_aktor            = IPS_GetParent($id);
      $name_aktor         = IPS_GetName($id_aktor);

      $id_kategorie_1    = IPS_GetParent($id_aktor);
      $name_kategorie_1    = IPS_GetName($id_kategorie_1);

      $id_kategorie_2    = IPS_GetParent($id_kategorie_1);
      $name_kategorie_2    = IPS_GetName($id_kategorie_2);

        $id_gateway            = IPS_GetInstance($id_aktor)['ConnectionID'];
        $name_gateway        = IPS_GetName($id_gateway);

        if(stristr($name_aktor, $modul_2) === FALSE )
        {
           $wert_search   = GetValueBoolean($id);
           if($wert_search)
            {
                $wert_search = 0;
            }
            else
            {
                $wert_search = 100;
            }
         $arr[] = $wert_search.' | '.$id.'|'.$name_aktor.'|'.$name_kategorie_1.'|'.$name_kategorie_2.'|'.$name_gateway;
        }
        else
        {
            //Nichts ausgeben
        }
     }
}

sort($arr);

$html= '<style type="text/css">table.sigqal { width: 100%; border-collapse: true;} table.sigqal td';
$html.='{ border: 1px solid #444455; }</style>';
$html.='<table class="sigqal"><tr> ';
$html.='</td></tr><tr><td>';
$html.='Signalstärke<td>ID<td>Aktor<td>Pfad<td>Pfad<td>Gateway';

$farbe1 = "<td style='background: #333333;' colspan='1'>";
$farbe2 = "<td style='background: #800000;' colspan='1'>";

$empfang_025 = 0;
$empfang_050 = 0;
$empfang_075 = 0;

foreach ($arr as $value)
{
    $html_box = explode("|", $value);

    if($html_box[0] < 26)
    {
        $farbe2 = "<td style='background: #800000;' colspan='1'>";
    }
    elseif($html_box[0] < 76)
    {
       $farbe2 = "<td style='background: #FFB200;' colspan='1'>";
    }
    else
    {
       $farbe2 = "<td style='background: #00B233;' colspan='1'>";
    }

     $html.="<tr>";
    $html.="$farbe2 $html_box[0]%";
    $html.="$farbe1 $html_box[1]";
    $html.="$farbe1 $html_box[2]";
     $html.="$farbe1 $html_box[3]";
   $html.="$farbe1 $html_box[4]";
   $html.="$farbe1 $html_box[5]";
    $html.="</tr>";
    $html.="<tr>";
}
SetValueString($id_html_box, $html);

Wenn Du FS20 nicht brauchst einfach die zweite foreach Schleife löschen.