MY_Nützliche Funktionen

Moin,

bestimmt haben sich schon viele eine Funktion geschrieben, die viele Dinge oder komplizierte Programmieranwendungen erleichert. Auch ich habe das gemacht und möchte hiermit einfach meine Funktionen zur freien Verfügung stellen.

Einige mögen zwar aus dem Kontext gerissen sein, das möge mir man aber verzeihen. Andere sind einfach aufgrund des Programmierflusses entstanden, um bestimmte komplizierte Konstellationen nicht erneut nachlesen zu müssen.

Ich habe alle diese Funktionen in einer Datei, die ich in den meisten meiner Script include um somit auf meinen erweiterten Funktionsumfang zurückzugreifen (Kommunikation mit der Homematic CCU usw…)


<?
/****************************************************************************
 *
 *  name:        send_mail($tomail, $subject, $message);
 *
 *  description: Send an email
 *
 ***************************************************************************/
function send_mail($tomail, $subject, $message)
{
   ini_set('SMTP', "<mailserver>");

   $message .= "
--------------------------------------------------------------
" .
               "[ IP-Symcon @ <hostname> ]

";

   $headers  = "MIME-Version: 1.0";
   $headers .= "Content-type: text/plain; charset=iso-8859-1
";
   $headers .= "From: IP-Symcon <noreply@<domain>>
";

   mail($tomail,"<IP-Symcon> $subject", $message, $headers);
}

/***************************************************************************
* Function: MY_GetDevicesFromCategory
* Description: Diese Funktion ermittelt alle Links, die in einer Kategorie
*              bestehen. Kategorien werden im ROOT-Baum unter der
*              Sub-Kategorie "Geräte Kategorien" angelegt.
*              Dort besteht nun die Möglichkeit Devices in bestimmte
*              Kategorien zusammenzufassen.
*              Beispiel: Geräte Kategorien\Rolläden
*
*              Die Kategorie besteht aus Links zu den entsprechenden
*
*              Wird diese Funktion mit der Kategorie als Parameter
*              aufgerufen, werden alle Links innerhalb der Kategorie
*              abgearbeitet und die richtigen IDs der Geräte als Array
*              zurückgegeben. Im Fehlerfall gibt die Funktion FALSE zurück.
*
* Parameter: - $category (Kategoriename)
* Return: - Array aus IDs von Geräten der Kategorie
*         - Im Fehlerfall: FALSE
*
***************************************************************************/
function MY_GetDevicesFromCategory($category)
{
	$device_cat = "";
	$cats = IPS_GetCategoryList();
	foreach ( $cats as $cat )
	{
	   if ( @IPS_GetName($cat) == "Geräte Kategorien" )
	      $device_cat = $cat;
	}

	if ( $device_cat != "" )
	{
		$found = 0;
	   foreach ( IPS_GetChildrenIDs($device_cat) as $item )
	   {
	      if ( IPS_GetName($item) == $category )
	      {
				$found = 1;
	         $device_links = IPS_GetChildrenIDs($item);

	         $devices = array();
	         foreach ( $device_links as $device_link )
	         {
	            $link = IPS_GetLink($device_link);
               array_push($devices, $link['LinkChildID']);
	         }
				return $devices;
	      }
	   }
	   if ( $found == 0 )
	      return false;
	} else
	   return false;
}

/***************************************************************************
* Function: MY_GetHMDeviceID
* Description: Diese Funktion gibt die IPS-ID des angegebenen Gerätes
*              (Instanz) zurück. Gesucht wird diese Instanz im Baum
*              der "Homematic Devices".
*
* Parameter: - $devicename (Gerätename)
* Return: - IPS-ID des Gerätes
*
***************************************************************************/
function MY_GetHMDeviceID($devicename)
{
	$result = false;
	$module_id = "";

	$modules = IPS_GetModuleList();
	foreach ( $modules as $item )
	{
		$module = IPS_GetModule($item);

		if ( $module['ModuleName'] == "HomeMatic Device" )
			$module_id = $module['ModuleID'];
	}
	if ( $module_id == "" )
	   return false;
	   
	$instances = IPS_GetInstanceListByModuleID($module_id);
	foreach ( $instances as $item )
	{
	   if ( IPS_GetName($item) == $devicename )
			$result = $item;
	}
	return $result;
}

/***************************************************************************
* Function: MY_CheckButtonPressed
* Description: Diese Funktion überprüft die $IPS_VARIABLE ob eine bestimmte
*              Taste an einer Fernbedienung gedrückt wurde. Es wird nach
*              dem Vergleich entweder TRUE (positiv) oder FALSE (negativ)
*              zurückgegeben. Zusätzlich überprüft die Funktion, ob bei der
*              Variablen der Taste bereits eine SCRIPT_ACTIVE Variable existiert
*              und ob diese auf TRUE steht. Falls dort ein TRUE Wert vorhanden
*              ist, gibt die Funktion FALSE zurück.
*
* Parameter: - $ips_var (IPS-Variable)
* Return: - TRUE oder FALSE bei positivem bzw. negativem Ergebnis
*
***************************************************************************/
function MY_CheckButtonPressed($ips_var, $name, $mode)
{
	$btn_mode = IPS_GetName($ips_var);
	$var = IPS_GetObject($ips_var);
	$btn_name = IPS_GetName($var['ParentID']);

	// First check the SCRIPT_ACTIVE variable exists for this button
   $varid = @IPS_GetVariableIDByName("SCRIPT_ACTIVE", $ips_var);
   if ( $varid == 0 )
   {
		// The variable didn't exist. Create it!
	   $varid = IPS_CreateVariable(0);
	   IPS_SetName($varid, "SCRIPT_ACTIVE");
	   IPS_SetParent($varid, $ips_var);
	} else
	{
		// If the variable already exists return false if the script is
		// already running (variable is set to true)
	   if ( GetValueBoolean($varid) == true )
	      return false;
	}

	// Now we have to check if the buttons match ($name, $mode)
	if ( $btn_name == $name )
	{
		if ( $btn_mode == $mode )
		   return true;
		else
		   return false;
	} else
	   return false;
}

/***************************************************************************
* Function: MY_ObjectVariable
* Description: Diese Funktion gibt den Wert einer Variablen eines Objektes
*              zurück. Zum Beispiel den Wert MOTION des Devices PIRI.
*
* Parameter: - $objid (ObjektID)
*            - $variable (Name der Variablen)
* Return: - Wert der Variablen
*
***************************************************************************/
function MY_GetObjectVariable($objid, $variable)
{
	$obj = IPS_GetObject($objid);

	foreach ( $obj['ChildrenIDs'] as $item )
	{
	   if ( IPS_GetName($item) == $variable )
	   {
			return GetValue($item);
	   }
	}
	return null;
}

/***************************************************************************
* Function: MY_SetObjectVariable
* Description: Diese Funktion setzt den Wert einer Variablen eines Objektes.
*              Zum Beispiel den Wert STATUS eines Schaltaktors.
*
* Parameter: - $objid (ObjektID)
*            - $variable (Name der Variablen)
*            - $value (zu setzender Wert)
* Return: -
*
***************************************************************************/
function MY_SetObjectVariable($objid, $variable, $value)
{
	$obj = IPS_GetObject($objid);

	foreach ( $obj['ChildrenIDs'] as $item )
	{
	   if ( IPS_GetName($item) == $variable )
	   {
			return SetValue($item, $value);
	   }
	}
	return null;
}

/***************************************************************************
* Function: MY_ObjectVariableExists
* Description: Diese Funktion überprüft ob die angegebene Variable
*              eines Objektes existiert.
*
* Parameter: - $objid (ObjektID)
*            - $variable (Name der Variablen)
* Return: - TRUE (Variable existiert)
*         - FALSE (Variable existiert nicht)
*
***************************************************************************/
function MY_ObjectVariableExists($objid, $variable)
{
	$obj = IPS_GetObject($objid);

	foreach ( $obj['ChildrenIDs'] as $item )
	{
	   if ( IPS_GetName($item) == $variable )
	   {
			return true;
	   }
	}
	return false;
}

/***************************************************************************
* Function: MY_SetBtnScriptStatus
* Description: Setzt die SCRIPT_ACTIVE Variable einer Button-Variablen
*              auf TRUE oder FALSE. Somit kann durch andere Script überprüft
*              werden, ob bereits eine Aktion durch einen vorangegangenen
*              Tastendruck läuft.
*
* Parameter: - $ips_var (IPS-VARIABLE)
*            - $status (Status der gesetzt werden soll; TRUE / FALSE)
* Return: - TRUE / FALSE (Hat die Wertezuweisung geklappt?)
*
***************************************************************************/
function MY_SetBtnScriptStatus($ips_var, $status)
{
   $varid = @IPS_GetVariableIDByName("SCRIPT_ACTIVE", $ips_var);
   
   if ( $varid == 0 )
   {
	   $varid = IPS_CreateVariable(0);
	   IPS_SetName($varid, "SCRIPT_ACTIVE");
	   IPS_SetParent($varid, $ips_var);
	   return SetValueBoolean($varid, $status);
	} else
	{
	   return SetValueBoolean($varid, $status);
	}
}

/***************************************************************************
* Function: MY_GetParentID
* Description: Liefert die ParentID eines Objektes zurück
*
* Parameter: - $item (Objekt)
* Return: - ParentID des Objektes
*
***************************************************************************/
function MY_GetParentID($item)
{
	$obj = IPS_GetObject($item);
	return $obj['ParentID'];
}

/***************************************************************************
* Function: MY_ShowMessageOnFB
* Description: Auf der angegebenen Fernbedienung wird ein Text (Laufschrift
*					falls Überlänge) angezeigt und (falls benötigt) ein zusätzliches
*					spezielles Zeichen, welches die Fernbedienung (FB19) unterstützt.
*
* Parameter: - $id (ID der Fernbedienung Instanz)
*            - $text (Text der auf der FB ausgegeben werden soll)
*            - $special (Spezielles Zeichen wie z.B. ARROW_DOWN)
*
***************************************************************************/
function MY_HMShowMessageOnFB19($display_id, $text, $times, $modes)
{
	// Check if the FB is ready to work with us
	if (! MY_GetObjectVariable($display_id, "SCRIPT_ACTIVE") )
	{
		MY_SetObjectVariable($display_id, "SCRIPT_ACTIVE", true);
		// Loop to show the message N times
		for ( $j = 1; $j <= $times; $j++ )
		{
	     	$display = "";
			$c = 0;

			// Loop of all characters within the "text", to create and cut
			// the display text
			for ( $i = 0; $i < strlen($text); $i++ )
			{
				if ( $text[$i] != ":" )
				{
					$display .= $text[$i];
					$c++;
				}

				// Show the message if 5 characters reached, if we got the end of the
				// text or if we have a ":" within this part of the text
				if ( $c == 5 || $i == strlen($text)-1 ||
					( $text[$i] == ":" && $c > 0 ) )
				{
					// Now we have to check the modes we have to use
					if ( $modes != "" )
					{
						$modes_arr = explode("|", $modes);
						foreach ($modes_arr as $item )
						{
							list( $function, $value ) = explode("=", $item);
							if ( $function == "UNIT" || $function == "BEEP" ||
								$function == "BACKLIGHT" )
							{
							   HM_WriteValueString($display_id, $function, $value);
							   echo "HM_WriteValueString($display_id, $function, $value)
";
							} else
							{
								if ( $value == "true" )
							   	HM_WriteValueBoolean($display_id, $function, true);
								else
								   HM_WriteValueBoolean($display_id, $function, false);
							}
						}
					}
               HM_WriteValueString($display_id, "TEXT", $display);
					HM_WriteValueBoolean($display_id, "SUBMIT", true);

					IPS_Sleep(2000);
				   $display = "";
				   $c = 0;
				}
			}
		}
	}
	MY_SetObjectVariable($display_id, "SCRIPT_ACTIVE", false);
}

/***************************************************************************
* Function: MY_GetCatergoryIDByName
* Description: Liefert die ID einer angegebenen Kategorie zurück. Sollte die
*              Kategorie nicht existieren wird sie angelegt. Es muß
*              das ROOT-Verzeichnis angegeben werden, in der sich die Kategorie
*              befinden soll.
*
* Parameter: - $name (Name der Kategorie)
*            - $root_cat (Root-Verzeichnis in der sich die Kategorie befindet)
*
***************************************************************************/
function MY_GetCatergoryIDByName($name, $root_cat)
{
   $catid = @IPS_GetCategoryIDByName($name, $root_cat);
   if ( $catid == 0 )
	{
		$catid = IPS_CreateCategory();
		IPS_SetName($catid, $name);
		IPS_SetParent($catid, $root_cat);
	}
	return $catid;
}

/***************************************************************************
* Function: MY_BoolToInt
* Description: Wandelt einen Boolean-Wert in Integer um.
*              TRUE = 1
*              FALSE = 0
*
* Parameter: - $var (Boolean Wert)
*
***************************************************************************/
function MY_BoolToInt($var)
{
	if ( $var == true )
	   return 1;
	else
	   return 0;
}

/***************************************************************************
* Function: MY_IntToBool
* Description: Wandelt einen Integer-Wert in Boolean um.
*              1 = TRUE
*              0 = FALSE
*
* Parameter: - $var (Integer Wert)
*
***************************************************************************/
function MY_IntToBool($var)
{
	if ( $var == 0 )
	   return true;
	else
	   return false;
}

/***************************************************************************
* Function: MY_IsDaylight
* Description: Ermittelt ob Tag oder Nacht ist. Wird hauptsächlich
*              genutzt um zentral eine Funktion dafür zu haben und
*              eventuell später Einfluß drauf nehmen zu können.
*              Es muss GETVALUE die ID der Variable übergeben werden,
*              in welcher der Daylight Wert durch ein anderes Script
*              gespeichert wurde.
*
***************************************************************************/
function MY_IsDaylight()
{
	return GetValue(31337 /*[Scripte\Intern\Datum und Uhrzeit\DAYLIGHT]*/);
}

/***************************************************************************
* Function: HMRegaRequest
* Description: Führt einen RAW-Request auf die Homematic CCU aus.
*              Wird benötigt, um nicht von IP-Symcon angebotene Funktionen
*              der CCU zu nutzen. Auch können hiermit Variablen und Parameter
*              der CCU ausgelesen werden.
*
* Parameter: - $sdata (Anforderungskommando an die CCU)
*
***************************************************************************/
function HMRegaRequest($sdata)
{
	global $host, $port;
 
	$fp = fsockopen ($host, $port, $errno, $errstr, 30);
	if (!$fp)
		echo "$errstr ($errno)<br />
";
	else
	{
		$st = "POST /tclrega.exe HTTP/1.1
";
		$st = $st . "Content-type: application/x-www-form-urlencoded
";
		$st = $st . "Connection: Close
";
		$st = $st . "Content-length: ". strlen($sdata) ."

";
		fputs($fp,$st.$sdata);
		$st = "";
		$t = fgets($fp,100);
		$st = $st . $t . "
";
		while ($t != "
")
		{
			$t = fgets($fp,100);
		}
		$t = "";
		while (!feof($fp))
		{
			$t .= fgets($fp,10000 /*[Objekt #10000 existiert nicht]*/);
		}
		fclose($fp);
	}
	$xml = new SimpleXMLElement(utf8_encode($t));
	return utf8_decode($xml->result);
}

/***************************************************************************
* Function: HMGetServiceMessages
* Description: Liefert alle Service-Meldungen der CCU zurück.
*
***************************************************************************/
function HMGetServiceMessages()
{
   $cmd = sprintf("var result = dom.GetObject(\"Root Service Messages\").EnumUsedIDs();");
   $result = HMRegaRequest($cmd);

   $ids = array();
   $ids = split("	", $result);

   $resultarray = array(array());

   $i = 0;
   foreach ( $ids as $item )
   {
      $cmd = "var result = dom.GetObject($item).IsTypeOf(OT_ALARMDP);";
      $result = HMRegaRequest($cmd);

      if ( $result == "true" )
      {
         $cmd = "var result = dom.GetObject($item).AlState();";
         $result = HMRegaRequest($cmd);

         // Current alarm
         if ( $result == "1" )
         {
            $resultarray[$i]['id'] = $item;

            $cmd = "var result = dom.GetObject($item).Name();";
            $result = HMRegaRequest($cmd);
            $resultarray[$i]['name'] = $result;

            $cmd = "var result = dom.GetObject($item).AlOccurrenceTime();";
            $result = HMRegaRequest($cmd);
            $resultarray[$i]['time'] = $result;

            $errormsg = "";
            if ( preg_match("/\.STICKY_UNREACH$/", $resultarray[$i]['name']) )
               $errormsg = "Gerätekommunikation war gestört";
            if ( preg_match("/\.UNREACH$/", $resultarray[$i]['name']) )
               $errormsg = "Gerätekommunikation aktuell gestört";

            $device = preg_replace("/(^AL-)|(\..*)/", "", $resultarray[$i]['name']);

            if ( $errormsg == "" )
               $errormsg = preg_replace("/.*\./", "", $resultarray[$i]['name']);

            $resultarray[$i]['device']   = $device;
            $resultarray[$i]['errormsg'] = $errormsg;

            $i++;
         }
      }
   }
   return $resultarray;
}

/***************************************************************************
* Function: HMGetAlarms
* Description: Liefert alle Alarm-Meldungen der CCU zurück.
*
***************************************************************************/
function HMGetAlarms()
{
   $cmd = sprintf("var result = dom.GetObject(\"Root System Variables\").EnumUsedIDs();");
   $result = HMRegaRequest($cmd);

   $ids = array();
   $ids = split("	", $result);

   $resultarray = array(array());

   $i = 0;
   foreach ( $ids as $item )
   {
      $cmd = "var result = dom.GetObject($item).IsTypeOf(OT_ALARMDP);";
      $result = HMRegaRequest($cmd);

      if ( $result == "true" )
      {
         $cmd = "var result = dom.GetObject($item).AlState();";
         $result = HMRegaRequest($cmd);

         // Current alarm
         if ( $result == "1" )
         {
            $resultarray[$i]['id'] = $item;

            $cmd = "var result = dom.GetObject($item);";
            $result = HMRegaRequest($cmd);
            $resultarray[$i]['name'] = $result;

            $cmd = "var result = dom.GetObject($item).AlOccurrenceTime();";
            $result = HMRegaRequest($cmd);
            $resultarray[$i]['time'] = $result;

            $resultarray[$i]['id'] = $item;
         }
      }
      $i++;
   }
   return $resultarray;
}

Hi saschahb,

Danke :slight_smile: , die Funktionen in Verbindung mit der Homematic CCU sind sehr interessant.

wesseli

Hallo, danke für die scripts, welchen Port muss ich denn angeben fuer request zur CCU ?
Danke und Gruss
Gerhard